Проверьте, находится ли точка в пределах «gluPartialDisk» (OpenGL и C ++)

Я делаю программу круговой диаграммы и создаю сегменты круговой диаграммы с помощью «gluPartialDisks». Однако я также хочу проверить, находится ли точка в области одного из дисков (речь идет о моем курсоре мыши). Я знаю, как найти положение курсора мыши, но как я могу проверить, находится ли он в области диска?

Быстрый фрагмент кода:

glTranslatef(-0.3, 0, 0);

gluPartialDisk(gluNewQuadric(), 0, 0.65, 10, 1,
((2 * 3.141592654 * 0.65) * (/*Specific angle*/) - (/*Specific angle*/ * 5),
/*Different angle*/ * 360);

0

Решение

Пока ваши частичные диски параллельны экрану и воспроизводятся в параллельной проекции, проще всего выполнять математику без участия OpenGL вообще.

Скажем, вы рисовали частичный диск с:

glTranslatef(xPos, yPos, 0.0f);
gluPartialDisk(quadric, innerRad, outerRad, slices, loops, startAng, sweepAng);

Теперь, если вы хотите проверить точку (x0, y0)Вы вычитаете вектор перевода, а затем вычисляете полярные координаты:

x0 -= xPos;
y0 -= yPos;
float dist = sqrt(xPos * xPos + yPos * yPos);
float ang = atan2(yPos, xPos);

Чтобы быть внутри частичного диска, расстояние до центра должно быть в пределах радиусов:

if (dist < innerRad || dist > outerRad) {
// it's outside!
}

Угол немного сложнее, потому что он вращается вокруг. Кроме того, результат atan2() в радианах, измеряется против часовой стрелки от оси x в диапазоне [-PI, PI], а аргументы gluPartialDisk() в градусах и измеряется по часовой стрелке от оси у. С startAng а также sweepAng в диапазоне [0.0, 360.0] градусов тестовая логика интервала может выглядеть так (не проверено):

ang *= 180.0f / PI; // convert to degrees
ang = 90.0f - ang;  // make clockwise, relative to y-axis
if (ang < 0.0f) {
ang += 360.0f;  // wrap into range [0.0, 360.0]
}
ang -= startAng;    // make relative to startAng
if (ang < 0.0f) {
ang += 360.0f;  // ... and back into range [0.0, 360.0]
}
if (ang > sweepAng) {
// it's outside!
} else {
// it's inside!
}
1

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

К сожалению, OpenGL не собирается делать это за вас.

Вы можете либо вычислить ограничивающую область для вашего диска, а затем выполнить некоторое тестирование пересечения точки и ограничивающей области (что было бы сложно для такой формы), либо вы можете реализовать выбор цвета.

Так как это для программы построения графиков, может быть очень полезно последний подход. Идея состоит в том, чтобы назначить каждому объекту в вашей сцене уникальный цветовой код, нарисовать сцену и затем снова прочитать цвет в позиции курсора. Этот подход идеален для пикселей и слишком медленен для большинства приложений, но для простой программы построения графиков он идеален.

1

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