所以,让我们说我有以下矩阵/数组 -
[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表示,在大网格中,表示之间的差异会更小。
答案 0 :(得分:1)
首先,在非90度的角度下旋转这样的形状只有1和0,并不是真的会像原来一样,当它完成时在如此低的分辨率下#34;但是,我建议调查rotation matrices。就像你说的那样,你可能想要找到每个值作为坐标对,并围绕中心旋转它。如果你把它变成一个二维数组可能会更容易。祝你好运!
答案 1 :(得分: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大得多,并且原点应该(最佳地)在数组的中间。