Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 找到多面体的边集,无重复_Matlab_Polyhedra - Fatal编程技术网

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

Matlab 找到多面体的边集,无重复,matlab,polyhedra,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

我有一个多面体,它是由一系列顶点定义的,这些顶点是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]
给出面、边和顶点之间的关系

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中确定将正边链接到负边的映射?

最好使用与面编码相同的编码方式编码的边:例如,
[37]
是顶点3和7之间的边。从这个表示中,只需减去这些顶点,就可以得到向量的坐标

下面是一个单行命令,用于从F获取唯一的边集:

E = unique(sort([F(:,[1,2]); F(:,[1,3]); F(:,[2,3])], 2), 'rows');  
sort的第一个参数是一个矩阵,其中两列包含所有边,并且有重复。然后对其进行排序,使行
73
变为
37
。最后,
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))
获得边的坐标形式。最好使用与面编码相同的编码方式来处理边:例如,
[37]
是顶点3和7之间的边。从这个表示中,只需减去这些顶点,就可以得到向量的坐标

下面是一个单行命令,用于从F获取唯一的边集:

E = unique(sort([F(:,[1,2]); F(:,[1,3]); F(:,[2,3])], 2), 'rows');  
sort的第一个参数是一个矩阵,其中两列包含所有边,并且有重复。然后对其进行排序,使行
73
变为
37
。最后,
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))

获得边的坐标形式。最后,我想感谢您的建议。直到现在,1.5年后,我才看到你的方法的效率。我感谢你的帮助。最后我想感谢你的建议。直到现在,1.5年后,我才看到你的方法的效率。我感谢你的帮助。