代码之家  ›  专栏  ›  技术社区  ›  JoshuaBox

在三维空间中找到与质心等距的4个点,其中所有点位于预定义平面上

  •  0
  • JoshuaBox  · 技术社区  · 7 年前

    我有一个定义为xyz向量的平面和一个位于该平面上的点。

    我想为4个点生成xyz坐标( N_points )在定义点周围的平面上( centroid r ).

    我当前的解决方案仅适用于2D。我想把这个扩展到3D领域,但我的几何知识让我失望。任何想法都将不胜感激。

    def circlePoints(r, N_points, plane=(1,1,1), centroid=(0,0,0), rotation=0):
        (plane_x, plane_y, plane_z) = plane
        (centroid_x, centroid_y, centroid_z) = centroid
    
        step = (np.pi*2) / N_points
        rot=rotation
        i=0
        points=[]
        for i in xrange(N_points):
            x = round(centroid_x + ((np.sin(rot)*r) / plane_x), 2)
            y = round(centroid_y + ((np.cos(rot)*r) / plane_y), 2)
            z=0 #?
            points.append((x,y,z))
            rot+=step
        return points
    
    print circlePoints(1, 4, [1,2,0], [2,3,1])
    print circlePoints(1, 4)
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   meowgoesthedog    7 年前

    我们需要找到 plane (正常)。我们可以通过以下程序实现:

    • 飞机
    • k = (1, 0, 0)
    • 计算 math.abs(np.dot(k, plane))
    • 如果(>);0.9然后设置 k = (0, 1, 0)
    • a = np.cross(k, plane)) b = np.cross(plane, a)
    • 现在平面上有两个向量。你可以通过将这两个向量的几倍相加,再加上 centeroid
    • 如果需要特定距离,则需要归一化 a b

    代码:

    import numpy as np
    import math
    
    def normalize(a):
        b = 1.0 / math.sqrt(np.sum(a ** 2))
        return a * b
    
    def circlePoints(r, N_points, plane=(1,1,1), centroid=(0,0,0)):
        p = normalize(np.array(plane))
        k = (1, 0, 0)
        if math.fabs(np.dot(k, p)) > 0.9:
            k = (0, 1, 0)
        a = normalize(np.cross(k, p))
        b = normalize(np.cross(p, a))
        step = (np.pi * 2) / N_points
        ang = [step * i for i in xrange(N_points)]
        return [(np.array(centroid) + \
                r * (math.cos(rot) * a + math.sin(rot) * b)) \
                for rot in ang]
    
    print circlePoints(10, 5, (1, 1, 1), (0, 0, 0))