У меня есть следующий код, чтобы нарисовать произвольную дугу:Как нарисовать суженную дугу (кривая с уменьшающейся толщиной) в OpenGL?
void CenteredArc::drawPolygonArc(float radius, float thickness, float startAngle, float arcAngle) {
float num_segments = 360.0;
float radiusOuter = radius + thickness/2;
float radiusInner = radius - thickness/2;
float theta = arcAngle/num_segments;
float tangetial_factor = tanf(theta);//calculate the tangential factor
float radial_factor = cosf(theta);//calculate the radial factor
float xxOuter = radiusOuter * cosf(startAngle);
float yyOuter = radiusOuter * sinf(startAngle);
float xxInner = radiusInner * cosf(startAngle);
float yyInner = radiusInner * sinf(startAngle);
float prevXXOuter = -1;
float prevYYOuter = -1;
float prevXXInner = -1;
float prevYYInner = -1;
glPolygonMode(GL_FRONT, GL_FILL);
for(int ii = 0; ii < num_segments; ii++)
{
if (prevXXOuter != -1) {
glBegin(GL_POLYGON);
glVertex2f(prevXXOuter, prevYYOuter);
glVertex2f(xxOuter, yyOuter);
glVertex2f(xxInner, yyInner);
glVertex2f(prevXXInner, prevYYInner);
glEnd();
}
//calculate the tangential vector
//remember, the radial vector is (x, y)
//to get the tangential vector we flip those coordinates and negate one of them
float txOuter = -yyOuter;
float tyOuter = xxOuter;
float txInner = -yyInner;
float tyInner = xxInner;
//add the tangential vector
prevXXOuter = xxOuter;
prevYYOuter = yyOuter;
prevXXInner = xxInner;
prevYYInner = yyInner;
xxOuter += txOuter * tangetial_factor;
yyOuter += tyOuter * tangetial_factor;
xxInner += txInner * tangetial_factor;
yyInner += tyInner * tangetial_factor;
//correct using the radial factor
xxOuter *= radial_factor;
yyOuter *= radial_factor;
xxInner *= radial_factor;
yyInner *= radial_factor;
}
}
Тем не менее, я хотел бы, дугу, чтобы начать с заданной толщиной на одном конце, и постепенно уменьшает до толщины нуля на другом конце , Какие-либо предложения?
Edit: Я не использую GL_LINE_STRIP
потому, что я пытаюсь избежать перекрывающихся линий и пробелов, как так:
Что такое 'WW_SPLINE_ACCURACY'? – carmenism
@vulpix это константа, контролирующая, сколько вершин будет использовано для каждой дуги! –
Причина, по которой я не использовал 'GL_LINE_STRIP', а рисовал полигоны, заключается в том, что рендеринг не выглядел так хорошо за пределами толщины 5 пикселей. На внешнем краю вы могли видеть отсутствующие слайды. – carmenism