我正在尝试仅绘制一个扇区/圆圈的一部分,但目前我总是得到一个完整的圆圈。
我用它画一个圆圈:
glColor3f (0.25, 1.0, 0.25);
GLfloat angle, raioX=0.3f, raioY=0.3f;
GLfloat circle_points = 100.0f;
glBegin(GL_LINE_LOOP);
for (int i = 0; i < circle_points; i++) {
angle = 2*PI*i/circle_points;
glVertex2f(0.5+cos(angle)*raioX, 0.5+sin(angle)*raioY);
}
glEnd();
答案 0 :(得分:4)
glBegin (GL_LINE_LOOP);
glVertex2f (0.5f, 0.5f);
for (int i = 0; i < circle_points; i++) {
angle = 2*PI*i/circle_points;
glVertex2f (0.5+cos(angle)*raioX, 0.5+sin(angle)*raioY);
}
glEnd ();
我唯一改变的是在圆圈的中心添加了点0.5,0.5
。不管怎样,你最终会绘制一个段而不是一个扇区。
正如BDL指出的那样,您的原始代码画了一整圈。你1/4圈的角度应该是Pi / 2而不是2 * Pi。所以至少,你还需要重写这一行:
angle = PI * 0.5f * i / circle_points;
BDL的答案显示了一种更有效的方法。虽然它绘制弧线,可能是也可能不是你想要的。无论哪种方式,你现在都有足够的代码来绘制上图中的所有三件事。
答案 1 :(得分:3)
您经常使用cos()
和sin()
调用每个点的代码是正确的,但效率非常低。这些是相当昂贵的功能,编写代码很容易,只需要一次。
这个想法是你通过以角度增量旋转来获得前一点的每个点。旋转本身可以通过2x2变换矩阵来执行。这将每个点的计算减少到几个加法和乘法。
代码看起来像这样:
// Calculate angle increment from point to point, and its cos/sin.
float angInc = 0.5f * PI / (circle_points - 1.0f);
float cosInc = cos(angInc);
float sinInc = sin(angInc);
// Start with vector (1.0f, 0.0f), ...
float xc = 1.0f;
float yc = 0.0f;
// ... and then rotate it by angInc for each point.
glBegin(GL_LINE_LOOP);
for (int i = 0; i < circle_points; i++) {
glVertex2f(0.5f + xc, 0.5f + yc);
float xcNew = cosInc * xc - sinInc * yc;
yc = sinInc * xc + cosInc * yc;
xc = xcNew;
}
glEnd();
作为一个细微的细节,请注意,如果要绘制包含circle_points
点的四分之一圆,包括起点和终点,则需要将角度范围除以circle_points - 1
以获得角度增量。栅栏柱的数量和它们之间的间隙数量就是这个......
这将绘制一个圆弧段。 Andon已经详细阐述了细分市场和行业之间的差异。
上面的共享代码和我自己的答案:https://stackoverflow.com/a/25321141/3530129,它展示了如何使用现代OpenGL绘制圆圈。
答案 2 :(得分:2)
绘制圆的一小部分时,需要限制点的放置角度。 circle_points然后定义该圆弧应该分开多少个子部分。另外(正如@Andon M. Coleman指出的那样)使用GL_LINE_LOOP可能不是正确的选择,因为它总是会关闭从最后一点到第一点的线。
您的代码可能会以某种方式修改:
glColor3f (0.25, 1.0, 0.25);
GLfloat angle, raioX=0.3f, raioY=0.3f;
GLfloat circle_points = 100;
GLfloat circle_angle = PI / 2.0f;
glBegin(GL_LINE_STRIP);
for (int i = 0; i <= circle_points; i++) {
GLfloat current_angle = circle_angle*i/circle_points;
glVertex2f(0.5+cos(current_angle)*raioX, 0.5+sin(current_angle)*raioY);
}
glEnd();