OpenGL如何固定方向从开始到终点绘制圆/半圆/弧给出中心,r开始和结束角度

时间:2016-09-06 08:40:27

标签: c++ algorithm opengl trigonometry

如何从开始(B)到结束(C)点给出圆形或半圆形或圆弧:

  • A(Ax,Ay) - 折线
  • B(Bx,By) - 起点
  • C(Cx,Cy) - 终点
  • M(Mx,My) - 圆心或半圆或圆弧
  • r - radius
  • startAngle = atan2(B.y - M.y,B.x - M.x) - 以弧度为单位
  • endAngle = atan2f(C.y - M.y,C.x - M.x) - 以弧度为单位
  • segments = 80

未知值:

  • 顺时针或逆时针方向

要求

  • 弧必须从B点绘制到C

有人可以提供我在OpenGL中绘制圆弧的等式吗?

提示:

它是圆形,半圆形还是弧形,它取决于圆心的位置以及起点和终点。

请给我一些解决方法。

修改

我写了这个,现在是: 错误的绘制方向。请看图片。半圆必须是线的底部而不是顶部。 在1的情况下,一切都很好。 在2的情况下,绘制方向应为底部(CCW)

enter image description here

float startAngle = atan2(B.y - centerArc.y, B.x - centerArc.x);
float endAngle = atan2(C.y - centerArc.y, C.x - centerArc.x);

if (endAngle < startAngle)
{
    endAngle += 2.0f * PI;
}

glBegin(GL_LINE_STRIP);
for (float angle = startAngle; angle <= endAngle; angle = angle + 0.01f)
{
    float x = centerArc.x + cos(angle) * r;
    float y = centerArc.y + sin(angle) * r;
    glVertex2f(x, windowHeight - y);
}
glEnd();

enter image description here

1 个答案:

答案 0 :(得分:1)

圆,半圆或圆弧上的点的等式对于所有情况都是相同的。唯一变化的变量是角度所在的范围。

在伪代码中,这看起来如下:

for angle in [startAngle, endAngle]
    p_on_circle = M + r * (cos(angle), sin(angle))

这假定,该角度以弧度给出,因此人们可能只想使用

startAngle = atan2(B.y - M.y, B.x - M.x)
endAngle = atan2f(C.y - M.y, C.x - M.x)

修改

由于atan2在[-pi,pi]中产生角度,当endAngle小于startAngle时会产生一些问题,因此必须确保endAngle总是大于startAngle {1}}。例如,这可以通过以下方式完成:

if (endAngle < startAngle)
    endAngle += 2*pi;