Пока ваши частичные диски параллельны экрану и визуализируются с параллельной проекцией, проще всего выполнить математику, не вовлекая 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!
}