我试图检查一个点是否在一个球体中,其中心点为(x,y,z),其中(x,y,z)不是(0,0,0)。
此代码用于生成我想要检查的点:
def generatecoords(self, i):
x, y, z = generatepoint()
if i >= 1:
valid = False
while valid == False:
coords = self.checkpoint(x, y, z)
for b in world.starlist:
if coords == world.starlist[b].coords:
coords = self.checkpoint(x, y, z)
else:
valid = True
else:
coords = self.checkpoint(x, y, z)
return coords
def checkpoint(self, x, y, z):
d = math.sqrt(x * x + y * y + z * z)
while d >= self.radius:
x, y, z = generatepoint()
d = math.sqrt(x * x + y * y + z * z)
coords = (int(x), int(y), int(z))
return coords
def generatepoint():
x, y, z = [int(random.uniform(-self.radius, self.radius)) \
for b in range(3)]
return x, y, z
在for循环中调用这些函数来生成字典中的点,同时还检查点不可能放在另一个点之上的可能性(主要是因为我可以)。
我试图找出我需要添加到math.sqrt(x * x + y * y + z * z)
的内容,以便它占据一个不是(0, 0, 0)
的中心。我知道有一种方法可以做到这一点,但它需要几行代码,我宁愿在一个代码中完成。我会在另一个问题的答案评论中提出这个问题,但我还不准评论答案。
答案 0 :(得分:24)
公式为:
点(x,y,z)位于球体内部,中心(cx,cy,cz),半径 r ,如果
( x-cx ) ^2 + (y-cy) ^2 + (z-cz) ^ 2 < r^2
答案 1 :(得分:0)
这是一个非常短的函数,如果该点在球体中,则返回True
,否则返回False
。
输入是两个numpy数组:point = [x,y,z]
和ref = [x,y,z]
,半径应为float
。
import numpy as np
def inSphere(self, point, ref, radius):
# Calculate the difference between the reference and measuring point
diff = np.subtract(point, ref)
# Calculate square length of vector (distance between ref and point)^2
dist = np.sum(np.power(diff, 2))
# If dist is less than radius^2, return True, else return False
return dist < radius ** 2