在opengl中画一个弧

时间:2012-11-12 17:31:58

标签: opengl

我需要一个在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代码绘制成弧形但不起作用。 有人可以帮助我吗?

2 个答案:

答案 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 curvessplines或其他曲线。