Изменение системы координат
Мне нужно переключиться с системы координат 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
Атан не нужен. На самом деле, нет триггера на всех!