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

非高手请勿进解决方案

2012-03-30 
非高手请勿进6800个三角面片组成的一个面模型,现在已知每个三角形的三个顶点的坐标。想把所有顶点存到verte

非高手请勿进
6800个三角面片组成的一个面模型,现在已知每个三角形的三个顶点的坐标。想把所有顶点存到vertex结构体中,每个vertex都包含坐标,和index信息。对应的三角形vertex中需存放对应的三个顶点的索引信息[code=C/C++][/code]。注:三角形之间存在相邻关系。
以下程序是否存在问题?
void StorePoint()
{
int num=0;
int thisnum=0;
float numarray[6800][3][3];
for(int i=0;i<6800;i++)
{
numarray[i][0][0]=triangle[i].vertex1x;
numarray[i][0][1]=triangle[i].vertex1y;
numarray[i][0][2]=triangle[i].vertex1z;
numarray[i][1][0]=triangle[i].vertex2x;
numarray[i][1][1]=triangle[i].vertex2y;
numarray[i][1][2]=triangle[i].vertex2z;
numarray[i][2][0]=triangle[i].vertex3x;
numarray[i][2][1]=triangle[i].vertex3y;
numarray[i][2][2]=triangle[i].vertex3z;
}
for(int i=0;i<6800;i++)
{
for(int j=0;j<3;j++)
{
int flag=0;//flag:0表示不和前面的点相同,1表示和前面的点相同
for(int k=0;k<num+1;k++)
{
if(vertex[k].x==numarray[i][j][0]&&vertex[k].y==numarray[i][j][1]&&vertex[k].z==numarray[i][j][2])
{
flag=1;
thisnum=k;
break;
}
else
{
flag=0;
}
}
if(flag==0)
{
vertex[num].PointNum=num;
vertex[num].x=numarray[i][j][0];
vertex[num].y=numarray[i][j][1];
vertex[num].z=numarray[i][j][2];
triangle[num].num[j]=num;
num++;
}
else
{
triangle[num].num[j]=thisnum;
num=num;
}
}
}
}

[解决办法]
先声明我不是高手,要是说的不对见谅,我一看那个大的数组我有点头晕了,建议用容器吧,什么vector,list的,各种容器的优势我就不太清楚了,老实说我没看完你的代码,你的意思是不是把坐标存起来,但要去掉重复的??但还是保留三角形的序号,我觉得用哈希表不错,我的一个想法,不知道可不可通:

hash_map<int,vector<hash_map<int,int>>>
大概意思就是
hash_map<坐标,vector<hash_map<序号,哪一个坐标轴的(就是表明是X、Y还是Z的)>>>

也就是说只要是坐标相同的我都删掉,不管是XYZ,我只需保存序号跟坐标所对的坐标轴就行,而且哈希表查找效率也比较高

这是我的建议,楼主可以试下
[解决办法]

探讨
额。。。顺便借楼主的帖子弱弱的问个问题,我在工程中载入别人写好的源码,的LPSTR/LPWSTR/Char等等字符类型之间的赋值报错,就是没有转换过来,我知道如果转换过来就能用,但太多了,估计没有100也有七八十处,有没有什么方法可以一次性解决吗? 我用的是VS2010的

热点排行