ドットの円と楕円のサンプル
まず、円を描画するアルゴリズムを調べました。すると英語版WikipediaにJavaScriptのソースが載ってたので、変数名とかを自分に分かるように書き直して使いました。
Midpoint circle algorithm - Wikipedia
よくわからないのですが、dy
の値が1だと半径が小さいときに円というより四角になってしまったので、いろいろ触ってみて2に変更することにしました。
次に、楕円を描画するアルゴリズムを調べました。こちらはStack Overflowに貼られていたものを参考にしました。触ってみても1ミリしか解らなくて魂が砕けました。ただ、この方法だと縦横の長さを入れ替えて90度回転させたとき、完全に一致する楕円にはならないらしい。
javascript - Is there a midpoint ellipse algorithm? - Stack Overflow
これらをお借りして、ドットで線を引けるようにいじったサンプルが以下のものです。
See the Pen
multitouch by napoporitataso (@napoporitataso)
on CodePen.
ペイントっぽいサンプル
ペイントソフトよろしく、好きな大きさの丸を描けるサンプルも作ってみました。こっちだと、先述の縦横の挙動が一致しない感じがわりと分かります。横長で高さ1pxの丸は描けないけど、縦長で幅1pxの線が描けるあたりで顕著です。
同じ理由から、楕円の描画処理を使ってそのまま円を描こうとすると若干歪むので、縦横の長さが等しい時だけは円のアルゴリズムに切り替えるようにしてみました。
See the Pen
pixel-ellipse-in-canvas-2 by napoporitataso (@napoporitataso)
on CodePen.
そのほか
他に参考にさせていただいたところでは、以下のサイト様の解説は懇切丁寧で嬉しかったです。
伝説のお茶の間 No007-09(1) 円の描画(1) MichenerとBresenham
次のサイト様のソースコードは、シンプルなのに意味不明で、流したら本当に○が描けて恐ろしかったです。
円の描画(アルゴリズム)
以下に、当該のコードをJavaScriptで動かすサンプルを置いておきます。
See the Pen
pixel-ellipse-in-canvas-wakaran by napoporitataso (@napoporitataso)
on CodePen.