#include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier #include "BranchPoint.h" BranchPointSet branchPointSet; void BranchPoint::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::BranchPoint() { init(); } // 按两个卡箍初始化 BranchPoint::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::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:" << ratio << " l:" << l << " r:" << r << " t:" << t << endl; coord = (c1->coord) * (1 - t) + (c2->coord) * t; } // 添加左边的分支点 void BranchPoint::addL(BranchPoint b) { pb1 = &b; } // 添加右边的分支点 void BranchPoint::addR(BranchPoint b) { pb2 = &b; } // 把左边界向右边推d距离 void BranchPoint::pushL(double d) { if (d <= 0) return; l += d / Dis; } // 把右边界向左边推d距离 void BranchPoint::pushR(double d) { if (d <= 0) return; r -= d / Dis; } // 固定分支点位置 void BranchPoint::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 << endl; referClip = pc1->name; position = t * Dis; assert(position <= Dis); } // 通道方向反向,分支点也改变其表示形式 void BranchPoint::reverse() { referClip = pc2->name; position = Dis - position; } // 返回分支点在分支上可以连接到的下一个点 // offSet代表分支点坐标的偏差值 vector BranchPoint::getNext(int offSet) { vector rc = branchPointsInSameSegment; for (int i = 0; i < rc.size(); i++) rc[i] += offSet; rc.push_back(pc1->id); rc.push_back(pc2->id); return rc; } /*计算分支点到卡箍点的权值 reverse=0代表从分支点到p reverse=1代表从p到分支点 */ double BranchPoint::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 BranchPoint::recordPos(int mode) { // if(!Equal(t,l)&&!Equal(t,r))cout<<"-------"<= 1 && id <= branchPointNum); return &b[id]; }