我有一个课程,定义水滴如何在三维空间中移动。
我需要比较每个液滴的位置,以确定它们是否在一段时间后相互碰撞。我定义其位置的方式有三个值,x
,y
,z
。每个值都是水滴的属性。
我将大量的水滴放入阵列中。我的代码如何在不进行重复比较的情况下比较所有代码,因为如果碰撞会形成更大的液滴?
答案 0 :(得分:3)
您可能希望调查octrees的使用情况。通过将您的积分保持在八叉树中,您可以大大减少您必须进行的比较次数(因为您已经知道某些点肯定不会与其他点发生碰撞)。
答案 1 :(得分:1)
你能根据位置排序吗?然后你只需要比较相邻的元素...如果你采取的步长很小,你只能每隔几步进行一次排序并比较相邻的几个水滴,并根据需要合并。
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)