我想检测光标是否在移动圈/磁盘区域内。我试图用下面的代码解决问题。 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);
答案 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
}
您的代码还有其他问题:
i
离开作用域后它会遇到未定义的行为)。glfwSetCursorPosCallback
(或任何GLFW回调函数)只能注册一个函数;再次调用glfwSetCursorPosCallback
会将回调设置为新函数并丢弃旧函数。您需要保留一个圆形的全局列表以进行测试,并在单个光标回调函数中进行检查。