2016-05-09 3 views
0

Я хотел бы определить, находится ли курсор в области мобильного круга/диска. Я попытался решить проблему с помощью кода ниже. Оператор 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

Вы уверены, что открываете 'FILE * f = fopen (" data.txt "," a ");' каждый раз, когда мышь перемещается, это правильный способ решить вашу проблему? – user3078414

+0

@ user3078414 Он выглядит как отладочный код. Неэффективность обычно приемлема при работе с ошибкой. – Xirema

+0

@ user3078414 Xirema правильный. Я пытаюсь проверить функциональность. Использовать или не использовать упомянутый код fopen или обращаясь к его эффективности/неэффективности, кажется, обходит проблему того, обнаружен ли курсор внутри вершин или нет, если вы не приближаетесь к нетипизированной мысли, которая также объясняла бы, почему она не была обнаружена , Спасибо вам за эту мысль! – zzz

ответ

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 снова устанавливает обратный вызов новой функции и отбрасывает старый.

Вам необходимо сохранить глобальный список окружностей для проверки и проверить его в функции сингулярного обратного вызова.

+0

Как прелесть. Спасибо за исправления. Я знал о непереносной проблеме, но, признаюсь, ваш второй момент убежал от меня, пока я не прочитал и проверить его. Спасибо за учебный момент! Оцените. – zzz