只要您的部分磁盘与屏幕平行,并使用平行投影进行渲染,那么在完全不涉及 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() 的结果以弧度为单位,在 [-PI, PI] 范围内从 x 轴逆时针测量,而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!
}