Oli*_*yan 7 python geometry physics generator points
我的任务是在一个看不见的圆的同心环上产生均匀(或多或少)的间隔点.该函数应该采用半径列表,以及给定半径作为参数绘制的点数.例如,对于半径为0,它应该在(0,0)处绘制1点.对于半径为1的圆,它应沿圆的圆周绘制10个点,间隔2pi/10的角度.对于半径为2的圆,沿圆周的20个点,以2pi/20的角度间隔开.
生成器应采用以下参数:
n,r_max,m
并应在半径处生成坐标对的环
对于i = 0,1,..,n,r_i = i*r_max/n.
每个环应具有均匀分布在θ中的n*i个点,其中对于i = 0,n_i = 1; n_i = mi for i> 0
当像这样调用函数时:
for r, t in genpolar.rtuniform(n=10, rmax=0.1, m=6):
plot(r * cos(t), r * sin(t), 'bo')
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所提出的:
def rtpairs(R, N):
R=[0.0,0.1,0.2]
N=[1,10,20]
r=[]
t=[]
for i in N:
theta=2*np.pi/i
t.append(theta)
for j in R:
j=j
r.append(j)
plt.plot(r*np.cos(t),r*np.sin(t), 'bo')
plt.show()
Run Code Online (Sandbox Code Playgroud)
但我很确定使用两个for循环有一个更有效的方法.
非常感谢
我想到了.代码如下:
import numpy as np
import matplotlib.pyplot as plt
T = [1, 10, 20, 30, 40, 50, 60]
R = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
def rtpairs(r, n):
for i in range(len(r)):
for j in range(n[i]):
yield r[i], j*(2 * np.pi / n[i])
for r, t in rtpairs(R, T):
plt.plot(r * np.cos(t), r * np.sin(t), 'bo')
plt.show()
Run Code Online (Sandbox Code Playgroud)
您确实必须循环遍历所有半径的整个圆,因此您的绘图调用几乎陷入了一些 M*N 过程。
代码细节还可以稍微完善一下。对于初学者来说,您的R列表已经包含您想要的值;无需构建具有相同值的新列表。您可以使用简单的列表理解来构建t列表。
这是你想要的吗?
N=[1,10,20]
t = [2*np.pi/i for i in N]
for R in N:
plt.plot(R*np.cos(t),R*np.sin(t), 'bo')
plt.show()
Run Code Online (Sandbox Code Playgroud)