我有一门课,它定义了水滴如何在 3 维空间中移动。
我需要比较每个液滴的位置,以确定它们是否在一定时间后相互碰撞。我定义它们的位置的方式是使用三个值,x
, y
, z
。每个值都是水滴的一个属性。
我有大量的水滴放入阵列中。我的代码如何在不重复比较的情况下比较所有这些,因为如果它们碰撞会形成更大的液滴?
我有一门课,它定义了水滴如何在 3 维空间中移动。
我需要比较每个液滴的位置,以确定它们是否在一定时间后相互碰撞。我定义它们的位置的方式是使用三个值,x
, y
, z
。每个值都是水滴的一个属性。
我有大量的水滴放入阵列中。我的代码如何在不重复比较的情况下比较所有这些,因为如果它们碰撞会形成更大的液滴?
您可能希望调查octrees的用法。通过将您的点保持在八叉树中,您可以大大减少您必须进行的比较次数(因为您已经知道某些点绝对不会与其他点发生冲突)。
可以按位置排序吗?那么你只需要比较相邻的元素......如果你采取的步长很小,你只能每隔几步排序一次并比较相邻的几个液滴,必要时合并。
import numpy as np
def merge(p1,p2):
#somehow merge particles. With real particles, mass might matter too,
#but my particles only have position :-)
return (p1+p2)/2 #average location of particles.
def merge_particles(particles,merge_dist_squared):
#Merge particles in 1 pass through the list
#This will always work if the particles are sorted in order
#It will fail if the particles aren't sorted well enough.
i=1
output=[]
prev=particles[0] #location of previous (first) particle
while i<(len(particles)):
dist_vec=(particles[i]-prev)
dist_squared=np.dot(dist_vec,dist_vec)
if dist_squared > merge_dist_squared: #particle isn't close enough to merge
output.append(prev)
prev=particles[i]
else: #particle is close enough to merge
prev=merge(prev,particles[i])
i+=1
output.append(prev) #Have to make sure we add the last particle.
return output
#create N particles:
N=1000
particles=[np.random.random(3) for x in xrange(N)]
particles.sort(key=tuple) #sort particles based on position.
particles=merge_particles(particles,0.1**2)
print len(particles)