0

我有一门课,它定义了水滴如何在 3 维空间中移动。

我需要比较每个液滴的位置,以确定它们是否在一定时间后相互碰撞。我定义它们的位置的方式是使用三个值,x, y, z。每个值都是水滴的一个属性。

我有大量的水滴放入阵列中。我的代码如何在不重复比较的情况下比较所有这些,因为如果它们碰撞会形成更大的液滴?

4

2 回答 2

3

您可能希望调查octrees的用法。通过将您的点保持在八叉树中,您可以大大减少您必须进行的比较次数(因为您已经知道某些点绝对不会与其他点发生冲突)。

于 2012-07-13T22:51:03.003 回答
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)
于 2012-07-13T22:59:14.110 回答