【问题标题】:Check if a point is within a "gluPartialDisk" (OpenGL and C++)检查点是否在“gluPartialDisk”内(OpenGL 和 C++)
【发布时间】:2014-12-25 10:44:35
【问题描述】:

我正在制作一个饼图程序,并且正在使用“gluPartialDisks”创建饼图段。但是,我还想检查一个点是否在其中一个磁盘的区域内(有问题的点是我的鼠标光标)。我知道如何找到鼠标光标的位置,但是如何检查它是否在磁盘区域内?

快速sn-p代码:

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

【问题讨论】:

    标签: c++ opengl point area disk


    【解决方案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() 的结果以弧度为单位,在 [-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!
    }
    

    【讨论】:

      【解决方案2】:

      不幸的是,OpenGL 不会为您执行此操作。

      您可以为您的磁盘计算一个边界区域,然后进行一些点与边界区域的交叉测试(对于这样的形状来说这会很复杂),或者您可以实现颜色选择。

      由于这是一个图表程序,使用latter approach 可能非常有用。这个想法是为场景中的每个对象分配一个唯一的颜色代码,绘制场景,然后读回光标位置的颜色。这种方法是像素级的,但对于大多数应用程序来说太慢了,但对于一个简单的图表程序来说,它是完美的。

      【讨论】:

        猜你喜欢
        • 2016-06-07
        • 1970-01-01
        • 2016-01-17
        • 2016-02-08
        • 1970-01-01
        • 2014-04-26
        • 2020-01-15
        相关资源
        最近更新 更多