2016-08-15 71 views
1

给定3个多边形,这些多边形全部被定义为平坦的(当从侧面看时,它们没有与其余部分不一致的点,因此基本上它们是3D空间中的2D形状),由4点,凸和附加信息,每个聚合附加到其他两个在每个正好两个点...在3D中放置3个多边形

从这些多边形“铺平”开始,即:它们的值都位于x,y飞机和所有的Z值为0 ...

...我怎么能解决如何定位这些多边形在三维空间,使他们连接在他们的连接点?

回答

1

标注多边形A,B,C。选择A,使B和C在折叠之前已经与它共享一条边,并在整个转换过程中将其视为保留在X-Y平面中。

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

在前一种情况下,考虑点(d)。折叠后,连接到其上的一条边将由B和C共享。设e是B上与d共享边但不碰A的点。对于C同样f。在折叠后,e和f是相同的点。考虑通过围绕由A和B共享的边缘旋转e所描述的圆,并且类似地针对由A和C共享的边缘的f。这些圆恰好在两个点(在X-Y平面之上一个和一个)之间相交。写出圆方程,求解并任意选择两个解中的一个。现在您已经知道B和C围绕与A共享的边缘旋转的角度,而网格的其余部分完全受到限制。

在后一种情况下,找到A的边缘,使一端连接到B,另一端连接到C.与之前一样,考虑B和C上与这些点共享边但不与A旋转的点A的边缘并求解相交。

绘制图表;它有助于。

+0

谢谢。你会有解决这些角度的代码吗?在三个维度上做这件事打我。 –

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'对应于BmOC,和C'O'A'对应于COD

*注意:只有角度AOB,BOC和COD总和小于360时才可以。