From cc7e7b90ebea67563d5c1bd1bc739105e68b83d3 Mon Sep 17 00:00:00 2001 From: yony Date: Wed, 5 Jun 2024 14:35:54 +0800 Subject: [PATCH] code check - OK --- WireRouting_DLL/Astar.cpp | 1 - WireRouting_DLL/Astar.h | 2 - WireRouting_DLL/BVH.cpp | 33 +++++++++ WireRouting_DLL/BranchTree.cpp | 3 + WireRouting_DLL/BranchTree.h | 2 + WireRouting_DLL/Clip.cpp | 4 +- WireRouting_DLL/Clip.h | 6 +- WireRouting_DLL/Connector.h | 2 +- WireRouting_DLL/Const.cpp | 4 -- WireRouting_DLL/Const.h | 114 ++++++++++++++++++++++--------- WireRouting_DLL/Geometry.cpp | 4 ++ WireRouting_DLL/Geometry.h | 6 ++ WireRouting_DLL/Intersection.cpp | 8 +++ WireRouting_DLL/Intersection.h | 5 +- WireRouting_DLL/KDtree.cpp | 3 + WireRouting_DLL/KDtree.h | 2 + WireRouting_DLL/Path.cpp | 2 +- WireRouting_DLL/Path.h | 2 - WireRouting_DLL/ReadXML.cpp | 22 +++--- 19 files changed, 163 insertions(+), 62 deletions(-) diff --git a/WireRouting_DLL/Astar.cpp b/WireRouting_DLL/Astar.cpp index c760712..52d4d30 100644 --- a/WireRouting_DLL/Astar.cpp +++ b/WireRouting_DLL/Astar.cpp @@ -1,7 +1,6 @@ #include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier #include "Astar.h" -BranchTree branchTree; Astar astar; void DSU::init(int cnt) diff --git a/WireRouting_DLL/Astar.h b/WireRouting_DLL/Astar.h index 1942f64..71cf5bb 100644 --- a/WireRouting_DLL/Astar.h +++ b/WireRouting_DLL/Astar.h @@ -23,8 +23,6 @@ using namespace std; -extern ASTAR_API BranchTree branchTree; - struct ASTAR_API DSU { int f[N]; diff --git a/WireRouting_DLL/BVH.cpp b/WireRouting_DLL/BVH.cpp index 54725c7..2179234 100644 --- a/WireRouting_DLL/BVH.cpp +++ b/WireRouting_DLL/BVH.cpp @@ -189,6 +189,31 @@ bool BVH::TriSegIntersection(Point3 &P0, Point3 &P1, Point3 &P2, Point3 &A, Poin } } +/* +bool BVH::TriSegIntersection(Triangle t,Point3 A,Point3 B,int mood) +{ + P P0=t.p[0],P1=t.p[1],P2=t.p[2]; + Vector3 n=Cross(P1-P0,P2-P0); + if(dcmp(Dot(n,B-A))==0){ + if(mood)cout<<"平行"<0){ + if(mood)cout<<"交点不在AB上"< using namespace std; -extern KDtree CLIP_API kdtree; - // 卡箍信息 struct CLIP_API Clip { @@ -99,4 +97,6 @@ struct CLIP_API ClipSet 2代表其他方向卡箍 */ void print(); -}; \ No newline at end of file +}; + +extern ClipSet CLIP_API clipSet; diff --git a/WireRouting_DLL/Connector.h b/WireRouting_DLL/Connector.h index ddd1625..66e0666 100644 --- a/WireRouting_DLL/Connector.h +++ b/WireRouting_DLL/Connector.h @@ -31,5 +31,5 @@ struct CONNECTOR_API Connector Connector(); }; -extern Connector CONNECTOR_API connectors[]; +extern Connector CONNECTOR_API connectors[M]; extern int CONNECTOR_API connectorNum; \ No newline at end of file diff --git a/WireRouting_DLL/Const.cpp b/WireRouting_DLL/Const.cpp index 01de160..3939a05 100644 --- a/WireRouting_DLL/Const.cpp +++ b/WireRouting_DLL/Const.cpp @@ -3,7 +3,3 @@ double MAXX = -1e9, MINX = 1e9, MAXY = -1e9, MINY = 1e9, MAXZ = -1e9, MINZ = 1e9; // 卡箍的坐标范围 double Ycenter, Zcenter; // 飞机在Y,Z两轴的中心 -vector vertices; -vector indices; -Mesh mesh; -int intersection_model = 0; \ No newline at end of file diff --git a/WireRouting_DLL/Const.h b/WireRouting_DLL/Const.h index e4e035a..95cf01e 100644 --- a/WireRouting_DLL/Const.h +++ b/WireRouting_DLL/Const.h @@ -11,7 +11,6 @@ #endif #include "Point.h" -// #include "Geometry.h" #include "Intersection.h" #include @@ -35,14 +34,15 @@ static const double MAXDia = 50; // 卡箍能容纳的最大直径 static const int maxCap = 50; // 卡箍能容纳的最大线缆数 static const double pi = acos(-1.0); // Π static const double minAngle = pi / 144; // 判断平行和垂直的偏差阈值 -// static const double minDis=30; // +// static const double minDis=30; //* static const double R = 2000; // 飞机横截面的近似半径 static const double MARGIN = 1000; // 布线的空间范围,从STL模型向外延申的长度 +//----------------------mark---------------------- static const int MAXBranchPointNumOnSegment = 4; // 分支上的最大分支点数 static const int MAXPointNum = N + MAXBranchPointNumOnSegment * N; // 最大分支点数加最大卡箍数 -static const double segmentLength = 400; // 卡箍到卡箍之间的最长距离 -static const double MinClipToBranchPointDistance = 1; // 卡箍到分支点的最短距离 -static const double MinBranchPointDistance = 1; // 分支点到分支点的最短距离 +static const double segmentLength = 3000; // *卡箍到卡箍之间的最长距离(搜索半径)(目前2000-3000较好) +static const double MinClipToBranchPointDistance = 11; // 卡箍到分支点的最短距离 +static const double MinBranchPointDistance = 11; // 分支点到分支点的最短距离 // X,Y,Z的正方向 static const P DX = P(1, 0, 0); static const P DY = P(0, 1, 0); @@ -51,21 +51,23 @@ static const P DZ = P(0, 0, 1); CONST_API extern double MAXX, MINX, MAXY, MINY, MAXZ, MINZ; // 卡箍的坐标范围,初值-1e9~1e9 CONST_API extern double Ycenter, Zcenter; // 飞机在Y,Z两轴的中心 -extern vector CONST_API vertices; -extern vector CONST_API indices; -extern Mesh CONST_API mesh; -extern int CONST_API intersection_model; -inline bool inmid(double x, double y, double z, double margin = MARGIN) +// static const double intersection_distance = 100; +static int intersection_model = 0; //是否判断求交 + +// 判断y是否在[x-margin,z+margin]的范围内 +inline bool inmid(const double x, const double y, const double z, const double margin = MARGIN) { return y >= x - margin && y <= z + margin; } -inline bool inbox(P &p) + +inline bool inbox(const P &p) { return inmid(MINX, p.x, MAXX) && inmid(MINY, p.y, MAXY) && inmid(MINZ, p.z, MAXZ); } -inline int dcmp(double d) +// 将d与0比较,返回正负 +inline int dcmp(const double d) { if (d < -eps) return -1; @@ -74,17 +76,36 @@ inline int dcmp(double d) return 0; } -inline double distan1(P &p1, P &p2) +// 空间两点距离 +inline double distan1(const P &p1, const P &p2) { double x = p1.x - p2.x, y = p1.y - p2.y, z = p1.z - p2.z; return sqrt(x * x + y * y + z * z); } +/* +inline double distan2(P &p1,P &p2){ + static double penalty_par=1; + if(intersection_model==1) + { + LineSegment lineSegment(Vec3f(p1.x, p1.y, p1.z),Vec3f(p2.x, p2.y, p2.z)); + static BVH_intersection bvh(mesh); + bool hit = bvh.intersectWithLineSegment(lineSegment); + if(hit==0) + penalty_par=1; + else + penalty_par=100; + } + double x=p1.x-p2.x,y=p1.y-p2.y,z=p1.z-p2.z; + return sqrt(x*x+y*y+z*z)*penalty_par; +} +*/ + inline double Dot(const Vector3 &A, const Vector3 &B) { return A.x * B.x + A.y * B.y + A.z * B.z; } inline double Length(const Vector3 &A) { return sqrt(Dot(A, A)); } inline double Angle(const Vector3 &A, const Vector3 &B) { return acos(Dot(A, B) / Length(A) / Length(B)); } inline double DistanceToPlane(const Point3 &p, const Point3 &p0, const Vector3 &n) { return fabs(Dot(p - p0, n)); } // 如果不取绝对值,得到的是有向距离 -inline int ParallelorVertical(P &p1, P &p2) +inline int ParallelorVertical(const P &p1, const P &p2) { double angel = Angle(p1, p2); if (angel <= minAngle || angel >= pi - minAngle) @@ -93,53 +114,62 @@ inline int ParallelorVertical(P &p1, P &p2) return 2; return 0; } -inline Point3 GetPlaneProjection(Point3 &p, Point3 &p0, Vector3 &n) + +inline Point3 GetPlaneProjection(const Point3 &p, const Point3 &p0, const Vector3 &n) { return p - n * Dot(p - p0, n); } -inline Point3 LinePlaneIntersection(Point3 &p1, Point3 &p2, Point3 &p0, Vector3 &n) + +inline Point3 LinePlaneIntersection(const Point3 &p1, const Point3 &p2, const Point3 &p0, const Vector3 &n) { Vector3 v = p2 - p1; - double t = (Dot(n, p0 - p1) / Dot(n, p2 - p1)); - return p1 + v * t; + double t = (Dot(n, p0 - p1) / Dot(n, p2 - p1)); // 判断分母是否为 0 + return p1 + v * t; // 如果是线段,判断 t 是不是在 0 和 1 之间 } -inline Vector3 Cross(Vector3 A, Vector3 B) + +inline Vector3 Cross(const Vector3 A, const Vector3 B) { return Vector3(A.y * B.z - A.z * B.y, A.z * B.x - A.x * B.z, A.x * B.y - A.y * B.x); } -inline double Area2(Point3 &A, Point3 &B, Point3 &C) -{ - return Length(Cross(B - A, C - A)); -} -inline double get_penalty_par_distance(double len) +inline double Area2(const Point3 &A, const Point3 &B, const Point3 &C) { return Length(Cross(B - A, C - A)); } + +inline double get_penalty_par_distance(const double len) { - static const double intersection_distance = 60; + static const double intersection_distance = 180; if (len <= intersection_distance) return 1; else if (len <= intersection_distance * 1.5) - return 3; + return 1.4; else if (len <= intersection_distance * 3) - return 10; + return 2.6; else if (len <= intersection_distance * 5) - return 20; + return 6; else if (len <= intersection_distance * 10) - return 50; + return 15; else if (len <= intersection_distance * 25) - return 200; + return 30; else return 40; } +/*考虑了连线方向,卡箍方向,连线长度的综合权值函数 + A或者B type!=0时代表它们不是卡箍,对应的inOut没有意义 + inOut1=0代表沿着A的dir,inOut1=1代表逆着A的dir + inOut2=0代表沿着B的dir,inOut2=1代表逆着B的dir +*/ inline double distan(P A, P B, int inOut1, int inOut2) { static double penalty_par_intersection = 1; static double penalty_par_distance = 1; + double angel = Angle(A - B, DX); if (angel > pi / 2) angel = pi - angel; angel = min(angel, pi / 2 - angel); double len = distan1(A, B); + + // 求交判断并赋值惩罚参数 if (intersection_model == 1) { @@ -149,9 +179,11 @@ inline double distan(P A, P B, int inOut1, int inOut2) if (hit == 0) penalty_par_intersection = 1; else - penalty_par_intersection = 100; - penalty_par_distance = get_penalty_par_distance(len); + penalty_par_intersection = 100; //*原400 + // cout << "out: len:" << len << " intersection_distance" << intersection_distance << endl; } + penalty_par_distance = get_penalty_par_distance(len); + double len1 = sqrt((A.y - Ycenter) * (A.y - Ycenter) + (A.z - Zcenter) * (A.z - Zcenter)); double len2 = sqrt((B.y - Ycenter) * (B.y - Ycenter) + (B.z - Zcenter) * (B.z - Zcenter)); if (len1 < R || len2 < R) @@ -167,27 +199,37 @@ inline double distan(P A, P B, int inOut1, int inOut2) angel3 = pi - angel3; angel = min(angel1, min(angel2, angel3)); } + P C; if (inOut1) A.reverse(); C.x = A.dx; C.y = A.dy; C.z = A.dz; + double angel2 = Angle(B - A, C); if (A.isend == 1 || A.type != 0) angel2 = 0; + if (inOut2) B.reverse(); C.x = B.dx; C.y = B.dy; C.z = B.dz; + double angel3 = Angle(B - A, C); if (B.isend == 1 || B.type != 0) angel3 = 0; + double orign_distance = len * (angel * 4 + 1) + 300 * 600 * (angel2 + angel3) / len; return orign_distance * penalty_par_intersection * penalty_par_distance; } +/*考虑了连线方向,卡箍方向,连线长度的综合权值函数 + A和B自动选择最合适的dir +*/ +//----------------------mark---------------------- +// 多线缆bug:距离太短可能无法生成分离点导致 inline double distan(P A, P B) { static double penalty_par_intersection = 1; @@ -205,9 +247,11 @@ inline double distan(P A, P B) if (hit == 0) penalty_par_intersection = 1; else - penalty_par_intersection = 100; - penalty_par_distance = get_penalty_par_distance(len); + penalty_par_intersection = 100; //*原400 + // cout << "no_out: len:" << len << " intersection_distance" << intersection_distance << endl; } + penalty_par_distance = get_penalty_par_distance(len); + double len1 = sqrt((A.y - Ycenter) * (A.y - Ycenter) + (A.z - Zcenter) * (A.z - Zcenter)); double len2 = sqrt((B.y - Ycenter) * (B.y - Ycenter) + (B.z - Zcenter) * (B.z - Zcenter)); if (len1 < R || len2 < R) @@ -239,10 +283,12 @@ inline double distan(P A, P B) angel3 = min(angel3, pi - angel3); if (B.isend == 1 || B.type != 0) angel3 = 0; + double orign_distance = len * (angel * 4 + 1) + 300 * 600 * (angel2 + angel3) / len; return orign_distance * penalty_par_intersection * penalty_par_distance; } +// 打印路径信息 inline void printPath(vector

