我需要一个在opengl中绘制弧的函数。 我还需要一个示例代码来使用它。
我可以用直线绘制一个圆圈,我也想用直线绘制圆弧。 这是绘制循环的我的函数:
void DrawCircle(float cx, float cy, float r, int num_segments)
{
glBegin(GL_LINE_STRIP);
for(int ii = 0; ii < num_segments; ii++)
{
float theta = 2.0f * 3.1415926f * float(ii) / float(num_segments);//get the current angle
float x = r * cosf(theta);//calculate the x component
float y = r * sinf(theta);//calculate the y component
glVertex2f(x + cx, y + cy);//output vertex
}
glEnd();
}
我使用LINE_STRIP将Concert代码绘制成弧形但不起作用。 有人可以帮助我吗?
答案 0 :(得分:2)
不一定是最好的方式,但如果您只是需要让某些工作正常,您可以稍微修改一下您的圈子代码。在函数签名中添加float arc_length
参数。将2.0f * 3.1415926f
替换为arc_length
。如果需要在给定偏移量处启动弧,则可以添加另一个名为float arc_start
的参数。然后在arc_start
循环的每次迭代中将theta
添加到for
。
根据Saman的评论进行编辑:
您实际想要的不是圆弧,而是曲线的更一般表示。弧是曲线的种,但它是一种非常特殊的类型 - 即。一个半径恒定的人。听起来你想绘制任意曲线,可能会有不同的半径。如果是这样,那么我的推荐是贝塞尔曲线。这是一个非常可靠的介绍:
http://devmag.org.za/2011/04/05/bzier-curves-a-tutorial/
请注意教程后面的关于绘制它们的部分,其中作者说“最简单的方法是使用小的增量来计算连续的点”。这是为了在OpenGL中绘制Bezier曲线所必须做的。选择t
的值,并将其在for循环中递增,就像在原始循环代码中使用theta
一样。对于每次迭代,绘制一个点。
答案 1 :(得分:0)
根据您绘制圆圈的方式,您有不同的解决方案。目前,您正在做的是将2*pi
划分为n
段并将它们连接在一起。嗯,首先想到的解决方案是改变弧的范围。
例如,要仅制作弧3*PI/4
,您只需更改
float theta = 2.0f * PI * float(ii) / float(num_segments);
到
float theta = 3.0f * PI / 4.0f * float(ii) / float(num_segments);
或者更一般地说,如果您认为整个圆圈与1
相对应且没有任何内容与0
相对应,则可以制作圆圈的s
倍圆弧(例如3/8),然后你可以简单地写:
float theta = 2.0f * PI * s * float(ii) / float(num_segments);
请注意,您可能不希望弧以角度0开始。因此,您可以添加一个常量,这也是此公式的起始角度:
float theta = 2.0f * PI * s * float(ii) / float(num_segments) + start;
另一种解决方案是,不是计算弧内的角度,而是获得起点和终点角度以及步长。然后你有:
for (theta = start; theta < end; theta += step)
并确保在GL_LINE_STRIP
的最后,您glVertex2f
theta
对应end
角度,以正确完成圆弧。
从您的评论到其他答案,您实际上可能正在寻找其他曲线,例如bezier curves或splines或其他曲线。