1

给定 3 个多边形,它们都被定义为平面(从侧面看,它们没有与其余部分不相符的点,所以本质上它们是 3D 空间中的 2D 形状),正好由 4 个凸点组成,并带有额外的信息每个多边形都在每个恰好两个点处连接到其他两个...

从让这些多边形“平放”开始,即:它们的值都位于 x,y 平面上,并且 Z 值都为 0...

...我怎样才能确定如何在 3D 空间中定位这些多边形,以便它们在连接点处连接?

4

2 回答 2

1

我将假设您希望所有多边形在一个点相遇。这是解决三角形问题的方法(它可以很容易地适应四边形)。

让我们假设在 2D 世界中,您的三角形已经排列成对应的两对边彼此相邻,并且三角形的公共点是原点。换句话说,以 O 为原点,我们有点 A、B、C、D,所以我们的三个三角形是 AOB、BOC 和 COD。(您总是可以应用一些转换来解决这种情况。)现在的任务是通过“折叠”三角形来对齐 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'对应于AOBB'O'C'对应于BmOCC'O'A'对应于COD

*注意:仅当角度 AOB、BOC 和 COD 总和小于 360 时才有可能。

于 2016-08-17T21:13:16.490 回答
1

标记多边形 A、B、C。选择 A 以使 B 和 C 在折叠之前已经与其共享一条边,并将其视为在整个变换过程中保持在 XY 平面中。

在折叠之前,要么恰好有一个点连接所有三个多边形,要么没有(在这种情况下,折叠后的结果形状包含一个穿过它的孔)。

在前一种情况下,考虑 (d) 点。折叠后,连接到它的边之一将由 B 和 C 共享。设 e 为 B 上与 d 共享一条边但不接触 A 的点。类似地,C 为 f。折叠后,e 和 f 是同一点。考虑通过围绕 A 和 B 共享的边旋转 e 所描述的圆,类似地,围绕 A 和 C 共享的边旋转 f。这些圆恰好在两点相交(一个在 XY 平面上方,一个在 XY 平面下方)。写出圆方程,求解,并在两个解中任意选择一个。现在,您现在 B 和 C 围绕它们与 A 共享的边旋转的角度,并且网格的其余部分被完全约束。

在后一种情况下,找到 A 的一条边,使得一端连接到 B,另一端连接到 C。如前所述,考虑 B 和 C 上与这些点共享边但不与 A 共享边的点,围绕 A 的边旋转并求解交点。

画图;它有助于。

于 2016-08-15T13:45:57.800 回答