Изменение системы координат - PullRequest
0 голосов
/ 30 июня 2010

alt text

Мне нужно переключиться с системы координат XY, показанной выше, на систему координат X'Y 'с помощью System :: Drawing :: Drawing2D (то есть GDI +).Вот что я имею в виду:

float rotation =                    // +90 below is because AB is the new vertical...
    Math::Atan2(pB.Y - pA.Y, pB.X - pA.X) * 180.0 / Math::PI + 90.0f;

Matrix m;
m.Translate(pA.X, pA.Y);
m.Rotate(rotation);
m.Invert();

array<PointF> points = gcnew array<PointF>{ pC };
m.TransformPoints(points);

Есть ли способ сделать это, минимизируя ошибки округления?Могу ли я избежать вызова Atan2 (или другой обратной тригонометрической функции) здесь?

1 Ответ

3 голосов
/ 30 июня 2010

Я не знаком с gdi +, но в принципе вы можете сделать это без обратного триггера или инверсии оператора.(Я говорю «инверсия оператора» вместо «инверсия матрицы», потому что это Matrix не выглядит для меня матрицей.)

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

Matrix m;
m.Rotate(-rotation);
m.Translate(-pA.X, -pA.Y);

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

cos(theta)  -sin(theta)
sin(theta)   cos(theta)

и вывычисление тета с использованием atan (y / x).Но если вам нужны грех и cos, вы можете просто нормализовать x и y и использовать их напрямую:

x  -y
y   x

Нет необходимости в atan. На самом деле триггера вообще нет!

...