我想使用meshgrid在极坐标中工作。 首先,我必须确定与原点位于的θ角 在网格网格的中间,这不是问题,我将网格网格分成4个部分 为了确定角度,你可以在下面看到。
现在我想应用所选角度的地标旋转,所以我尝试改变"地标"用" XAprim"和#34; YAprim"但是使用4个部分并不容易......我认为这不是最简单的方法......
import numpy as np
import matplotlib.pyplot as plt
Lx=1345.
Ly=1428.
x0 = Lx/2.
y0 = Ly/2.
YA, XA = np.mgrid[0:Ly, 0:Lx]
Theta1 = np.arctan((YA-y0)/(XA-x0))
Theta2 = np.pi/2*np.ones((YAp.shape[0], YA.shape[1]))
Theta3 = 3*np.pi/2*np.ones((YA.shape[0], YA.shape[1]))
mask = np.fromfunction(lambda i, j: (i >= y0) * (j > (x0)), (XA.shape[0], XA.shape[1]), dtype=int)
test = np.invert(mask)
V1_test1 = np.ma.array(-Theta1, mask=test)
mask2 = np.fromfunction(lambda i, j: (i >= y0) * (j < (x0)), (XA.shape[0], XA.shape[1]), dtype=int)
test2 = np.invert(mask2)
V1_test2 = np.ma.array(-Theta1 - np.pi, mask=test2) #Entaille
mask3 = np.fromfunction(lambda i, j: (i < y0) * (j > (x0)), (XA.shape[0], XA.shape[1]), dtype=int)
test3 = np.invert(mask3)
V1_test3 = np.ma.array(-Theta1, mask=test3)
mask4 = np.fromfunction(lambda i, j: (i < y0) * (j <(x0)), (XA.shape[0], XA.shape[1]), dtype=int)
test4 = np.invert(mask4)
V1_test4 = np.ma.array((-Theta1 + np.pi), mask=test4) #Entaille
mask5 = np.fromfunction(lambda i, j: (i > y0) * (j==x0), (XA.shape[0], XA.shape[1]), dtype=int)
test5 = np.invert(mask5)
Theta2 = np.pi/2*np.ones((YA.shape[0], YA.shape[1]))
V1_test5 = np.ma.array(Theta2, mask=test5)
mask6 = np.fromfunction(lambda i, j: (i < y0) * (j==x0), (XA.shape[0], XA.shape[1]), dtype=int)
test6 = np.invert(mask6)
Theta3 = -np.pi/2*np.ones((YA.shape[0], YA.shape[1]))
V1_test6 = np.ma.array(Theta3, mask=test6)
a = np.ma.filled(V1_test1, 0)
b = np.ma.filled(V1_test2, 0)
c = np.ma.filled(V1_test3, 0)
d = np.ma.filled(V1_test4, 0)
e = np.ma.filled(V1_test5, 0)
f = np.ma.filled(V1_test6, 0)
theta = (a + b + c + d + e + f)
plt.imshow(theta,aspect='auto',cmap=plt.cm.hot)
plt.colorbar()
plt.show()
所以我得到了这个期望的meshgrid:
现在,我想申请一个轮换,因为地标的起源 作为一个23度角的例子,我计算新的坐标来做改变,但由于角度的4个部分做同样的事情...所以我想知道是否有更有效的方法处理这个问题?
ang_rot = 23*np.pi/180.
XAprim = XA*np.cos(ang_rot)+YA*np.sin(ang_rot)
YAprim = -XA*np.sin(ang_rot)+YA*np.cos(ang_rot)
Theta1 = np.arctan((YAprim-y0)/(XAprim-x0))
plt.imshow(Theta1,aspect='auto',cmap=plt.cm.hot)
plt.colorbar()
plt.show()
答案 0 :(得分:1)
所以解决方案是:
import numpy as np
import matplotlib.pyplot as plt
Lx=1345.
Ly=1428.
x0 = Lx/2.
y0 = Ly/2.
YA, XA = np.mgrid[0:Ly, 0:Lx]
XA = XA - x0
YA = YA - y0
ang_rot = 23*np.pi/180.
XAprim = XA*np.cos(ang_rot) - YA*np.sin(ang_rot)
YAprim = XA*np.sin(ang_rot) + YA*np.cos(ang_rot)
Theta1 = np.arctan2((YAprim),(XAprim))*-180./np.pi
plt.imshow(Theta1,aspect='auto',cmap=plt.cm.hot)
plt.colorbar()
plt.show()