5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[アルゴリズム] ドットの円を良い感じに作成する

Last updated at Posted at 2018-07-13

マインクラフトとかで使えそう
NoName_2018-7-13_17-21_No-00.png

普通の円を描くのは簡単だが、ドットの円を描くのが思ったよりめんどくさかった
今回考えてみたアルゴリズムを書いていく

手順

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);
        //~~~~~~~~~~~~~~~~~~
    }
}

問題点

ある程度の大きさの円でないと、ちょくちょく間に抜けができる
塗り潰し判定のめり込み量で対応できなくはない・・・?

5
3
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?