如何检测光标是否在一组顶点内?

时间:2016-05-09 18:50:35

标签: opengl printf glfw

我想检测光标是否在移动圈/磁盘区域内。我试图用下面的代码解决问题。 if语句似乎“正常”,因为它不报告错误,但else条件是唯一打印的输出,即使光标在圆圈区域内移动,穿过它的圆周,或通过它的中心。

我显然缺少一些关于定义检测鼠标的适当区域的内容,但我无法弄清楚是什么。我(无知地)假设最好的选择是使用glVertex2f()中定义的顶点坐标,但这显然是不准确的,或者我已经不正确地执行了它。任何协助或指导将不胜感激。

glBegin(GL_TRIANGLE_FAN);

    glColor3f(1, 0, 0);

    int j[5] = {100,80,60,55,50};
    int z = 1;
    float radius = j[z];
    int xoffset = radius - (2 * radius);
    int yoffset = 384;
    double x1 = xoffset + radius;
    double y1 = yoffset + radius * (sin(iteration));

    void cursor_position_callback(GLFWwindow* w, double x, double y)
    {
        FILE *f = fopen("data.txt", "a");

        if (cursor_x == (x1 + radius * cos(i)) && cursor_y == (y1 + radius * sin(i))){
        fprintf(f,"+++%0.3f: Cursor position: %f %f (%+f %+f)\n",
                glfwGetTime(),
                x, y, x - cursor_x, y - cursor_y);
        }
        else{
        fprintf(f,"---%0.3f: Cursor position: %f %f (%+f %+f)\n",
                glfwGetTime(),
                x, y, x - cursor_x, y - cursor_y);
        }
        cursor_x = x;
        cursor_y = y;
        fclose(f);
    }

    for (double i = 0; i < 2 * M_PI; i = i + ((2 * M_PI) / a))
    {

        glVertex2f(x1 + radius * cos(i), y1 + radius * sin(i));
        glfwSetCursorPosCallback(w, cursor_position_callback);

    }

    iteration += 0.01;

glEnd();
glTranslatef(1.0f,0.0f,0.0f);

1 个答案:

答案 0 :(得分:2)

如果点到圆的中心点的距离小于或等于圆的半径,则点位于圆内。

double dx = cursor_x - circle_x;
double dy = cursor_y - circle_y;
double dist_squared = dx*dx+dy*dy;
if(dist_squared <= radius*radius) {
    // inside circle
}

您的代码还有其他问题:

  • 使用C语言中的其他函数定义函数是一个非可移植的GCC扩展,并且可能不会像您认为的那样工作(我很确定i离开作用域后它会遇到未定义的行为)。
  • glfwSetCursorPosCallback(或任何GLFW回调函数)只能注册一个函数;再次调用glfwSetCursorPosCallback会将回调设置为新函数并丢弃旧函数。

您需要保留一个圆形的全局列表以进行测试,并在单个光标回调函数中进行检查。