想象一个离散的 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 不会产生正确的结果。我相信它仅将条件应用于第三个(即: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)
它收集所有点,然后过滤那些不符合条件的点。
我希望有一种方法可以纠正第一次尝试的实现,或者使这些表达式更具可读性或更紧凑。