要建立一种经常自增容量且经常访问的数据结构类型应该用什么类型?

发布时间:2024-05-16 16:20 发布:上海旅游网

问题描述:

在做一个根据给定的离散点和由这些离散点构成的三角形序列生成等高线和断面的程序,提供的数据格式如下:
25
100 100 100
200 110 100
300 110 270
400 100 100
500 100 100
100 200 100
183 220 170
300 200 200
430 190 200
510 210 100
100 300 100
200 300 200
330 280 300
400 300 200
500 300 100
100 400 100
210 390 200
300 420 200
420 400 170
500 400 100
100 500 100
200 500 100
300 500 100
400 500 100
520 490 100
32
1 2 6
2 7 6
2 3 7
3 8 7
3 4 8
4 9 8
9 4 5
5 10 9
6 7 11
7 12 11
7 8 12
8 13 12
8 9 13
9 14 13
9 10 14
10 15 14
11 12 16
12 17 16
12 13 17
13 18 17
13 14 18
14 19 18
14 15 19
15 20 19
16 17 21
17 22 21
17 18 22
18 23 22
18 19 23
19 24 23
19 20 24
20 25 24

问题解答:

接楼上:
其中,25代表地形块的离散点数目,接下来的25行每行代表一个三维点的xyz坐标,32代表这块地形共有32个三角形,接下来的32行代表每个三角形对应的点序列,例如1 2 6 代表由第一个 第二个 第六个点构成了一个三角形.
现在要根据这些已有的数据来生成断面曲线和等高线,首先要建立好这些离散数据之间的关系,请问大家有没有高效率的算法来找出共享边线段的两个三角形,并将这两个三角形(索引或ID)存储到共享边之中?
我现在写的代码如下:
for(i=0; i<TriCount; i++) //TriCount为三角形数目
{//给AllBord和AllTri存入数据
int point1,point2,point3;//记录当前三角形的三个顶点序号
fscanf(fp, "%d %d %d", &point1, &point2, &point3);
TBord b1(AllPoint[point1-1],AllPoint[point2-1]);//数组中对应的下标应减1 //copy
TBord b2(AllPoint[point2-1],AllPoint[point3-1]);
TBord b3(AllPoint[point3-1],AllPoint[point1-1]);//当前三角形的三条边
int b1in = -1;//记录b1边是否在AllBord内
int b2in = -1;//记录b2边是否在AllBord内
int b3in = -1;//记录b3边是否在AllBord内
int CurrentBordCount = AllBord.size();//获得当前存储的边数

if (b1==AllBord[CurrentBordCount])
{
b1in=CurrentBordCount;
}
else
{
for(int j=0; j<CurrentBordCount; j++)//对每条边进行判断
{
if (b1==AllBord[j])//搜索边数组,判断b1边是否在AllBord数组中
{
b1in = j; //覆盖-1;b1边已经在边数组中
}
}
}

if (b2==AllBord[CurrentBordCount])
{
b2in=CurrentBordCount;
}
else
{
for(int j=0; j<CurrentBordCount; j++)//对每条边进行判断
{
if (b2==AllBord[j])//搜索边数组,判断b1边是否在AllBord数组中
{
b2in = j; //覆盖-1;b1边已经在边数组中
}
}
}

if (b3==AllBord[CurrentBordCount])
{
b3in=CurrentBordCount;
}
else
{
for(int j=0; j<CurrentBordCount; j++)//对每条边进行判断
{
if (b3==AllBord[j])//搜索边数组,判断b1边是否在AllBord数组中
{
b3in = j; //覆盖-1;b1边已经在边数组中
}
}
}

if (b1in != -1)
{//b1边已经记录;tri1已经记录
AllBord[b1in].tri2 = i; //对应边(公共边)的右三角形设为i. i为三角形在数组中的下标(从0开始)
AllTri[i].bord1 = b1in; //AllTri[i].bord1:AllTri中对应三角形的第一条边设为bord1在AllBord中的索引
}
else
{//b1边还未记录
CurrentBordCount = AllBord.size();//已经记录的边数
AllBord.push_back(b1); //将b1边加入边数列
AllBord[CurrentBordCount].tri1 = i;
AllTri[i].bord1 = CurrentBordCount;//当前三角形的第一条边在AllBord中的位置
}
if (b2in != -1)
{//b2边已经记录;AllBord[b2in].tri1已经记录
AllBord[b2in].tri2 = i;
AllTri[i].bord2 = b2in;
}
else
{//b2边还未记录
CurrentBordCount = AllBord.size();
AllBord.push_back(b2);
AllBord[CurrentBordCount].tri1 = i;
AllTri[i].bord2 = CurrentBordCount;
}
if (b3in != -1)
{//b3边已经记录
AllBord[b3in].tri2 = i;
AllTri[i].bord3 = b3in;
}
else
{//b3边还未记录
CurrentBordCount = AllBord.size();
AllBord.push_back(b3);
AllBord[CurrentBordCount].tri1 = i;
AllTri[i].bord3 = CurrentBordCount;
}

}//endfor

程序说明:AllPoint为存储离散点的数组,AllBord为存储三角形边的数组
因为地形数据量很大,点数据少则成千上万,多则几十万上百万,所以,上面的代码执行效率很低,根本不能运算大面积的地形数据,外层循环固定,内层循环递增,大家有没有更好的办法可以使得给定某一个三角形的边后可以快速得到共享这个边的两个三角形的ID或是索引?

注:以上数据只是一个测试数据,实际的地形数据是完全不规则的,离散点和每个三角形在数据文件中出现的顺序都随机.

望各位有兴趣的能人和高手能给出个效率高的算法!!

热点新闻