【发布时间】:2013-08-10 22:29:38
【问题描述】:
我正在尝试编写一个方法,该方法将使用 GL_TRIANGLE_STRIP 从起始角度到结束角度绘制弧线。我写了以下代码,但有以下问题:
- 我似乎无法获得正确的角度。它们似乎偏离了应有的位置(不是 90/45/180)。
- 如果两者之间的总角度大于 180 度,则圆弧将在两者之间的圆上绘制较小的角度。即如果总角度为 200 度,它将在圆的另一部分绘制 160 度的弧。
我花了很多时间试图做到这一点,并认为让另一双眼睛看着我的代码会很有帮助。下图显示了我试图在角度之间创建的三角形条带。弄清楚这部分后,我将应用纹理。感谢您的帮助!
-(void) drawArcFrom:(CGFloat)startAngle to:(CGFloat)endAngle position:(CGFloat)position radius:(CGPoint)radius {
CGFloat segmentWidth = 10.0;
CGFloat increment = fabsf(endAngle - startAngle) / segmentWidth;
int numSegs = fabsf(endAngle - startAngle) / segmentWidth;
int direction = (endAngle - startAngle > 0) ? 1 : -1;
ccVertex2F vertices[numSegs * 2];
for (int i = 0; i < numSegs; i++) {
CGFloat angle = startAngle - (i * increment * direction);
CGPoint outsidePoint = ccpAdd(position, ccp(sinf(CC_DEGREES_TO_RADIANS(angle)) * (radius + 4), cosf(CC_DEGREES_TO_RADIANS(angle)) * (radius + 4)));
CGPoint insidePoint = ccpAdd(position, ccp(sinf(CC_DEGREES_TO_RADIANS(angle)) * (radius - 4), cosf(CC_DEGREES_TO_RADIANS(angle)) * (radius - 4)));
vertices[i * 2] = (ccVertex2F) {outsidePoint.x, outsidePoint.y };
vertices[i * 2 + 1] = (ccVertex2F) {insidePoint.x, insidePoint.y };
}
glVertexPointer(2, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLE_STRIP, 0, (GLsizei) numSegs * 2);
}
【问题讨论】:
-
你能发一张它的截图吗?这个想法看起来大部分是正确的。但是您没有包含
angle1的定义。如果你没有初始化它,它可以解释偏移量。对于另一个问题,您总是可以在对它们进行数学运算之前对角度进行排序。例如,确保你总是从低到高。 -
你是对的。确保我从最低角度开始,然后到更高的角度是主要的解决方法。谢谢你的建议。
angle1是一个错字,实际上应该是startAngle我已经更改了。 -
ps:通过对每个角度进行一次 deg2rad 计算而不是 4 次来加快速度并使其更易于阅读
标签: ios opengl-es cocos2d-iphone