#include "stdafx.h" #include "BasicChannel.h" #include #include #include #include #include #include #include using namespace std; //存储卡箍与卡箍之间,卡箍与分支点之间,分支点与分支点之间的边关系 struct BasicEdge{ vector > clip[MAXPointNum][2],branchPoint[N][2]; //0,1代表两种模式,0代表同分支段的卡箍与分支点,1则相反 private: vector >edge[N][2]; //卡箍到卡箍的连线 //预处理分支点和卡箍之间的连线关系 public: void buildEdgeBetweenClipAndBranchPoint(){ for(int i=1;i<=3000;i++){ for(int j=0;j<=1;j++){ assert(edge[i][j].size()==0); } } for(int i=1;i<=basicChannel.bundleNum;i++){ BundleNode* pbn=basicChannel.bundles[i].head; BundleNode* pre=NULL; while(pbn!=NULL){ if(pre!=NULL){ int cid1=pre->pc->id; int cid2=pbn->pc->id; int inOut1=pre->inOut; int inOut2=pbn->inOut; assert(cid1!=cid2); pair pr=make_pair(cid2,inOut2); assert(pr.first==cid2); if(inOut1!=0&&inOut1!=1){ cout<<"clip "<pc1->id; int inOut1=basicChannel.getClipInOut(cid1)^1; int cid2=pb->pc2->id; int inOut2=basicChannel.getClipInOut(cid2); int inOut3=basicChannel.isClipConnectedToClip(cid1,cid2); assert(inOut3==inOut2); clip[i][0].push_back(make_pair(cid1,inOut1)); clip[i][0].push_back(make_pair(cid2,inOut2)); branchPoint[cid1][inOut1^1].push_back(make_pair(i,1)); branchPoint[cid2][inOut2^1].push_back(make_pair(i,1)); vector vec=kdtree.search_by_dis(branchPointSet.b[i].coord,600); for(int j=0;j > getClipConnectedToClip(int cid,int inOut){ if(edge[cid][inOut].size()!=0){ if(edge[cid][inOut][0].first==0)return edge[cid][inOut]; vector > res; for(int i=0;i vec1=kdtree.search_by_dis(clipSet.c[cid].coord,600); for(int i=0;i > getClipConnectedToBranchPoint(int bid,int mode){ if(mode==0)return clip[bid][0]; else { vector > v; for(int i=0;i > getBranchPointConnectedToClip(int cid,int inOut,int offset=0){ vector > v; for(int i=0;i > getNextPoint(int id,int mode,int offset){ int cid,bid; vector >v1,v2; if(id<=offset){ cid=id; v1=this->getBranchPointConnectedToClip(cid,mode,offset); v2=this->getClipConnectedToClip(cid,mode); if(v2.size()&&v2[0].first!=0) v1.insert(v1.begin(),v2.begin(),v2.end()); return v1; } else { bid=id-offset; v1=this->getClipConnectedToBranchPoint(bid,mode); return v1; } } /*返回端点可以连接到的点 p是端点坐标 offSet是分支点坐标的偏移量 isEnd=1表示这个端点是路径终点,否则是路径起点 */ public: vector > getEXTNextPoint(P p,int offSet,int isEnd){ vector >res; vector vec1=kdtree.search_by_dis(p,600); vec1=basicChannel.getBranchPointAndClip(vec1,offSet); for(int i=0;inext->type==0){ int cid2=pbn->next->pc->id; int inOut2=basicChannel.getClipInOut(cid2); edge[cid][inOut].push_back(make_pair(cid2,inOut2)); } else edge[cid][inOut].push_back(make_pair(0,0)); edge[cid][inOut^1].clear(); if(pbn->pre->type==0){ int cid2=pbn->pre->pc->id; int inOut2=basicChannel.getClipInOut(cid2); edge[cid][inOut^1].push_back(make_pair(cid2,inOut2^1)); } else edge[cid][inOut^1].push_back(make_pair(0,0)); //更新branch卡箍到分支点的边 if(branchPoint[cid][0].size()!=0 &&branchPoint[cid][0][0].second==0){ //原本不在通道里 int vv=0; for(int i=0;i