離散的なx、y、z空間を想像してみてください。ある点から半径方向の距離の球内にあるすべての点を返すイテレータを作成しようとしています。
私のアプローチは、最初に必要なすべてのポイントを含むことが保証されている大きな立方体内のすべてのポイントを調べてから、遠すぎるポイントをカリングまたはスキップすることでした。
私の最初の試みは:
x,y,z=(0,0,1)
dist=2
#this doesn't work
it_0=((x+xp,y+yp,z+zp) for xp in range(-dist,dist+1) for yp in range(-dist,dist+1) for zp in range(-dist,dist+1) if ( ((x-xp)**2+(y-yp)**2+(z-zp)**2) <= dist**2+sys.float_info.epsilon ) )
シンプルな
for d,e,f in it_0:
#print(d,e,f)
print( ((x-d)**2+(y-e)**2+(z-f)**2) <= dist**2+sys.float_info.epsilon, d,e,f)
it_0が正しい結果を生成しないことを確認します。私はそれが3番目の(すなわち:z)'for'節にのみ条件を適用していると信じています
次の作品:
it_1=((x+xp,y+yp,z+zp) for xp in range(-dist,dist+1) for yp in range(-dist,dist+1) for zp in range(-dist,dist+1))
it_2=filter( lambda p: ((x-p[0])**2+(y-p[1])**2+(z-p[2])**2) <= dist**2+sys.float_info.epsilon, it_1)
すべてのポイントを収集し、条件に適合しないポイントをフィルタリングします。
最初に試みた実装を修正する方法、またはこれらの式をより読みやすくコンパクトにする方法があるのではないかと期待していました。