我尝试使用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));
}
}
}
}
问题当然是随着圆弧半径越大,它们之间的空间越大,但我的问题是:我可以使用这种技术使圆圈更平滑,如果是这样,我该怎么办?
图片:
答案 0 :(得分:1)
您应首先将i
转换为弧度,然后再将其传递给sin()
和cos()
。
之后,您可能需要考虑使用小于1度的增量 你越过角度。
如果效率是一个问题,你可以通过迭代90度弧来加速它4倍,并利用对称性绘制其他三个象限(并在同一次迭代中完成所有三个圆圈,而不是而不是去约3次)。
除此之外,还有一些方法可以画出don't rely on trigonometry。
的圆圈答案 1 :(得分:0)
查看bresenham算法,绘制圆形,逐个像素地绘制圆圈,或者回答我对这个问题的重复here。我不是SDL专家,但是我在一个文本屏幕上发布了一个ASCII绘制圆圈的程序,其中包含一个可以在其他地方使用的例程。