OpenGL で円を描く

OpenGL で円を描くには、多角形描画を使います。
ある程度の数で多角形を描画すると、円っぽく見えるようになります。


実験したところ、40 とか 50 ぐらいに設定すると、かなり大きくしてもそれなりに円に見えるようになるようです。
ということで Yanesdk を使って描いてみました。

private const int CircleDivision = 50;

public void DrawCircle(Yanesdk.Draw.Screen2DGl screen, double x, double y, double r)
{
    double e = 2 * Math.PI / CircleDivision;
    double radian = 0;
    Yanesdk.Draw.DrawContext dc = screen.DrawContext;
    OpenGl.Gl.glBegin(OpenGl.Gl.GL_POLYGON);
    for (int i = 0; i < CircleDivision; i++)
    {
        double px = x + r * Math.Sin(radian);
        double py = y + r * Math.Cos(radian);

        OpenGl.Gl.glVertex2f(
            (float)(px * dc.RateX + dc.OffsetRX),
            (float)(y * dc.RateY + dc.OffsetRY));

        radian += e;
    }
    OpenGl.Gl.glEnd();
}

これでかなり綺麗な円が描けますが、System.Math を使ってるので計算が重いかもしれないと思って、Yanesdk.Math.SinTable を使って円を描画してみました。

private const int CircleDivision = 50;

public void DrawCircle(Yanesdk.Draw.Screen2DGl screen, int x, int y, int r)
{
    double e = 512 / CircleDivision;
    double radian = 0;
    Yanesdk.Draw.DrawContext dc = screen.DrawContext;
    OpenGl.Gl.glBegin(OpenGl.Gl.GL_POLYGON);
    for (int i = 0; i < CircleDivision; i++)
    {
        int px = x + Yanesdk.Math.SinTable.Instance.Cos((int)radian, r);
        int py = y + Yanesdk.Math.SinTable.Instance.Sin((int)radian, r);

        OpenGl.Gl.glVertex2f(px * dc.RateX + dc.OffsetRX, py * dc.RateY + dc.OffsetRY);

        radian += e;
    }
    OpenGl.Gl.glEnd();
}

これでもそれなりに綺麗な円が描けます。
ただ、Yanesdk.Math.SinTable の分割数は 512 ということを考えると、CircleDivision を 32 か 64 にしてやった方が、円の上下左右の対称性が取れる可能性が高いのでそうした方がいいかも。