2015-06-12 5 views
1

Итак, допустим, у меня есть следующая матрица/массив -Есть ли простой способ повернуть значения матрицы/массива?

[0 0 0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 1 1 1 0 0 0 0 0 
    0 0 0 1 1 1 1 0 0 0 0 0 
    0 0 1 1 1 1 1 1 0 0 0 0 
    0 0 1 1 1 1 1 1 0 0 0 0 
    0 0 0 1 1 1 1 0 0 0 0 0 
    0 0 0 0 1 1 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 0 0] 

Было бы довольно тривиально, чтобы написать что-то, что бы перевести эти значения вверх и вниз. Что, если бы я хотел повернуть его на угол, который не кратен 90 градусам? Я знаю, что, очевидно, невозможно получить ту же самую форму (сделанную из 1s) из-за природы сетки. Идея, которая приходит на ум, заключается в преобразовании каждого значения 1 в вектор координат. Тогда это будет означать поворот координат (что должно быть проще) относительно точки. Затем можно было написать что-то, что бы взяло координаты, и сравнить их с матричной сеткой, и если в правом поле есть точка, она будет заполнена. Я знаю, что мне также придется найти центр, вокруг которого можно повернуть.

Это кажется разумным способом сделать это? Если у кого-то есть лучшая идея, я все уши. Я знаю, что с небольшой сеткой, подобной этой, форма, вероятно, будет совершенно иной, однако, если бы у меня была большая форма, представленная 1 сек, то в большой сетке разница между представлениями была бы меньше.

ответ

1

Прежде всего, вращающаяся форма, подобная той, что имеет только 1 и 0, при углах не 90 градусов, на самом деле не будет похожа на оригинал вообще, когда это делается при таком низком «разрешении». Тем не менее, я бы рекомендовал посмотреть на rotation matrices. Как вы сказали, вы, вероятно, захотите найти каждое значение как координатную пару и повернуть его по центру. Было бы легче, если бы вы сделали это двумерным массивом. Удачи!

1

Я думаю, что это должно работать:

from math import sin, cos, atan2, radians 
i0,j0 = 0,0 #point around which you'll rotate 
alpha = radians(3) #3 degrees 

B = np.zeros(A.shape) 
for i,j in np.swapaxes(np.where(A==1),0,1): 
    di = i-i0 
    dj = j-j0 
    dist = (di**2 + dj**2)**0.5 
    ang = atan2(dj,di) 

    pi = round(sin(ang+alpha)*dist) + i0 
    pj = round(cos(ang+alpha)*dist) + j0 
    B[pi][pj] = 1 

Но, пожалуйста, не забывайте о сбое сегментации!

B массив должен быть намного больше, чем A, а начало должно быть (оптимально) в середине массива.