3 次元空間で水滴がどのように動き回るかを定義するクラスがあります。
一定時間後に互いに衝突したかどうかを判断するために、すべての液滴の位置を互いに比較する必要があります。私がそれらの位置を定義する方法は、x
、y
、 の3 つの値z
です。各値は水滴の属性です。
配列に配置する多数の水滴があります。衝突するとより大きな液滴を形成する可能性があるため、コードで比較を繰り返さずにすべてを比較するにはどうすればよいですか?
3 次元空間で水滴がどのように動き回るかを定義するクラスがあります。
一定時間後に互いに衝突したかどうかを判断するために、すべての液滴の位置を互いに比較する必要があります。私がそれらの位置を定義する方法は、x
、y
、 の3 つの値z
です。各値は水滴の属性です。
配列に配置する多数の水滴があります。衝突するとより大きな液滴を形成する可能性があるため、コードで比較を繰り返さずにすべてを比較するにはどうすればよいですか?
octreesの使用法を調査することをお勧めします。ポイントを octree に保持することで、必要な比較の数を大幅に減らすことができます (いくつかのポイントが他のポイントと衝突しないことはすでにわかっているため)。
位置に基づいてソートできますか?次に、隣接する要素のみを比較する必要があります...ステップサイズが小さい場合は、数ステップごとに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)