使用三角位置绘制的圆点。 SDL2

时间:2014-10-01 20:43:07

标签: c++ sdl-2

我尝试使用SDL_RenderDrawPoint()通过在其圆周上绘制圆点来绘制圆形。为此,我用正弦 - 余弦(cos(v),sin(v))表示了它们的位置(x,y),并且一次一个度地绘制每个点的for循环。通过1080次迭代和一些if语句,我制作了三个圆圈。

功能:

    void DotCircle::DrawCircle()
    {

        if (draw)
        {
            Position = { 500.f, 500.f };
            SDL_Point start;
            start.x = Position.m_x;
            start.y = Position.m_y;
            SDL_SetRenderDrawColor(drawmgr->getRenderer(), 0xFF, 0x00, 0xFF, 0xFF);

            for (size_t i = 0; i < 1080; i++)
            {
                if (i < 360)
                {
                    SDL_RenderDrawPoint(drawmgr->getRenderer(), start.x + 300 * cos(i), start.y       + 300 * sin(i));
                }

                if (i > 360 )
                {
                    SDL_RenderDrawPoint(drawmgr->getRenderer(), start.x + 200 * cos(i), start.y   + 200 * sin(i));
                }
                if (i > 720)
                {
                    SDL_RenderDrawPoint(drawmgr->getRenderer(), start.x + 100 * cos(i), start.y + 100 * sin(i));
                }
            }
        }
    }

问题当然是随着圆弧半径越大,它们之间的空间越大,但我的问题是:我可以使用这种技术使圆圈更平滑,如果是这样,我该怎么办?

图片:

link

2 个答案:

答案 0 :(得分:1)

您应首先将i转换为弧度,然后再将其传递给sin()cos()

之后,您可能需要考虑使用小于1度的增量 你越过角度。

如果效率是一个问题,你可以通过迭代90度弧来加速它4倍,并利用对称性绘制其他三个象限(并在同一次迭代中完成所有三个圆圈,而不是而不是去约3次)。

除此之外,还有一些方法可以画出don't rely on trigonometry

的圆圈

答案 1 :(得分:0)

查看bresenham算法,绘制圆形,逐个像素地绘制圆圈,或者回答我对这个问题的重复here。我不是SDL专家,但是我在一个文本屏幕上发布了一个ASCII绘制圆圈的程序,其中包含一个可以在其他地方使用的例程。