Если вы хотите, чтобы повернуть точку (х, у) на 45 ° следует использовать формулу
x' = cos(45°) * x - sin(45°) * y
y' = sin(45°) * x + cos(45°) * y
Теперь мы знаем, Cos (45 °) = sin (45 °) = 1/SQRT (2). Поэтому, если (x, y) целые координаты, то (x ', y') не будут целыми числами из-за фактора sqrt (2).
Если вы хотите повернуть элементы в матрице, чтобы точки лежали в матрице, вы фактически хотите повернуть целочисленные координаты в целые координаты (взяв центральную точку h в качестве источника). Поэтому в некотором смысле вы спрашиваете невозможное.
Существует два способа обойти это.
1) Отбросить требование для целых координат. Невозможно, если вы хотите поместить результаты в массив. Если массив представляет пиксели изображения, это то, что вы сделали бы. После поворота вам необходимо вычислить полученные значения пикселей, усреднив окружающие пиксели.
2) Умножьте результаты по масштабному коэффициенту sqrt (2). Это в основном то, что вы сделали. Если вы вычисляете расстояние в вашей повернутой сетке с помощью Pythagoras, то расстояния соседних точек будут sqrt (2).
Если вы повторите это дважды, вы обнаружите, что расстояния будут удвоены.
Одним из возможных решений было бы использовать алгоритм, а затем разделить все координаты на 2.
@Raw N я должен выпрямить функцию, которая делает это – Saizaku
Вы должны представить работу, которую вы сделано до сих пор. В разделе [help section] (http://stackoverflow.com/help) вы охвачены. –
@RawN 'std :: rotate' не дает того же результата, что требует OP. –