Круговая дуга через центральную точку

Я пытаюсь визуализировать дугу через три указанные точки в OpenGL. До сих пор мне удалось вычислить все различные значения, необходимые для этого (центр и радиус окружности, проходящей через три точки, а также начальный и конечный угол). Моя проблема заключается в выборе направления рисования дуги по часовой стрелке или против часовой стрелки, в зависимости от расположения средней точки. Мой код выглядит следующим образом: (взломанный экспериментальный код, points [0] — начало, points [1] — середина, а points [2] — конец)

void render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor3f(0.0f, 0.0f, 0.0f);

// Circle Parameters
Point2D center = circleCenter(points[0], points[1], points[2]);
double circleRadius = radius(points[0], points[1], points[2]);

// Arc Parameters
double start = atan2(points[0].y - center.y, points[0].x - center.x) * (180 / M_PI);
double middle = atan2(points[1].y - center.y, points[1].x - center.x) * (180 / M_PI);
double end = atan2(points[2].y - center.y, points[2].x - center.x) * (180 / M_PI);

if (start < 0)
start += 360;
if (middle < 0)
middle += 360;
if (end < 0)
end += 360;

// Render circle
glBegin(GL_LINE_STRIP);
for (int i = start; i < end; i++)
{
double degInRad = i * M_PI / 180;
glVertex2d(cos(degInRad)*circleRadius + center.x, sin(degInRad)*circleRadius + center.y);
}
glEnd();

glutSwapBuffers();
}

Как вы можете видеть, дуга в данный момент просто отображается между начальной и конечной точками. Что мне нужно сделать, чтобы убедиться, что он отрисовывается в правильном направлении, через центральную точку?

Обновление 1:
Например, на диаграммах ниже синие точки — это мои три определенные точки, а красный — центр круга. На верхнем изображении дуга проходит через мою среднюю точку. Но на нижнем изображении дуга все еще нарисована по часовой стрелке, хотя моя средняя точка теперь справа. То же самое происходит для различных комбинаций начальной и конечной точек. Существует ли единый способ обеспечения того, чтобы дуга всегда проходила через центральную точку?

Правильно:

Правильно

Неправильно:

Неправильно

0

Решение

Вы можете проверить, где находится середина.

(...)

if (end < start)
end += 360;
if (middle < start)
middle += 360;

if (middle < end)
doNormal = true;
else
doNormal = false;

// Render circle
glBegin(GL_LINE_STRIP);
for (int i = doNormal ? start : end; i < doNormal ? end : start; i += doNormal ? 1 : -1)
(...)
0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector