Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Algorithm 构造多边形的轮廓(特别是三角剖分)_Algorithm_Contour_Triangulation_Polygons - Fatal编程技术网

Algorithm 构造多边形的轮廓(特别是三角剖分)

Algorithm 构造多边形的轮廓(特别是三角剖分),algorithm,contour,triangulation,polygons,Algorithm,Contour,Triangulation,Polygons,我将如何构建仅由三角形构成的二维多边形的轮廓,它可以有孔,外部轮廓可以是凹面/凸面,孔也可以是凹面/凸面 从表面上看,这与三角剖分问题正好相反。 你知道有关于这类问题的文章吗 八叉树/四叉树与此相关吗?我猜你有三个点的集合形式的数据,这三个点构成一个“填充”三角形,这些三角形沿着边邻接,所有将成为完整形状的角点的顶点也是所有接触该点的三角形的顶点。然后,您只需找到所有未加倍的边,即不属于两个相邻三角形。我认为您可以通过创建拓扑数据结构来表示三角形集,然后使用该结构在边界上的三角形边上按顺序迭代来

我将如何构建仅由三角形构成的二维多边形的轮廓,它可以有孔,外部轮廓可以是凹面/凸面,孔也可以是凹面/凸面

从表面上看,这与三角剖分问题正好相反。 你知道有关于这类问题的文章吗


八叉树/四叉树与此相关吗?

我猜你有三个点的集合形式的数据,这三个点构成一个“填充”三角形,这些三角形沿着边邻接,所有将成为完整形状的角点的顶点也是所有接触该点的三角形的顶点。然后,您只需找到所有未加倍的边,即不属于两个相邻三角形。

我认为您可以通过创建拓扑数据结构来表示三角形集,然后使用该结构在边界上的三角形边上按顺序迭代来解决问题

例如:可以创建半边数据结构。假设您甚至在边界上插入了半边(正确),那么在边界轮廓上迭代就像在边界上定位一个半边,然后在它的“下一个”指针上迭代一样简单,直到回到开始的半边


与半边类似,您可以使用其他拓扑结构,如翼边等,但概念是相同的

这里是一个在三角形网格上操作的实现,查找并连接所有非双边,如中所述

#包括
#包括
#包括
#包括
#包括
typedef int顶点;
阶级三角{
公众:
常量顶点和运算符[](大小i)常量{
返回p[i];
}
顶点p[3];
};
标准::列表查找等高线(常数标准::矢量和三角形){
设置边;
地图邻居;
用于(常数自动&t:三角形){
插入(std::make_对(t[0],t[1]);
边.插入(标准::形成对(t[1],t[2]);
插入(std::make_对(t[2],t[0]);
}
用于(常数自动&t:三角形){
擦除(std::make_pair(t[1],t[0]);
擦除(std::make_pair(t[2],t[1]);
擦除(std::make_pair(t[0],t[2]);
}
用于(常数自动&t:三角形){
if(edges.find(std::make_pair(t[0],t[1]))!=edges.end(){
邻域[t[0]]=t[1];
}
if(edges.find(std::make_pair(t[1],t[2]))!=edges.end(){
邻域[t[1]]=t[2];
}
if(edges.find(std::make_pair(t[2],t[0]))!=edges.end(){
邻域[t[2]]=t[0];
}
}
std::列表结果;
而(!neights.empty()){
列表轮廓;
auto v0=邻居。开始()->首先;
自动v=v0;
while(neights.find(v)!=neights.end()){
轮廓。推回(v);
自动旧_v=v;
v=邻居。at(v);
删除(旧的);
}
如果(v!=v0){
抛出std::运行时_错误(“轮廓未关闭”);
}
删除(v);
结果:推回(轮廓);
}
返回结果;
}
int main(){
int v00=0;
int v10=1;
int v01=2;
int v11=3;
向量v{
{v00,v10,v11},
{v00,v11,v01};
用于(恒速自动控制:查找等高线(v)){
用于(常数自动和v:c){

好的,我们剩下一组点。连接它们来找出问题的结果是不寻常的,还是?我不知道我是否理解你,spx2,但在消除所有的双边后,剩下的是构成轮廓的点。我想他想知道如何按顺序获得轮廓的点,而不是staRT端对。此外,考虑可能导致多个轮廓的输入。