gpt4 book ai didi

c++ - 检查一个点是否在 "gluPartialDisk"内(OpenGL 和 C++)

转载 作者:行者123 更新时间:2023-11-28 02:38:57 25 4
gpt4 key购买 nike

我正在制作饼图程序并使用“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);

最佳答案

只要您的部分磁盘与屏幕平行,并使用平行投影进行渲染,那么在根本不涉及 OpenGL 的情况下进行数学计算是最简单的。

假设您正在绘制一个部分圆盘:

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

现在如果你想测试点(x0, y0),你减去平移 vector ,然后计算极坐标:

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 轴顺时针方向测量。 startAngsweepAng 在 [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!
}

关于c++ - 检查一个点是否在 "gluPartialDisk"内(OpenGL 和 C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26635268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com