在 3D 中将 3 个多边形放在一起
Position 3 polygons together in 3D
给定 3 个多边形,它们都被定义为平面(从侧面看,它们没有与其余部分不一致的点,因此它们本质上是 3D 中的 2D 形状 space),恰好由 4点,凸面和附加信息,每个多边形在恰好两个点处附加到另外两个...
从拥有这些多边形"laying flat"开始,即:它们的值都位于 x,y 平面上并且 Z 值都为 0...
...我如何找出如何在 3D 中定位这些多边形 space 以便它们在连接点处连接?
标记多边形 A、B、C。Select A 使得 B 和 C 在折叠之前已经各自共享一条边,并认为它在整个变换过程中保留在 X-Y 平面中。
在折叠之前,要么恰好有一个点连接了所有三个多边形,要么没有(在这种情况下,折叠后生成的形状包含一个穿过它的孔)。
在前一种情况下,考虑第 (d) 点。折叠后,连接到它的边之一将由 B 和 C 共享。设 e 为 B 上与 d 共享边但不接触 A 的点。类似地 f 用于 C。折叠后,e 和 f 是同一点。考虑通过围绕 A 和 B 共享的边旋转 e 来描述的圆,类似地对于 f 围绕 A 和 C 共享的边旋转。圆恰好相交于两点(一个在 X-Y 平面上方,一个在 X-Y 平面下方)。写出圆方程,求解,任意select两解之一。现在,B 和 C 围绕它们与 A 共享的边旋转的角度,网格的其余部分完全受约束。
在后一种情况下,找到 A 的一条边,使一端连接到 B,另一端连接到 C。和以前一样,考虑 B 和 C 上与这些点共享边但不与 A 共享边的点,旋转关于 A 的边缘并求解交点。
画个图;有帮助。
我假设您希望所有的多边形在一个点上相交。下面是如何解决三角形的问题(它可以很容易地适用于四边形)。
假设在 2D 世界中,您的三角形已经排列成相应的两对边彼此相邻,并且三角形的公共点是原点。换句话说,设 O 为原点,我们有 A、B、C、D 点,因此我们的三个三角形是 AOB、BOC 和 COD。 (您总是可以应用一些转换来解决这种情况。)现在的任务是通过 "folding up" 三角形将 OA 与 OD(假设它们具有相同的长度)对齐。*这是您将在伪代码中执行的操作:
assert(length(OA) == length(OD))
let L_A = line through A perpendicular to OB
let L_D = line through D perpendicular to OC
let E = intersection of L_A and L_D
let z = sqrt(length(OA) * length(OA) - length(OE) * length(OE))
let O' = (0, 0, 0), B' = (B.x, B.y, 0), C' = (C.x, C.y, 0)
let A' = (E.x, E.y, z)
那么,A'O'B'
对应AOB
,B'O'C'
对应BmOC
,C'O'A'
对应COD
.
*注意:只有当角度 AOB、BOC 和 COD 之和小于 360 时才有可能。
给定 3 个多边形,它们都被定义为平面(从侧面看,它们没有与其余部分不一致的点,因此它们本质上是 3D 中的 2D 形状 space),恰好由 4点,凸面和附加信息,每个多边形在恰好两个点处附加到另外两个...
从拥有这些多边形"laying flat"开始,即:它们的值都位于 x,y 平面上并且 Z 值都为 0...
...我如何找出如何在 3D 中定位这些多边形 space 以便它们在连接点处连接?
标记多边形 A、B、C。Select A 使得 B 和 C 在折叠之前已经各自共享一条边,并认为它在整个变换过程中保留在 X-Y 平面中。
在折叠之前,要么恰好有一个点连接了所有三个多边形,要么没有(在这种情况下,折叠后生成的形状包含一个穿过它的孔)。
在前一种情况下,考虑第 (d) 点。折叠后,连接到它的边之一将由 B 和 C 共享。设 e 为 B 上与 d 共享边但不接触 A 的点。类似地 f 用于 C。折叠后,e 和 f 是同一点。考虑通过围绕 A 和 B 共享的边旋转 e 来描述的圆,类似地对于 f 围绕 A 和 C 共享的边旋转。圆恰好相交于两点(一个在 X-Y 平面上方,一个在 X-Y 平面下方)。写出圆方程,求解,任意select两解之一。现在,B 和 C 围绕它们与 A 共享的边旋转的角度,网格的其余部分完全受约束。
在后一种情况下,找到 A 的一条边,使一端连接到 B,另一端连接到 C。和以前一样,考虑 B 和 C 上与这些点共享边但不与 A 共享边的点,旋转关于 A 的边缘并求解交点。
画个图;有帮助。
我假设您希望所有的多边形在一个点上相交。下面是如何解决三角形的问题(它可以很容易地适用于四边形)。
假设在 2D 世界中,您的三角形已经排列成相应的两对边彼此相邻,并且三角形的公共点是原点。换句话说,设 O 为原点,我们有 A、B、C、D 点,因此我们的三个三角形是 AOB、BOC 和 COD。 (您总是可以应用一些转换来解决这种情况。)现在的任务是通过 "folding up" 三角形将 OA 与 OD(假设它们具有相同的长度)对齐。*这是您将在伪代码中执行的操作:
assert(length(OA) == length(OD))
let L_A = line through A perpendicular to OB
let L_D = line through D perpendicular to OC
let E = intersection of L_A and L_D
let z = sqrt(length(OA) * length(OA) - length(OE) * length(OE))
let O' = (0, 0, 0), B' = (B.x, B.y, 0), C' = (C.x, C.y, 0)
let A' = (E.x, E.y, z)
那么,A'O'B'
对应AOB
,B'O'C'
对应BmOC
,C'O'A'
对应COD
.
*注意:只有当角度 AOB、BOC 和 COD 之和小于 360 时才有可能。