首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++写一个函数 把一个三角形网分成多个独立的三角网

2013-03-20 
C++写一个函数 把一个三角网分成多个独立的三角网具体题目是这样的写一个函数 把一个三角网分成多个独立的

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]

大侠们 如果有时间的话帮我看一下程序好么?
该怎样改进才能使c++编程的优势得到更充分的发挥。


#include <vector>
#include <iostream>
#include <map>
using namespace std; 

int main()
{
vector<vector<int>> fun(const vector<vector<int> > indexArrs);
vector<vector<int>> input();

fun(input());
return 0;
}

vector<vector<int>> input()      //输入
{
                                                                                   
vector<int> indexArr;
int s;
cout<<"please input the index"<<endl;
while(cin>>s)
{
indexArr.push_back(s);
}
int num=indexArr.size()/3;
int n=0;
vector<vector<int>> indexArrs(num);
vector<vector<int>>::iterator itera;
for(vector<int>::iterator iter=indexArr.begin(); iter!=indexArr.end(); iter++)
{
indexArrs[n/3].push_back(*iter);
n++;
}
return indexArrs;
}

vector<vector<int> > fun(const vector<vector<int> > indexArrs)
{

map<int, int> Add;
int i=0;
//////对顶点进行分组
for(vector<vector<int> >::const_iterator it=indexArrs.begin(); it!=indexArrs.end(); it++)
{
vector<int>::const_iterator iter=it->begin(); 
if(!Add.count(*iter)&&!Add.count(*(iter+1))&&!Add.count(*(iter+2)))                
//第一个第二个第三个没有出现过时进行标号
{
Add[*iter]=++i;
Add[*(++iter)]=i;
Add[*(++iter)]=i;

}
else if(Add.count(*iter)&&!Add.count(*(iter+1))&&!Add.count(*(iter+2)))          
//第一个出现过第二个第三个没有出现过时
{
 Add[*(iter+1)]=Add.find(*iter)->second;
 Add[*(iter+2)]=Add.find(*iter)->second;
}
else if(!Add.count(*iter)&&Add.count(*(iter+1))&&!Add.count(*(iter+2)))              
//第二个出现过第一个第三个没有出现过时
{
 Add[*iter]=Add.find(*(iter+1))->second;
 Add[*(iter+2)]=Add.find(*(iter+1))->second;
}
else if(!Add.count(*iter)&&!Add.count(*(iter+1))&&Add.count(*(iter+2)))          
//第三个出现过第一个第二个没有出现过时
{
 Add[*iter]=Add.find(*(iter+2))->second;
 Add[*(iter+1)]=Add.find(*(iter+2))->second;
}
else if(Add.count(*iter)&&Add.count(*(iter+1))&&!Add.count(*(iter+2)))            
//第一个第二个出现第三个没有出现过时


{
if(Add.find(*(iter+1))->second!=Add.find(*iter)->second)                       
{
map<int, int>::mapped_type mapty=Add.find(*(iter+1))->second;            
for(map<int, int>::iterator it=Add.begin(); it!=Add.end(); it++)          
{
if(it->second==mapty)
it->second=Add.find(*iter)->second;
}
}
 Add[*(iter+2)]=Add.find(*iter)->second;
}
else if(Add.count(*iter)&&!Add.count(*(iter+1))&&Add.count(*(iter+2)))             
//第一个第三个出现第二个没有出现过时
{
if(Add.find(*(iter+2))->second!=Add.find(*iter)->second)                      
{
map<int, int>::mapped_type mapty=Add.find(*(iter+2))->second;           
for(map<int, int>::iterator it=Add.begin(); it!=Add.end(); it++)        
{
if(it->second==mapty)
it->second=Add.find(*iter)->second;
}
}
 Add[*(iter+1)]=Add.find(*iter)->second;
}
else if(!Add.count(*iter)&&Add.count(*(iter+1))&&Add.count(*(iter+2)))             
//第二个第三个出现第一个没有出现过时进行标号
{
if(Add.find(*(iter+2))->second!=Add.find(*(iter+1))->second)                   
{
map<int, int>::mapped_type mapty=Add.find(*(iter+2))->second;         
for(map<int, int>::iterator it=Add.begin(); it!=Add.end(); it++)       
{
if(it->second==mapty)
it->second=Add.find(*(iter+1))->second;
}
}
 Add[*iter]=Add.find(*(iter+1))->second;
}
else if(Add.count(*iter)&&Add.count(*(iter+1))&&Add.count(*(iter+2)))             
//第一个第二个第三个都出现过
{
if(Add.find(*(iter+1))->second!=Add.find(*iter)->second)                    
//第二个出现过而且不相等
{
map<int, int>::mapped_type mapty=Add.find(*(iter+1))->second;            
for(map<int, int>::iterator it=Add.begin(); it!=Add.end(); it++)         
{
if(it->second==mapty)
it->second=Add.find(*iter)->second;
}
}
if(Add.find(*(iter+2))->second!=Add.find(*iter)->second)                    
//第三个出现过而且不相等
{
map<int, int>::mapped_type mapty=Add.find(*(iter+2))->second;             
for(map<int, int>::iterator it=Add.begin(); it!=Add.end(); it++)          
{
if(it->second==mapty)


it->second=Add.find(*iter)->second;
}
}


}
}
//对三角形进行分类
map<int, vector<int>> vmap;

for(vector<vector<int> >::const_iterator it=indexArrs.begin(); it!=indexArrs.end(); it++)
{
vector<int>::const_iterator iter=it->begin(); 
vmap[Add[*iter]].push_back(*iter);
vmap[Add[*iter]].push_back(*(iter+1));
vmap[Add[*iter]].push_back(*(iter+2));
}
//返回值
vector<vector<int> > rect;
for(map<int, vector<int>>::iterator it=vmap.begin(); it!=vmap.end(); it++)
{
rect.push_back(it->second);
}

//显示
cout<<"相连的三角形"<<endl;
for(map<int, vector<int>>::iterator it=vmap.begin(); it!=vmap.end(); it++)
{
for(vector<int>::iterator iter=it->second.begin(); iter!=it->second.end(); iter++)
cout<<*iter<<" ";
cout<<endl;
}
rect;
getchar();
return rect;
}


[解决办法]
一个三角网分成多个独立的三角网,不理解什么意思

热点排行