type def struct edge
{
int adjvex;
int weight;
struct edge *next;
}ELinkl
1、图的概念
1.1 邻接表的存储结构
typedef struct edge
{
int adjvex;
int weight;
struct edge *next;
}ELink;
typedef struct ver
{
Point vertex;
ELink *link;
}VLink ;
骨架的结构复杂,
有自交的环,圈
分支多,还有小型区域等
三维数据多采用一维数组的存储方式,so,不宜直接采用graph的方式存储
比如建立图的过程其实就是把vertex顶点按照一定顺序存起来的过程。
收到BFS的启发,本程序采用加一queue来存储当前点邻域内的点,并做标记
void putskletoninorder()
{
//int i=0;
//vector <Point> center;
int i,j,k;
Point firstseed;
//queue<Point> q;
for ( i =0;i< skeletondata->getXsize();i++)
{
for ( j=0;j<skeletondata->getYsize();j++)
{
for ( k=0;k<skeletondata->getZsize();k++)
{
//int count=0;
if (skeletondata->get(i,j,k)!=0)
{
//count++;
//if (count ==1)
//{
firstseed.x=(long long)i;
firstseed.y=(long long)j;
firstseed.z=(long long)k;
firstseed.value=0;
break;
//}
}
}
}
}
center.push_back(firstseed);
checkadj(firstseed);
while(!q.empty())
{
Point pos=q.front();
checkadj(pos);
q.pop();
}
}
void checkadj(Point firstseed)
{
for (int l = -1; l <=1 ;l++)
{
for (int m =-1; m<= 1; m++)
{
for(int n=-1; n<= 1;n++)
{
int posx = firstseed.x+l;
int posy = firstseed.y+m;
int posz = firstseed.z+n;
if (skeletondata->get(posx,posy,posz)!=0)
{
//firstseed.value=0;
Point pos(posx,posy,posz,0);
skeletondata->put(posx,posy,posz,0);
center.push_back(pos);
q.push(pos);
}
}
}
}
}
以上效率基本最高,为O(N),如果大家想到更好的办法欢迎交流