遍历三维骨架

来源:互联网 发布:维也纳会议 知乎 编辑:程序博客网 时间:2024/04/27 14:38

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),如果大家想到更好的办法欢迎交流


0 0