Привет я использую этот код C# для вращения полигонов в моем приложении - они действительно вращаются, но также и скашиваются по пути, который не является тем, что я хочу произойти. Все полигоны являются прямоугольниками с четырьмя углами, определенными как 2D Векторы,
public Polygon GetRotated(float radians)
{
Vector origin = this.Center;
Polygon ret = new Polygon();
for (int i = 0; i < points.Count; i++)
{
ret.Points.Add(RotatePoint(points[i], origin, radians));
}
return ret;
}
public Vector RotatePoint(Vector point, Vector origin, float angle)
{
Vector ret = new Vector();
ret.X = (float)(origin.X + ((point.X - origin.X) * Math.Cos((float)angle)) - ((point.Y - origin.Y) * Math.Sin((float)angle)));
ret.Y = (float)(origin.Y + ((point.X - origin.X) * Math.Sin((float)angle)) - ((point.Y - origin.Y) * Math.Cos((float)angle)));
return ret;
}
Похоже, ваше преобразование вращения неверно. Вам следует использовать:
x' = x*Cos(angle) - y*Sin(angle)
y' = x*Sin(angle) + y*Cos(angle)
Для получения дополнительной информации проверьте различные источники в Интернете. :)
У меня пока нет ответа на вопрос, почему он искажается, но у меня действительно есть предложение сделать код более понятным:
public Vector RotatePoint(Vector point, Vector origin, float angle)
{
Vector translated = point - origin;
Vector rotated = new Vector
{
X = translated.X * Math.Cos(angle) - translated.Y * Math.Sin(angle),
Y = translated.X * Math.Sin(angle) + translated.Y * Math.Cos(angle)
};
return rotated + origin;
}
(Предполагается, что В векторе
определены соответствующие операторы +/-.)
Вам может понадобиться несколько приведений к float
, но вы все равно получите меньше скобок, запутывающих вещи. О, и вам определенно не нужно преобразовывать angle
в float
, учитывая, что он уже объявлен как float
.
РЕДАКТИРОВАТЬ: Примечание о задействованных матрицах вращения - это зависит от того, выбираете ли вы угол по часовой стрелке или против часовой стрелки. Я не удивлюсь, если узнаю, что матрица действительно идет не так (я пытался ее проверить, но, видимо, испортился) ... но «другое» не обязательно означает "неправильный". Надеюсь, матрица что не так, правда :)
Думаю, ваша матрица вращения неверна. Во втором уравнении должно быть +
вместо -
:
+cos -sin
+sin +cos
Просто дикое предположение - уверены ли вы, что соотношение сторон разрешения вашего рабочего стола такое же, как у физического экрана? То есть, являются ли пиксели квадратными? Если нет, то при повороте прямоугольников на произвольный угол они могут выглядеть перекошенными.
Предполагая, что происхождение равно 0,0. Из вашей формулы я бы получил: X '= (X + ((X - 0) * Cos (угол)) - ((Y - 0) * Sin (угол))); X '= X + (X * Cos (угол)) - (Y * Sin (угол));
Что отличается от исходной формулы x '= x * cos angle - y * cos angle
Так что я думаю, что ответ Джона Скита правильный и ясный.