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