使用OpenGL或D3D绘制椭圆的有效方法

时间:2011-05-04 16:23:56

标签: opengl graphics vector geometry

有一种快速的方法可以像这样绘制圆圈

void DrawCircle(float cx, float cy, float r, int num_segments) 
{ 
    float theta = 2 * 3.1415926 / float(num_segments); 
    float c = cosf(theta);//precalculate the sine and cosine
    float s = sinf(theta);
    float t;

    float x = r;//we start at angle = 0 
    float y = 0; 

    glBegin(GL_LINE_LOOP); 
    for(int ii = 0; ii < num_segments; ii++) 
    { 
        glVertex2f(x + cx, y + cy);//output vertex 

        //apply the rotation matrix
        t = x;
        x = c * x - s * y;
        y = s * t + c * y;
    } 
    glEnd(); 
}

我想知道是否有类似的方法来绘制椭圆,其主轴/副轴矢量和尺寸都是已知的。

3 个答案:

答案 0 :(得分:2)

无法在openGL中绘制曲线,只有很多直线。但是如果你使用了顶点缓冲区对象,那么你就不必将每个顶点发送到图形卡上,这样会快得多。

My Java Example

答案 1 :(得分:2)

如果我们举例,我们可以使用内部半径1并分别应用水平/垂直半径以获得椭圆:

void DrawEllipse(float cx, float cy, float rx, float ry, int num_segments) 
{ 
    float theta = 2 * 3.1415926 / float(num_segments); 
    float c = cosf(theta);//precalculate the sine and cosine
    float s = sinf(theta);
    float t;

    float x = 1;//we start at angle = 0 
    float y = 0; 

    glBegin(GL_LINE_LOOP); 
    for(int ii = 0; ii < num_segments; ii++) 
    { 
        //apply radius and offset
        glVertex2f(x * rx + cx, y * ry + cy);//output vertex 

        //apply the rotation matrix
        t = x;
        x = c * x - s * y;
        y = s * t + c * y;
    } 
    glEnd(); 
}

答案 2 :(得分:1)

如果椭圆为((x-cx)/ a)^ 2 +((y-cy)/ b)^ 2 = 1则将glVertex2f调用更改为 glVertext2d(a * x + cx,b * y + cy);

为了简化总和,我们假设椭圆以原点为中心。

如果旋转椭圆使得半长轴(长度为a)与x轴形成角度θ,那么椭圆就是点p的集合,因此p'* inv(C)* p =在图1中,C是矩阵R(θ)* D * R(θ)',其中'表示转置,D是对角矩阵,条目a * a,b * b(b是半短轴的长度)。如果L是C的胆怯因子(例如here)那么椭圆就是点p的集合,因此(inv(L)* p)'*(inv(L)* p)= 1,所以L将单位圆映射到椭圆。如果我们将L计算为(u 0; v w)(在循环之前只有一次),则glVertexf调用变为glVertex2f(u * x + cx,v * x + w * y + cy);

L可以像这样计算(其中C是cos(theta),S是sin(theta)):

u = sqrt(C * C * a * a + S * S * b * b); v = C * S *(a * a-b * b); w = a * b / u;