Помогите с этим вопросом - PullRequest
0 голосов
/ 17 августа 2010

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

void CGlEngineFunctions::RotateAroundPointRad( const POINTFLOAT &center, const POINTFLOAT &in, POINTFLOAT &out, float angle )
{
 //x' = cos(theta)*x - sin(theta)*y
 //y' = sin(theta)*x + cos(theta)*y

 POINTFLOAT subtr;
 subtr.x = in.x - center.x;
 subtr.y = in.y - center.y;

 out.x = cos(angle)*subtr.x - sin(angle)*subtr.y;
 out.y = sin(angle)*subtr.x + cos(angle)*subtr.y;

 out.x += center.x;
 out.y += center.y;
}

где POINTFLOAT просто

struct POINTFLOAT {
float x;
float y;
}

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

Store original points
Rotate Original points
Copy result
Show Result
Rotate Original points
Copy result
Show Result....

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

* центр никогда не изменится, пока мышь не поднимется, так что это не проблема

Спасибо

Ответы [ 2 ]

1 голос
/ 17 августа 2010

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

1 голос
/ 17 августа 2010

Итак, вместо сохранения предыдущей точки, вы бы предпочли сохранить предыдущий угол?

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

Пересмотрите этот код через 6 месяцев, и вы удивитесь, почемуВы потратили все это время, тратя время на тригонометрию, чтобы спасти один поплавок.

My 2 ¢.Тем не менее, это интересная триггерная проблема:)

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