vecp) { for (int j = 0; j < vecp.size(); j++) diff --git a/WireRouting_DLL/Geometry.cpp b/WireRouting_DLL/Geometry.cpp index 78aa4ad..285ca67 100644 --- a/WireRouting_DLL/Geometry.cpp +++ b/WireRouting_DLL/Geometry.cpp @@ -1,6 +1,10 @@ #include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier #include "Geometry.h" +vector vertices; +vector indices; +Mesh mesh; + AABB::AABB() { min = Vec3f(1e5, 1e5, 1e5); diff --git a/WireRouting_DLL/Geometry.h b/WireRouting_DLL/Geometry.h index 77b9aa1..c03d8d6 100644 --- a/WireRouting_DLL/Geometry.h +++ b/WireRouting_DLL/Geometry.h @@ -99,9 +99,13 @@ public: } }; + typedef Vec3 Vec3f; typedef Vec3 Vec3u; +extern vector GEOMETRY_API vertices; +extern vector GEOMETRY_API indices; + class GEOMETRY_API Mesh { public: @@ -109,6 +113,8 @@ public: std::vector indices; }; +extern Mesh GEOMETRY_API mesh; + class GEOMETRY_API AABB { public: diff --git a/WireRouting_DLL/Intersection.cpp b/WireRouting_DLL/Intersection.cpp index 0b77978..77f3fd2 100644 --- a/WireRouting_DLL/Intersection.cpp +++ b/WireRouting_DLL/Intersection.cpp @@ -58,9 +58,11 @@ size_t BVH_intersection::dfsBuild(vector &indicesList, AABB aabb, size_t nowIdx++; if (indicesList.size() == 1) { + // leaf nodes[nodeIdx] = BVHNode(0, indicesList[0], 0, aabb); // VS2008 return nodeIdx; } + // longest axis int longAxis = -1; float longAxisLen = -1; for (int i = 0; i < 3; ++i) @@ -72,6 +74,7 @@ size_t BVH_intersection::dfsBuild(vector &indicesList, AABB aabb, size_t longAxis = i; } } + // split indices list const size_t k = indicesList.size() / 2; nth(indicesList, k - 1, longAxis); vector leftIndices(indicesList.begin(), indicesList.begin() + k); @@ -112,6 +115,7 @@ AABB BVH_intersection::computeAABB(const vector &indices) bool BVH_intersection::recursiveLineSegIntersection(const LineSegment &lineSegment, size_t nodeIdx) const { + // segment-box intersection test const AABB &aabb = nodes[nodeIdx].boundingBox; const Vec3f &dir = lineSegment.getDir(); bool hit = false; @@ -137,6 +141,7 @@ bool BVH_intersection::recursiveLineSegIntersection(const LineSegment &lineSegme { if (nodes[nodeIdx].left == 0) { + // leaf Vec3u face = mesh.indices[nodes[nodeIdx].right]; TriangleSegmentIntersectRes res = triangleSegmentIntersection(lineSegment, mesh.vertices[face[0]], mesh.vertices[face[1]], mesh.vertices[face[2]]); @@ -146,6 +151,7 @@ bool BVH_intersection::recursiveLineSegIntersection(const LineSegment &lineSegme } else { + // check children return recursiveLineSegIntersection(lineSegment, nodes[nodeIdx].left) || recursiveLineSegIntersection(lineSegment, nodes[nodeIdx].right); } @@ -153,6 +159,8 @@ bool BVH_intersection::recursiveLineSegIntersection(const LineSegment &lineSegme return false; } +// implement nth, without std::nth_element +// kth is 0-based void BVH_intersection::nth(vector &indicesList, size_t kth, int longAxis) { recursiveChoose(indicesList, 0, indicesList.size() - 1, kth, longAxis); diff --git a/WireRouting_DLL/Intersection.h b/WireRouting_DLL/Intersection.h index cfa916f..f104777 100644 --- a/WireRouting_DLL/Intersection.h +++ b/WireRouting_DLL/Intersection.h @@ -27,9 +27,8 @@ struct INTERSECTION_API TriangleSegmentIntersectRes TriangleSegmentIntersectRes(bool h, float tt); }; -extern TriangleSegmentIntersectRes - INTERSECTION_API - triangleSegmentIntersection(const LineSegment &segment, const Vec3f &a, const Vec3f &b, const Vec3f &c); +extern TriangleSegmentIntersectRes INTERSECTION_API +triangleSegmentIntersection(const LineSegment &segment, const Vec3f &a, const Vec3f &b, const Vec3f &c); class INTERSECTION_API BVHNode { diff --git a/WireRouting_DLL/KDtree.cpp b/WireRouting_DLL/KDtree.cpp index 1660d4b..0560cca 100644 --- a/WireRouting_DLL/KDtree.cpp +++ b/WireRouting_DLL/KDtree.cpp @@ -1,6 +1,8 @@ #include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier #include "KDtree.h" +KDtree kdtree; + bool cmp0(const point &a, const point &b) { return a.x[0] < b.x[0]; @@ -192,6 +194,7 @@ void KDtree::build() build(root, 1, n, 0); } +// 返回离s最近的k个点的编号 vector KDtree::search_by_k(P &s, int k) { X = s.x; diff --git a/WireRouting_DLL/KDtree.h b/WireRouting_DLL/KDtree.h index 36e0876..c231546 100644 --- a/WireRouting_DLL/KDtree.h +++ b/WireRouting_DLL/KDtree.h @@ -82,3 +82,5 @@ struct KD_TREE_API KDtree // 返回距离s点d以内的所有点的编号 vector search_by_dis(P &s, double d); }; + +extern KDtree KD_TREE_API kdtree; diff --git a/WireRouting_DLL/Path.cpp b/WireRouting_DLL/Path.cpp index 7a0ed08..b07978d 100644 --- a/WireRouting_DLL/Path.cpp +++ b/WireRouting_DLL/Path.cpp @@ -1,7 +1,6 @@ #include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier #include "Path.h" -ClipSet clipSet; P dirP(P &A) { @@ -24,6 +23,7 @@ int Path::size() return points.size(); } +// 把路径中经过的卡箍和分支点都标记成使用过的状态 void Path::markPoint() { for (int i = 0; i < points.size(); i++) diff --git a/WireRouting_DLL/Path.h b/WireRouting_DLL/Path.h index 440f40c..6a6a00c 100644 --- a/WireRouting_DLL/Path.h +++ b/WireRouting_DLL/Path.h @@ -22,8 +22,6 @@ #include using namespace std; -extern ClipSet PATH_API clipSet; - extern P PATH_API dirP(P &A); // 简单的路径信息,路径规划的直接结果 diff --git a/WireRouting_DLL/ReadXML.cpp b/WireRouting_DLL/ReadXML.cpp index 43341a4..46c2394 100644 --- a/WireRouting_DLL/ReadXML.cpp +++ b/WireRouting_DLL/ReadXML.cpp @@ -47,16 +47,18 @@ Bund::Bund() dia = length = 0; } -void init_readxml() -{ - wire_node.clear(); - wire_pairs.clear(); - mp.clear(); - wiremap.clear(); - pinidmap.clear(); - pinmap.clear(); - cnt = 0; -} + + +// void init_readxml() +// { +// wire_node.clear(); +// wire_pairs.clear(); +// mp.clear(); +// wiremap.clear(); +// pinidmap.clear(); +// pinmap.clear(); +// cnt = 0; +// } // // void producePin(TiXmlElement* pin){