2016-12-22 2 views
-1

Я пытаюсь повернуть матрицу (MxN) на 45 градусов. Например:Поверните матрицу (2D-массив) на 45 градусов в C++

|a|b|c|d|e| 
|f|g|h|i|j| 
|k|l|m|n|o| 

бы быть повернут на это:

| | |a| | | | | 
| |f| |b| | | | 
|k| |g| |c| | | 
| |l| |h| |d| | 
| | |m| |i| |e| 
| | | |n| |j| | 
| | | | |o| | | 

Любая помощь очень ценится! EDIT: Мой взгляд на проблему.

Я думал об этом, и это формула я закончил с: F (I, J) = (I + J, м-1-я + J)

Но проблема я бегу в, если бы я должен был сделать это вращение 2 раза, я бы не получил поворот на 90 градусов.

+0

@Raw N я должен выпрямить функцию, которая делает это – Saizaku

+0

Вы должны представить работу, которую вы сделано до сих пор. В разделе [help section] (http://stackoverflow.com/help) вы охвачены. –

+0

@RawN 'std :: rotate' не дает того же результата, что требует OP. –

ответ

1

Если вы хотите, чтобы повернуть точку (х, у) на 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.

+0

Я пришел к одному и тому же выводу: работа вокруг меня придумала, что у меня есть отдельная функция, которая будет вращать ее на 90 градусов, поэтому, если мне потребуется поворот на 125 градусов, я бы повернул ее на 90 и на 45 градусов – Saizaku

Смежные вопросы