У меня пока нет ответа на вопрос, почему происходит перекос, но у меня нет есть предложение сделать код более понятным:
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;
}
(при условии, что в Vector
определены соответствующие операторы +/-.)
Возможно, вам все еще понадобится пара приведений к float
, но у вас все равно останется меньше скобок, запутывающих вещи. О, и вам определенно не нужно привести angle
к float
, учитывая, что он уже объявлен как float
.
РЕДАКТИРОВАТЬ: примечание о задействованных матрицах вращения - это зависит от того, берете ли вы угол по часовой стрелке или против часовой стрелки. Я совсем не удивлюсь, если узнаю, что матрица действительно идет не так (я пытался это проверить, но, по-видимому, испортил) ... но «другое» не означает обязательно"неправильно". Надеюсь, матрица это что не так, по общему признанию:)