2014-10-29 2 views
0

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

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

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); 

ответ

1

Пока ваши частичные диски параллельны экрану и визуализируются с параллельной проекцией, проще всего выполнить математику, не вовлекая 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() находятся в градусах и измерены по часовой стрелке от оси y. С 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 не собирается делать это за вас, к сожалению.

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

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

Смежные вопросы