2016-03-03 73 views
1

我有一个多边形,它由一系列顶点(它们是R^3中的向量)和三角形面(由三个顶点的映射定义)组成定义脸部。找到一组多边形的边,没有重复

作为一个例子,这里为V和F

V=[-0.8379 0.1526 -0.0429; 
    -0.6595 -0.3555 0.0664; 
    -0.6066 0.3035 0.2454; 
    -0.1323 -0.3591 0.1816; 
    0.1148 -0.5169 0.0972; 
    0.2875 -0.2619 -0.3980; 
    0.2995 0.4483 0.2802; 
    0.5233 0.2003 -0.3184; 
    0.5382 -0.3219 0.2870; 
    0.7498 0.1377 0.1593] 

F=[2  3  1; 
    7  3  4; 
    3  2  4; 
    7  9 10; 
    10  8  7; 
    9  5  6; 
    9  8 10; 
    1  6  2; 
    7  8  1; 
    2  6  5; 
    8  9  6; 
    5  9  4; 
    9  7  4; 
    4  2  5; 
    7  1  3; 
    6  1  8] 

Euler's formula给面子,边缘之间的关系,和顶点

V-E+F = 2 

我试图找到一套独特的边缘顶点的多面体。我已经可以找到每个面的所有边(每面3个边和每边是两个相邻面的构件)通过执行以下操作

Fa = F(:,1); 
Fb = F(:,2); 
Fc = F(:,3); 


e1=V(Fb,:)-V(Fa,:); 
e2=V(Fc,:)-V(Fb,:); 
e3=V(Fa,:)-V(Fc,:); 

然而,该发现对于每个面的所有边,并且包括重复。面A上的边e_i也是面B上的-e_i。

任何人都有一个很好的方法来找到唯一的一组边(正方向和负方向),或确定e1,e2,e3内的映射将积极的优势与负面联系起来?

回答

0

最好使用与编码面相同的方式编码的边:例如,[3 7]是顶点3和7之间的边。从此表示法中,您可以通过减去那些顶点。

这里是一个行命令是F获得一套独特的边缘:

E = unique(sort([F(:,[1,2]); F(:,[1,3]); F(:,[2,3])], 2), 'rows'); 

排序的第一个参数是有两列持所有边缘,与重复的矩阵。然后它被排序,以便行7 3变成3 7。最后,unique仅返回唯一行。输出:

1  2 
1  3 
1  6 
1  7 
1  8 
2  3 
2  4 
2  5 
2  6 
3  4 
3  7 
4  5 
4  7 
4  9 
5  6 
5  9 
6  8 
6  9 
7  8 
7  9 
7 10 
8  9 
8 10 
9 10 

然后,您可以得到协调边缘的形式coords = V(E(:,1))-V(E(:,2))

+0

只是想最后感谢你的伟大的建议。 直到现在,超过1.5年后,我才开始看到您的方法的效率。 我很感激帮助。 – shanksk