Python检查点是否在中心x,y,z的球体中

时间:2014-11-08 15:33:02

标签: python

我试图检查一个点是否在一个球体中,其中心点为(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)的中心。我知道有一种方法可以做到这一点,但它需要几行代码,我宁愿在一个代码中完成。我会在另一个问题的答案评论中提出这个问题,但我还不准评论答案。

2 个答案:

答案 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