分割三角网解决方案
分割三角网
具体题目是这样的
写一个函数 把一个三角网分成多个独立的三角网。
输入: vector<UINT> indexArr; indexArr为每个三角形的索引值 (即每0, 1, 2个索引是一个三角形, 3, 4, 5索引又是一个三角形 。。。)
输出:vector<vector<UINT>> indexArrs 把索引不相连的三角形给分开。
注意效率。
例如下图: 输入[0,1,2,0,2,3,4,5,6] 输出[0,1,2,0,2,3],[4,5,6]
这是我的代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<time.h>
using namespace std;
bool ChaZhao(vector<int> iv1,vector<int> iv2);
int main()
{
int n=0;
int i;
int j;
vector<int> indexArr;
srand(time(NULL));
int num[102];
int a=0,b=100;
for(j=0;j<102;j++)
{
num[j]=rand()%(int)101;
}
for(j=0;j<102;j++)
{
indexArr.push_back(num[j]);
}
int m=indexArr.size();
vector<vector<int> > indexArrs(m);
vector<int> temp1;
vector<int> temp2;
vector<int> temp3;
vector<int> temp4;
for(vector<int>::iterator iter=indexArr.begin();iter!=indexArr.end();iter++)
{
indexArrs[n/3].push_back(*iter);
n++;
}
for(i=0;i<indexArrs.size();i++)
{
if (ChaZhao(indexArrs[i],indexArrs[i+1]))
{
for(vector<int>::iterator iter1=indexArrs[i].begin();iter1!=indexArrs[i].end();iter1++)
{
temp1.push_back(*iter1);
}
for(vector<int>::iterator iter2=indexArrs[i+1].begin();iter2!=indexArrs[i+1].end();iter2++)
{
temp1.push_back(*iter2);
}
}
else
{
if(i==0)
{
for(vector<int>::iterator iter3=indexArrs[0].begin();iter3!=indexArrs[0].end();iter3++)
{
temp3.push_back(*iter3);
}
}
else
{
for(vector<int>::iterator iter4=indexArrs[i+1].begin();iter4!=indexArrs[i+1].end();iter4++)
{
temp2.push_back(*iter4);
}
}
}
}
cout<<"[";
for(vector<int>::iterator ite=temp3.begin(); ite!= temp3.end(); ite++)
{
cout<<*ite<<" ";
}
cout<<"]";
cout<<"[";
for(vector<int>::iterator it=temp1.begin(); it!= temp1.end(); it++)
{
cout<<*it<<" ";
}
cout<<"]";
cout<<"[";
for(vector<int>::iterator te=temp2.begin(); te!= temp2.end(); te++)
{
cout<<*te<<" ";
}
cout<<"]";
return 0;
}
bool ChaZhao(vector<int> iv1,vector<int> iv2)
{
int count=0;
for(int p=0;p<3;p++)
{
if(find(iv1.begin(),iv1.end(),iv2[p])!=iv1.end())
{
count++;
}
}
if(count>1)
{
return true;
}
else
return false;
}
------解决方案--------------------
我觉得你的思路有问题,所以代码才不舒服。正确的做法是根据 mesh (m[0]) 的拓扑结构做,
(1) 随机选取一点。
(2) 从该点向外搜索,直到无法触及到新顶点为止。
(3) 至此所有经起始点扩张出来的顶点,必然都是连通的。
(4) 计算所有连通顶点的 simplicial complex closure,即所有涉及连通顶点的三角形集合,并将其新建为一个 mesh (m[i])。
(5) 从 m0 中将 mi 涉及的三角形全部剔出,如果 m0 不再包含三角形,则终止,否则转 (1).
(1) 中也可以随机选取初始三角形,不过这相当于在原 mesh 的 dual mesh 中进行计算,没什么本质区别。这么做倒是使 (2) 的难度会增加。
(2) 一般通过广度优先搜索完成,其实深度优先应该也行,只不过逻辑上没有广度优先更直观。
(3) 中 simplicial complex closure (m[i]) 的计算从顶点集 v_set[i] 开始,对集合中的每一个顶点,将当前 mesh (m[i-1]) 中所有包含该顶点的三角形加入到 m[i]。
------解决方案--------------------
忘掉三角形!
三个三个读取,如果本次读取到的三个数中有两个和刚才读取的三个数中的两个相同,不建新组,否则建新组。
------解决方案--------------------
我说的和 c++ 没有必然联系,这是算法问题,用别的语言也得这么干。
具体题目是这样的
写一个函数 把一个三角网分成多个独立的三角网。
输入: vector<UINT> indexArr; indexArr为每个三角形的索引值 (即每0, 1, 2个索引是一个三角形, 3, 4, 5索引又是一个三角形 。。。)
输出:vector<vector<UINT>> indexArrs 把索引不相连的三角形给分开。
注意效率。
例如下图: 输入[0,1,2,0,2,3,4,5,6] 输出[0,1,2,0,2,3],[4,5,6]
这是我的代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<time.h>
using namespace std;
bool ChaZhao(vector<int> iv1,vector<int> iv2);
int main()
{
int n=0;
int i;
int j;
vector<int> indexArr;
srand(time(NULL));
int num[102];
int a=0,b=100;
for(j=0;j<102;j++)
{
num[j]=rand()%(int)101;
}
for(j=0;j<102;j++)
{
indexArr.push_back(num[j]);
}
int m=indexArr.size();
vector<vector<int> > indexArrs(m);
vector<int> temp1;
vector<int> temp2;
vector<int> temp3;
vector<int> temp4;
for(vector<int>::iterator iter=indexArr.begin();iter!=indexArr.end();iter++)
{
indexArrs[n/3].push_back(*iter);
n++;
}
for(i=0;i<indexArrs.size();i++)
{
if (ChaZhao(indexArrs[i],indexArrs[i+1]))
{
for(vector<int>::iterator iter1=indexArrs[i].begin();iter1!=indexArrs[i].end();iter1++)
{
temp1.push_back(*iter1);
}
for(vector<int>::iterator iter2=indexArrs[i+1].begin();iter2!=indexArrs[i+1].end();iter2++)
{
temp1.push_back(*iter2);
}
}
else
{
if(i==0)
{
for(vector<int>::iterator iter3=indexArrs[0].begin();iter3!=indexArrs[0].end();iter3++)
{
temp3.push_back(*iter3);
}
}
else
{
for(vector<int>::iterator iter4=indexArrs[i+1].begin();iter4!=indexArrs[i+1].end();iter4++)
{
temp2.push_back(*iter4);
}
}
}
}
cout<<"[";
for(vector<int>::iterator ite=temp3.begin(); ite!= temp3.end(); ite++)
{
cout<<*ite<<" ";
}
cout<<"]";
cout<<"[";
for(vector<int>::iterator it=temp1.begin(); it!= temp1.end(); it++)
{
cout<<*it<<" ";
}
cout<<"]";
cout<<"[";
for(vector<int>::iterator te=temp2.begin(); te!= temp2.end(); te++)
{
cout<<*te<<" ";
}
cout<<"]";
return 0;
}
bool ChaZhao(vector<int> iv1,vector<int> iv2)
{
int count=0;
for(int p=0;p<3;p++)
{
if(find(iv1.begin(),iv1.end(),iv2[p])!=iv1.end())
{
count++;
}
}
if(count>1)
{
return true;
}
else
return false;
}
------解决方案--------------------
我觉得你的思路有问题,所以代码才不舒服。正确的做法是根据 mesh (m[0]) 的拓扑结构做,
(1) 随机选取一点。
(2) 从该点向外搜索,直到无法触及到新顶点为止。
(3) 至此所有经起始点扩张出来的顶点,必然都是连通的。
(4) 计算所有连通顶点的 simplicial complex closure,即所有涉及连通顶点的三角形集合,并将其新建为一个 mesh (m[i])。
(5) 从 m0 中将 mi 涉及的三角形全部剔出,如果 m0 不再包含三角形,则终止,否则转 (1).
(1) 中也可以随机选取初始三角形,不过这相当于在原 mesh 的 dual mesh 中进行计算,没什么本质区别。这么做倒是使 (2) 的难度会增加。
(2) 一般通过广度优先搜索完成,其实深度优先应该也行,只不过逻辑上没有广度优先更直观。
(3) 中 simplicial complex closure (m[i]) 的计算从顶点集 v_set[i] 开始,对集合中的每一个顶点,将当前 mesh (m[i-1]) 中所有包含该顶点的三角形加入到 m[i]。
------解决方案--------------------
忘掉三角形!
三个三个读取,如果本次读取到的三个数中有两个和刚才读取的三个数中的两个相同,不建新组,否则建新组。
------解决方案--------------------
我说的和 c++ 没有必然联系,这是算法问题,用别的语言也得这么干。