#include "stdafx.h" #include "Clip.h" #include #include #include #include #include #include #include using namespace std; //分支点数据类型 struct BranchPoint{ P coord; //点坐标 double t; // 分支点相对位置,在0-1之间 double Dis; //卡箍到卡箍之间的距离 bool fixed; //位置是否已经固定 Clip * pc1,*pc2; //存储它相邻的两个卡箍 BranchPoint *pb1,*pb2; //存储它相邻的两个分支点 double l,r; //限制t的范围 vector branchPointsInSameSegment; //同一分段上其他分支点的标号 P ndir; //所在分支的法线方向 double position; //距离参考卡箍的距离 double tempt[2]; //存储分支点在两种情况下的最优位置,0代表异段进同段出 string referClip; //参考卡箍的名字 int id; //分支点标号 int mode; //存储分支点第一次被加入路径属于哪种情况,0代表异段进同段出,1代表同段进异端出 int bundleNodeID; //分支点属于的bundle段id bool used; //分支点是否被使用 void init(){ l=0;r=1; pc1=pc2=NULL; pb1=pb2=NULL; t=0.5;Dis=0; fixed=false; position=0; id=0; bundleNodeID=0; used=0; } //初始化 BranchPoint(){ init(); } //按两个卡箍初始化 BranchPoint(Clip *c1,Clip *c2){ init(); pc1=c1;pc2=c2; Dis=distan1(c1->coord,c2->coord); double ratio=MinClipToBranchPointDistance/Dis; l=max(l,ratio);r=min(r,1-ratio); t=(l+r)/2; //cout<<"BranchPoint2: ratio:"<coord)*(1-t)+(c2->coord)*t; } //按卡箍和范围初始化 BranchPoint(Clip *c1,Clip *c2,double L,double R){ init(); pc1=c1;pc2=c2; Dis=distan1(c1->coord,c2->coord); double ratio=MinClipToBranchPointDistance/Dis; l=max(L,ratio);r=min(R,1-ratio); t=(l+r)/2; cout<<"BranchPoint L+R: ratio:"<coord)*(1-t)+(c2->coord)*t; } //添加左边的分支点 void addL(BranchPoint b){ pb1=&b; } //添加右边的分支点 void addR(BranchPoint b){ pb2=&b; } //把左边界向右边推d距离 void pushL(double d){ if(d<=0)return; l+=d/Dis; } //把右边界向左边推d距离 void pushR(double d){ if(d<=0)return; r-=d/Dis; } //固定分支点位置 void fix(){ if(fixed==true)return; fixed=true; t=tempt[mode]; /* if(pb1!=NULL){ pb1->pushL(t*Dis+MinBranchPointDistance-r*Dis); } if(pb2!=NULL){ pb2->pushR(l*Dis-(t*Dis-MinBranchPointDistance)); } */ cout<<"***********"; if(!Equal(t,l)&&!Equal(t,r))cout<<"-------"; cout<name; position=t*Dis; assert(position<=Dis); } //通道方向反向,分支点也改变其表示形式 void reverse(){ referClip=pc2->name; position=Dis-position; } //返回分支点在分支上可以连接到的下一个点 //offSet代表分支点坐标的偏差值 inline vector getNext(int offSet){ vector rc=branchPointsInSameSegment; for(int i=0;iid); rc.push_back(pc2->id); return rc; } /*计算分支点到卡箍点的权值 reverse=0代表从分支点到p reverse=1代表从p到分支点 */ inline double computeWeight(P& p,int inOut,bool reverse){ if(l>=r)return 1e9; if(fixed==false){ double X1=pc1->coord.x,Y1=pc1->coord.y,Z1=pc1->coord.z; double X2=pc2->coord.x,Y2=pc2->coord.y,Z2=pc2->coord.z; double X0=p.x,Y0=p.y,Z0=p.z; double FZ=(X1-X0)*(X1-X2)+(Y1-Y0)*(Y1-Y2)+(Z1-Z0)*(Z1-Z2); double FM=2*Dis*Dis; t=FZ/FM; //公式法求t极小值点 t=max(t,l);t=min(t,r); } //if(!Equal(t,l)&&!Equal(t,r))cout<<"-------"<coord*(1-t)+pc2->coord*t; coord.type=1; if(reverse)return distan(p,coord,inOut,0); return distan(coord,p,0,inOut); } //记录分支点最优位置 void recordPos(int mode){ //if(!Equal(t,l)&&!Equal(t,r))cout<<"-------"<=1&&id<=branchPointNum); return &b[id]; } }branchPointSet;