有一种快速的方法可以像这样绘制圆圈
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();
}
我想知道是否有类似的方法来绘制椭圆,其主轴/副轴矢量和尺寸都是已知的。
答案 0 :(得分:2)
无法在openGL中绘制曲线,只有很多直线。但是如果你使用了顶点缓冲区对象,那么你就不必将每个顶点发送到图形卡上,这样会快得多。
答案 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;