在python的圆圈中均匀间隔点的生成器

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循环有一个更有效的方法.

非常感谢

Oli*_*yan 6

我想到了.代码如下:

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)


Pru*_*une 0

您确实必须循环遍历所有半径的整个圆,因此您的绘图调用几乎陷入了一些 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)