指定距离范围内从参考点生成一系列随机点并生成 xyz 坐标

199 阅读2分钟

用户需要生成一系列随机点及其 xyz 坐标,然后计算距离。假设希望以 2.5 厘米为半径从点 A 创建随机点坐标,以便可以计算 A 到所有生成点(红色)的相互距离和角度。同时,用户希望删除冗余点和所有不满足其条件的点,以及具有相同位置的点。

huake2_00017_.png 2、解决方案 以下提供两种解决方案:

方法一:使用 random 模块

import random as rd
from math import sqrt

# 定义蓝色点坐标
ptBlu = [11, 12, 13]

# 随机生成红色点坐标
ptRedx = ptBlu[0] + rd.randrange(-10, 10, 1)
ptRedy = ptBlu[1] + rd.randrange(-10, 10, 1)
ptRedz = ptBlu[2] + rd.randrange(-10, 10, 1)
ptRed = [ptRedx, ptRedy, ptRedz]

# 定义红色点列表
redptlist = []
xredptlist = []
yredptlist = []
pointcounter = 0

# 定义最小距离和最大距离
mindist = 2.5
maxdist = 12
maxc = int(sqrt((maxdist**2)/2))

# 循环生成红色点的坐标,直到达到指定数量
while True:
    if pointcounter < 20:
        x_RedPtshift = rd.randrange(-maxc, maxc, 1)
        y_RedPtshift = rd.randrange(-maxc, maxc, 1)
        if sqrt(x_RedPtshift**2 + y_RedPtshift**2) > mindist:
            ptRedx = ptBlu[0] + x_RedPtshift
            ptRedy = ptBlu[1] + y_RedPtshift
            ptRed = [ptRedx, ptRedy]
            if ptRed not in redptlist:
                redptlist.append(ptRed)
                xredptlist.append(ptRedx)
                yredptlist.append(ptRedy)
                pointcounter += 1
    else:
        break

# 绘制结果
import matplotlib.pyplot as plt
plt.plot(ptBlu[0], ptBlu[1], 'bo')
plt.plot(xredptlist, yredptlist, 'ro')
minCircle = plt.Circle((ptBlu[0], ptBlu[1], 1), mindist, color='b', fill=False)
maxCircle = plt.Circle((ptBlu[0], ptBlu[1], 1), maxdist, color='r', fill=False)
fig = plt.gcf()
fig.gca().add_artist(minCircle)
fig.gca().add_artist(maxCircle)
plt.axis([-3, 25, -1, 25])
plt.axes().set_aspect('equal', 'box')
plt.grid(True)
plt.show()

方法二:使用极坐标

import random as rd
from math import sqrt, cos, sin

# 定义蓝色点坐标
ptBlu = [11, 12, 13]

# 随机生成红色点坐标
dist = rd.uniform(2.5, 12)
yaw = rd.uniform(0, 2 * 3.1415926535)
pitch = rd.uniform(0, 2 * 3.1415926535)

# 将极坐标转换为笛卡尔坐标
ptRedx = ptBlu[0] + dist * cos(yaw) * cos(pitch)
ptRedy = ptBlu[1] + dist * sin(yaw) * cos(pitch)
ptRedz = ptBlu[2] + dist * sin(pitch)
ptRed = [ptRedx, ptRedy, ptRedz]

# 定义红色点列表
redptlist = []
xredptlist = []
yredptlist = []
pointcounter = 0

# 循环生成红色点的坐标,直到达到指定数量
while pointcounter < 20:
    dist = rd.uniform(2.5, 12)
    yaw = rd.uniform(0, 2 * 3.1415926535)
    pitch = rd.uniform(0, 2 * 3.1415926535)
    ptRedx = ptBlu[0] + dist * cos(yaw) * cos(pitch)
    ptRedy = ptBlu[1] + dist * sin(yaw) * cos(pitch)
    ptRedz = ptBlu[2] + dist * sin(pitch)
    ptRed = [ptRedx, ptRedy, ptRedz]
    if ptRed not in redptlist:
        redptlist.append(ptRed)
        xredptlist.append(ptRedx)
        yredptlist.append(ptRedy)
        pointcounter += 1

# 绘制结果
import matplotlib.pyplot as plt
plt.plot(ptBlu[0], ptBlu[1], 'bo')
plt.plot(xredptlist, yredptlist, 'ro')
minCircle = plt.Circle((ptBlu[0], ptBlu[1], 1), 2.5, color='b', fill=False)
maxCircle = plt.Circle((ptBlu[0], ptBlu[1], 1), 12, color='r', fill=False)
fig = plt.gcf()
fig.gca().add_artist(minCircle)
fig.gca().add_artist(maxCircle)
plt.axis([-3, 25, -1, 25])
plt.axes().set_aspect('equal', 'box')
plt.grid(True)
plt.show()