-5

我需要一个在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 for Concert 绘制弧线的代码,但没有奏效。有人可以帮助我吗?

4

2 回答 2

2

不一定是最好的方法,但如果你只是需要一些工作,你可以稍微修改你的圈码。float arc_length向函数签名添加参数。替换2.0f * 3.1415926farc_length。如果您需要在给定的偏移量处开始弧线,您可以添加另一个名为float arc_start. 然后在循环arc_starttheta每次迭代中添加for

根据萨曼的评论进行编辑:

您真正想要的不是弧线,而是曲线的更一般表示。圆弧是一种曲线,但它是一种非常特殊的曲线——即具有恒定半径的曲线。听起来您想绘制任意曲线,可能具有不同的半径。如果是这样,那么我的建议是贝塞尔曲线。这是一个非常可靠的介绍:

http://devmag.org.za/2011/04/05/bzier-curves-a-tutorial/

请注意教程后面关于绘制它们的部分,作者说“最简单的方法是使用 t 的小增量来计算连续点。” 为了在 OpenGL 中绘制贝塞尔曲线,这几乎是您必须做的。选择 的值t,并在 for 循环中递增它,就像您theta在原始循环代码中所做的那样。对于每次迭代,画一个点。

于 2012-11-12T18:46:10.000 回答
0

根据您绘制圆圈的方式,您有不同的解决方案。目前,您正在做的是将它们2*pi分成多个n部分并将它们连接在一起。嗯,想到的第一个解决方案是改变弧的范围。

例如,要只制作 arc 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角度来正确完成弧线。thetaend


从您的评论到其他答案,您实际上似乎正在寻找其他曲线,例如贝塞尔曲线样条曲线或其他曲线。

于 2012-11-13T12:39:41.370 回答