Изменение системы координат

альтернативный текст

Мне нужно переключиться с системы координат 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 ответ

Решение

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

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

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

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

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

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

x  -y
y   x

Атан не нужен. На самом деле, нет триггера на всех!

Другие вопросы по тегам