2012-12-09 66 views
0

我想用OpenGL库绘制一个带扇区的环,每个环都有不同的颜色。 要绘制环,我知道我可以使用gluDisk(gluNewQuadric(), 0, 1.5, 32, 100);用不同颜色的分区绘制一个环

但绘制部门或区域以不同的颜色,我想我需要使用使用GL_TRIANGLE_FAN或类似的东西的一种手工方法。

我以这种方式尝试,但输出不是很精确的环。

const float DEG2RAD = 3.14159/180; 

glBegin(GL_TRIANGLE_FAN); 
     for(int i = 0; i <= 90; i++) 
     { 
      float degInRad = i*DEG2RAD; 
      glVertex2f(x, y); // point of the inner circle of the ring 

      for(int n = 0; n <= 4; n++) 
      { 
       float const t = = i*DEG2RAD*(n/4); 
       glVertex2f(x + sin(t)*r, y + cos(t)*r); // points of the outer circle. 
      } 
     } 
glEnd(); 

的想法是以下的GL_TRIANGLE_FAN作品,如何在用于内圆计算出的各点处的外圆坐4分这个图。因为外圈比内圈长。这是循环进入另一个循环的原因。

Types of OpenGL drawings

+0

这不是我清楚你的外环正在试图做的,尤其是你的内环使用具有相同名称的循环变量。 – JasonD

+0

'我'在哪里?何时有'= ='是有效的语法? – genpfault

+0

我不确定这里的问题是什么。看起来你要求我们为你写代码。 –

回答

2

你的代码引用的“内循环”和“外循环”,但你已经是一个单中心点(x,y)和你的外圆点将所有的地方作为你的角度计算没有什么意义(你可以计算外部循环中的一个值,这个值不会在任何地方使用,然后只是在内部循环中将所有内容相乘,除以4则为好的度量...这不会给你一个圆圈的好点)。

无论如何,您不能使用单个三角形风扇绘制圆环,因为风扇中的所有三角形都必须连接到单个点。没有什么神奇的方法可以在不同的地方重启风扇,你只需要glEnd()并开始一个新的。这对于处理一个响铃不太合适,因为你会留下空白。三角形风扇通常是传统GL基元中最不实用的一种。

我明白你想在小圈子里使用更少的点数,但老实说,我看不出这是值得的。

最好的办法是使用三角形条代替,在您的圆周围放置一个单一的循环,每次都放入一个内部和外部顶点。为段

伪代码:

glBegin(GL_TRIANGLE_STRIP); 
for(angle = start_angle; angle < end_angle ; angle += small_increment) 
{ 
    s = sin(angle); c = cos(angle); 
    glVertex2f(x + c * r1, y + s * r1); 
    glVertex2f(x + c * r2, y + s * r2); 
} 
glEnd(); 
+0

谢谢。你放的代码非常简单。我不知道我找不到解决方案的原因。再次感谢。 –

相关问题