类似问题:
生成N个随机点,使它们之间的预定义距离为delta
但它们要么是用matlab编写的,要么不能完全满足所需任务。
我必须在长度为10 Angstrom的立方体内创建N个点,使任意两个点之间的距离大于delta。
例如:
假设我在x、y、z轴上有一个长度为10 Angstrom的盒子。
我想在此框内放置200个随机点,以使任意两点之间的最小距离大于3 Angstrom。
尝试:
#!python
# -*- coding: utf-8 -*-#
import numpy as np
np.random.seed(100)
np.set_printoptions(2)
box_length = 10
d = box_length
threshold = 6
num_points = 5
x1, y1, z1 = np.random.random(num_points)* box_length, np.random.random(num_points)* box_length, np.random.random(num_points)* box_length
x2, y2, z2 = np.random.random(num_points)* box_length, np.random.random(num_points)* box_length, np.random.random(num_points)* box_length
# print(len(x1))
# just for checking make ponts integers
for i in range(len(x1)):
x1[i] = int(x1[i])
x2[i] = int(x2[i])
y1[i] = int(y1[i])
y2[i] = int(y2[i])
z1[i] = int(z1[i])
z2[i] = int(z2[i])
print(x1)
print(y1)
print(z1)
print("\n")
pt1_lst = []
pt2_lst = []
for i in range(len(x1)):
a, b, c = x1[i], y1[i], z1[i]
a2, b2, c2 = x2[i], y2[i], z2[i]
dist2 = (a-a2)**2 + (b-b2)**2 + (c-c2)**2
print("\n")
print(a,b,c)
print(a2,b2,c2)
print(dist2)
if dist2 > threshold**2:
pt1 = (a,b,c)
pt2 = (a2,b2,c2)
pt1_lst.append(pt1)
pt2_lst.append(pt2)
print("points")
print(pt1_lst)
print(pt2_lst)
代码问题:
这段代码比较了从points1到points2的点,但没有在points1和points2内部进行比较。也许有更好的算法来解决这个问题,向那些想出了解决方案的人致敬。
谢谢。 附言: 我做了一些研究并尝试找到相关链接,但无法解决问题。 仍然有一些相关链接: 更新: 我尝试了下面Stefans的代码,它对于N=10是有效的,但我尝试了N=200,使用的时间非常长(我在10分钟后停止了代码)。
有没有更有效的方法?
真的非常感谢帮助! 使用Python从节点n生成长度为L的所有路径
使用Python在定义的矩形内创建随机点