普通の円を描くのは簡単だが、ドットの円を描くのが思ったよりめんどくさかった
今回考えてみたアルゴリズムを書いていく
手順
1.生成する円を内接円と考える。そのための四角形を与える(横幅、縦幅)
2.円に用いる頂点の数を決める
3.四角形の内接円を指定の頂点数を使い生成する(画像の赤い円)
4.それぞれの点で、矩形にどれだけめり込んでいるかを調べる
5.めり込みの量が一定以上だった場合、その矩形を塗りつぶす
6.塗り潰しの箇所から中心に向かって内部を塗りつぶす(画像の青い円)
ソース
//四角形の大きさ
int width = 30;
int height = 30;
//グリッド描画めり込み最低値
const int SINK_PERMISSION_NUM = 18;
//頂点数
int vertex = width * 8;
//中心点
var center = new { X = width * 0.5f, Y = height * 0.5f };
//先にDegree -> Radian用の数値を作っておく
float toAngle = (float)Math.PI / vertex;
for (int i = 0; i < vertex; ++i)
{
//円を生成していく
double angle = toAngle * i;
float px = (float)Math.Cos(angle) * center.X;
float py = (float)Math.Sin(angle) * center.Y;
//円頂点のドットへのめり込み量を調べる
int sink = (int)((py % 1.0f) * 100);
if (sink < SINK_PERMISSION_NUM) continue;
//ここでBoxを描画していく
for (int j = 0;j < py;++j)
{
int dotX = (int)(center.X + px);
//上側のポジションY 偶数時の補正をするならここに-1
int dotUpY = (int)(center.Y - j);
//下側のポジションY
int dotDownY = (int)(center.Y + j);
//~~~~~~~描画~~~~~~~
//DrawDot(dotX,dotUpY,dotDownY);
//~~~~~~~~~~~~~~~~~~
}
}
問題点
ある程度の大きさの円でないと、ちょくちょく間に抜けができる
塗り潰し判定のめり込み量で対応できなくはない・・・?