【发布时间】:2015-02-20 18:03:31
【问题描述】:
我有一个应用程序需要以准随机方式填充“n”个点的磁盘。我希望这些点有点随机,但在磁盘上仍然或多或少有规律的密度。
我目前的方法是放置一个点,检查它是否在磁盘内,然后检查它是否也离所有其他已保存的点足够远。我的代码如下:
import os
import random
import math
# ------------------------------------------------ #
# geometric constants
center_x = -1188.2
center_y = -576.9
center_z = -3638.3
disk_distance = 2.0*5465.6
disk_diam = 5465.6
# ------------------------------------------------ #
pts_per_disk = 256
closeness_criteria = 200.0
min_closeness_criteria = disk_diam/closeness_criteria
disk_center = [(center_x-disk_distance),center_y,center_z]
pts_in_disk = []
while len(pts_in_disk) < (pts_per_disk):
potential_pt_x = disk_center[0]
potential_pt_dy = random.uniform(-disk_diam/2.0, disk_diam/2.0)
potential_pt_y = disk_center[1]+potential_pt_dy
potential_pt_dz = random.uniform(-disk_diam/2.0, disk_diam/2.0)
potential_pt_z = disk_center[2]+potential_pt_dz
potential_pt_rad = math.sqrt((potential_pt_dy)**2+(potential_pt_dz)**2)
if potential_pt_rad < (disk_diam/2.0):
far_enough_away = True
for pt in pts_in_disk:
if math.sqrt((potential_pt_x - pt[0])**2+(potential_pt_y - pt[1])**2+(potential_pt_z - pt[2])**2) > min_closeness_criteria:
pass
else:
far_enough_away = False
break
if far_enough_away:
pts_in_disk.append([potential_pt_x,potential_pt_y,potential_pt_z])
outfile_name = "pt_locs_x_lo_"+str(pts_per_disk)+"_pts.txt"
outfile = open(outfile_name,'w')
for pt in pts_in_disk:
outfile.write(" ".join([("%.5f" % (pt[0]/1000.0)),("%.5f" % (pt[1]/1000.0)),("%.5f" % (pt[2]/1000.0))])+'\n')
outfile.close()
为了获得最均匀的点密度,我所做的基本上是使用另一个脚本迭代地运行此脚本,每次连续迭代都会降低“接近度”标准。在某些时候,脚本无法完成,我只是使用上次成功迭代的点。
所以我的问题相当广泛:有没有更好的方法来做到这一点?我的方法目前还可以,但我的直觉告诉我有更好的方法来生成这样的点场。
输出的图示如下图,一个具有高接近度标准,另一个具有“最低找到”接近度标准(我想要的)。
【问题讨论】:
-
您可以尝试使用 SOBOL 序列en.wikipedia.org/wiki/Sobol_sequence,但您必须使其适应磁盘/圆。他们甚至有一些用于计算 SOBOL 序列的 python 代码people.sc.fsu.edu/~jburkardt/py_src/sobol/sobol.html
-
这是一篇关于这个确切问题的博文,并提供了一个潜在的解决方案。但是,该解决方案与您已经在做的非常相似:mollyrocket.com/casey/stream_0014.html