Bos*_*ash 1 python 3d geometry
我有几个平面多边形,由它们在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]
Run Code Online (Sandbox Code Playgroud)
但我希望他们看起来像这样:
v1 = [0, 0]
v2 = [0, 1]
v3 = [1, 1]
v4 = [1, 0]
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如何将每个顶点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
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
然后你规范化计算的局部轴locx和locy
locx /= locx.length()
locy /= locy.length()
Run Code Online (Sandbox Code Playgroud)
最后点的本地坐标很简单
local_coords = [(dot(p - loc0, locx), # local X coordinate
dot(p - loc0, locy)) # local Y coordinate
for p in points]
Run Code Online (Sandbox Code Playgroud)
dot标量乘积运算符在哪里:
def dot(a, b):
return a.x*b.x + a.y*b.y + a.z*b.z
Run Code Online (Sandbox Code Playgroud)
要从本地坐标(Lx, Ly)返回3D,转换是
p = loc0 + Lx*locx + Ly*locy
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1911 次 |
| 最近记录: |