Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

マインクラフトとかで使えそう
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);
        //~~~~~~~~~~~~~~~~~~
    }
}

問題点

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

IKD-Member
Perlが大好きですがC#とC++を書いている人です. クライアントもサーバーもいけます. ゲーム作るのが好きですがソフトも作ります. [主に使ってるやつ]Perl,C#,C++,JavaScript,Java / Unity,OpenGL,XNA [使えなくもないやつ]ActionScript,Ruby,Python / DirectX
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away