找到多面体的边集,无需重复

时间:2016-03-03 16:32:30

标签: matlab polyhedra

我有一个多面体,它由一系列顶点定义,它们是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中的一个映射,它将正边缘与它的负面联系起来?

1 个答案:

答案 0 :(得分:0)

使用与编码面相同的方式处理边缘更好:例如,sin(M_PI * angle / 180) 是顶点3和7之间的边。从此表示中,您可以获得仅通过减去这些顶点就可以得到矢量的坐标。

这是一个单行命令,用于从F:

获取唯一的边集
[3 7]

sort的第一个参数是一个矩阵,其中两列包含所有边,并带有重复。然后对其进行排序,以便行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

获取边的坐标形式