Skip to main content
 首页 » 编程设计

python之获取 3D 空间中平面多边形顶点的局部 2D 坐标

2025年05月04日9mengfanrong

我有几个平面多边形,它们由 3D 空间中的顶点定义。这些多边形在 3 个维度上随机旋转。

现在我想在它们自己的局部 2D 空间中处理这些多边形顶点中的每一个。我真的不在乎这个局部空间的中心在哪里。我只需要 x 和 y 轴与多边形法线正交。

例如,如果我有一个宽度和高度为 1 的矩形多边形,顶点可能如下所示:

v1 = [-0.558013, -0.0334937, -0.433013] 
v2 = [0.308013, 0.466506, -0.433013] 
v3 = [-0.308013, -0.466506, 0.433013] 
v4 = [0.558013, 0.0334937, 0.433013] 

但我希望它们看起来像这样:

v1 = [0, 0] 
v2 = [0, 1] 
v3 = [1, 1] 
v4 = [1, 0] 

所以我的问题是,如何将每个顶点的 3D 坐标转换为局部 2D 坐标?

请您参考如下方法:

首先考虑多边形的三个非共线点 p0、p1 和 p2,然后计算

loc0 = p0                       # local origin 
locx = p1 - loc0                # local X axis 
normal = cross(locx, p2 - loc0) # vector orthogonal to polygon plane 
locy = cross(normal, locx)      # local Y axis 

其中 cross 是叉积运算符:

def cross(a, b): 
    return P3d(a.y*b.z - a.z*b.y, 
               a.z*b.x - a.x*b.z, 
               a.x*b.y - a.y*b.x) 

然后将计算出的局部轴 locx 和 locy 归一化

locx /= locx.length() 
locy /= locy.length() 

最后点的局部坐标很简单

local_coords = [(dot(p - loc0, locx),  # local X coordinate 
                 dot(p - loc0, locy))  # local Y coordinate 
                for p in points] 

其中点是标量乘积运算符:

def dot(a, b): 
    return a.x*b.x + a.y*b.y + a.z*b.z 

要从局部坐标 (Lx, Ly) 返回到 3D,变换是

p = loc0 + Lx*locx + Ly*locy