2D вращение вокруг точки - PullRequest
0 голосов
/ 18 февраля 2012

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

Это мой код:

//Origin
double objectx = selection->getX();
double objecty = selection->getY();

//Point
double pointerx = input->getMouseX();
double pointery = input->getMouseY();

//Displacement
double displacementx = fabs(pointerx - objectx);
double displacementy = fabs(pointery - objecty);

//Angle
double angle = atan2(displacementy,displacementx);

//Point
double pointx = displacementx * cosf(angle) + displacementy * sinf(angle);
double pointy = displacementy * cosf(angle) - displacementx * sinf(angle);

//Final position
double fx = objectx + pointx;
double fy = objecty + pointy;

//Save alpha
const bool alpha = graphics->getAlpha();

//Draw selection
graphics->setAlpha(false);
graphics->color(selection->getColor());
graphics->renderQd(selection->getBitmap(),
                   CRect(objectx,
                         objecty,
                         selection->getWidth(),
                         selection->getHeight()));

//Draw pointer around selection
graphics->setAlpha(true);
graphics->color(editor::ssImg[0]->getColor());
graphics->renderQd(editor::ssImg[0]->getBitmap(),
                   CRect(objectx + pointx,
                         objecty + pointy,
                         editor::ssImg[0]->getWidth(),
                         editor::ssImg[0]->getHeight()));

//Restore alpha
graphics->setAlpha(alpha);

Точная проблема заключается в том, что указатель выделения не только следует за вращением мыши, но и фактически находится в положении мыши (!).Требуемое поведение - указатель, заблокированный по смещению выделения, но указывающий на угол мыши.

Кто-нибудь, кто хорошо разбирается в математике, видит здесь что-то не так?

1 Ответ

1 голос
/ 18 февраля 2012

Насколько я понимаю, ваше желаемое поведение предполагает наличие трех точек: начало координат, вокруг которого вы вращаетесь, "мышь", чтобы указать направление относительно источника, и "выбор", чтобы указать расстояние от Происхождение. (Несколько странно, что результат вашего кода является «указателем выделения». Я так понимаю, что «выделение» означает исходную позицию выделенного объекта, а «указатель выделения» означает положение, в которое он был перетащен так далеко?)

Ваш код, однако, на самом деле относится только к двум из этих точек: (objectx, objecty), который, как я предполагаю, является источником, и (pointerx, pointery), который, как я предполагаю, является «мышь». Ваш код никогда не относится к «выбору»; поэтому, естественно, «выбор» не влияет на результат вашего кода.

Есть еще несколько проблем & mdash; Оли Чарльзуорт указывает в комментарии выше, что вы неправильно делите свой угол на & pi; / 180, что означает, что вы применяете очень маленькое вращение (именно поэтому похоже, что вы в конечном итоге получаете выделение указателем = мышью; в Фактически, они могут быть на расстоянии до нескольких градусов друг от друга относительно начала вращения, но это не сразу заметно) & mdash; но вместо того, чтобы исправить эти проблемы, я бы порекомендовал вам изменить свой подход. Вместо того, чтобы генерировать «указатель выделения», поворачивая «выделение» в соответствии с углом «мыши», я рекомендую сгенерировать его, масштабируя «мышь» в соответствии с величиной «выделения». Математика для этого более проста, ИМХО.

Если вы хотите придерживаться подхода генерации «указателя выделения», вращая «выделение» в соответствии с углом «мыши», то вам нужно исправить две основные вещи. Ваш текущий код поворачивает «мышь» на текущий угол «мыши». Часть исправления заключается в том, чтобы вместо этого вращать «выделение»; другая часть исправления заключается в повороте на разницу между текущими углами "мыши" и "выделения".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...