Хобрук: Ваш путь к мастерству в программировании

Как сохранить пропорциональную позицию мыши при перетаскивании нарисованного прямоугольника?

В настоящее время я создаю блоки, которые вы можете выбирать и перетаскивать с помощью OpenGL. Прямо сейчас у меня проблема, когда я нажимаю на поле, оно привязывает мышь к центру и перетаскивает поле из центральной точки. Я хочу, чтобы ящики перетаскивались из точки, где щелкнула мышь, а не из центра.

Это appMotionFunc вызывается, когда я двигаю мышью. Строки 10 и 11 — это то, что удерживает мою мышь в центре. Я не могу понять, как добиться правильной пропорции, изменив эти строки. Координаты (0,0) находятся в верхнем левом углу поля, и он рисует ширину вправо и высоту вниз.

    void appMotionFunc(int x, int y) {
    // Convert from Window to Scene coordinates
    float mx = (float)x;
    float my = (float)y;

    windowToScene(mx, my);

    // Your code here...
    if(rects[0]->selected){
        rects[0]->x = mx - rects[0]->w/2;
        rects[0]->y = my + rects[0]->h/2;
    }
    // Again, we redraw the scene
    glutPostRedisplay();
}

Так выглядит функция, рисующая прямоугольники.

void Rect::draw(){

    if (selected){

        glColor3f(1,1,1);
        glBegin(GL_LINES);

        glVertex3f(x, y, 0.1);
        glVertex3f(x+w, y, 0.1);

        glVertex3f(x+w, y, 0.1);
        glVertex3f(x+w, y-h, 0.1);
        
        glVertex3f(x+w, y-h, 0.1);
        glVertex3f(x, y-h, 0.1);
        
        glVertex3f(x, y-h, 0.1);
        glVertex3f(x, y, 0.1);

        glEnd();
        
        glColor3f(red, green, blue);

        glBegin(GL_POLYGON);

        glVertex3f(x, y, 0.1);
        glVertex3f(x+w, y, 0.1);
        glVertex3f(x+w, y-h, 0.1);
        glVertex3f(x, y-h, 0.1);

        glEnd();

        
    }
    else{
        glColor3f(red, green, blue);

        glBegin(GL_POLYGON);

        glVertex2f(x, y);
        glVertex2f(x+w, y);
        glVertex2f(x+w, y-h);
        glVertex2f(x, y-h);

        glEnd();
    }
}

Я предоставлю больше частей программы, если это не дает достаточно полного контекста для решения проблемы, но я думаю, что это весь соответствующий код.

05.10.2020

Ответы:


1

Дельта, о которой я говорил в этих строках, должна рассчитываться только один раз за щелчок мыши, а не каждый раз, когда вы перемещаете мышь. Простая ошибка, которую я слишком долго не мог понять.

05.10.2020
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..