OpenLexocad  27.1
GeomTools.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <Geom/ToolResults.h>
4 
5 #ifdef USE_OCC
6 #include <gp_Ax1.hxx>
7 #include <gp_Ax2.hxx>
8 #include <gp_Ax22d.hxx>
9 #include <gp_Ax3.hxx>
10 #include <gp_Circ.hxx>
11 #include <gp_Dir.hxx>
12 #include <gp_Dir2d.hxx>
13 #include <gp_GTrsf.hxx>
14 #include <gp_Lin.hxx>
15 #include <gp_Lin2d.hxx>
16 #include <gp_Pln.hxx>
17 #include <gp_Pnt.hxx>
18 #include <gp_Pnt2d.hxx>
19 #include <gp_Vec.hxx>
20 #include <gp_Vec2d.hxx>
21 #include <gp_XYZ.hxx>
22 #else
23 class gp_XYZ;
24 class gp_Vec;
25 class gp_Dir;
26 class gp_Pnt;
27 class gp_Pnt2d;
28 class gp_Pln;
29 class gp_Lin;
30 class gp_Vec2d;
31 class gp_Lin2d;
32 class gp_GTrsf;
33 class gp_Ax1;
34 class gp_Ax2;
35 class gp_Ax3;
36 class gp_Ax22d;
37 class gp_Pnt2d;
38 class gp_Circ;
39 class gp_Dir2d;
40 class Bnd_Box;
41 class gp_XY;
42 class gp_Trsf;
43 class gp_Ax22d;
44 class Ax22d;
45 
46 #endif
47 
48 
49 
50 #include <Geom/Ax2.h>
51 #include <Geom/Ax22d.h>
52 #include <Geom/Bnd_Box.h>
53 #include <Geom/Circ.h>
54 #include <Geom/Dir.h>
55 #include <Geom/Lin.h>
56 #include <Geom/Pln.h>
57 #include <Geom/Pnt.h>
58 #include <Geom/Pnt2d.h>
59 #include <Geom/Trsf.h>
60 #include <Geom/Vec.h>
61 #include <Geom/Vec2d.h>
62 #include <Geom/XY.h>
63 #include <Geom/XYZ.h>
64 
65 #include <vector>
66 
67 namespace Geom
68 {
70 {
75 };
76 
77 class LX_GEOM_EXPORT GeomTools
78 {
79 public:
80  GeomTools(void);
81  ~GeomTools(void);
82 
84  static Geom::Pln makePlaneFrom3Points(const Geom::Pnt& p1, const Geom::Pnt& p2, const Geom::Pnt& p3, Geom::Ax2& coordSystem);
86  static Geom::Lin makeLineFrom2Points(const Geom::Pnt& p1, const Geom::Pnt& p2);
87 
89  static Geom::Pnt projectPointOnPlane(const Geom::Pnt& p, const Geom::Pln& plane);
90  static Geom::Pnt projectPointOnPlane(const Geom::Pnt& p, const Geom::Pln& plane, double& U, double& V);
91  static bool isPointOnPlane(const Geom::Pnt& p, const Geom::Pln& plane, double tolerance = 1E-06);
92 
94  static Geom::Pnt projectPointOnLine(const Geom::Pnt& p, const Geom::Lin& line);
95  static Geom::Pnt projectPointOnLine(const Geom::Pnt& p, const Geom::Lin& line, double& U);
96 
98  static Geom::Pnt projectPointOnCircle(const Geom::Pnt& p, const Geom::Circ& circle);
99 
101  static Geom::Pnt midpoint(const Geom::Pnt& p1, const Geom::Pnt& p2);
102  static Geom::Pnt2d midpoint(const Geom::Pnt2d& p1, const Geom::Pnt2d& p2);
103 
104  static double getAngleWithPlane(const Geom::Vec& v, const Geom::Pln& plane);
105  static double getAngleBetweenVectors(const Geom::Vec& v1, const Geom::Vec& v2);
106  static void angleBetween(const Geom::Vec& v1, const Geom::Vec& v2, Geom::Vec& axis, double& angle);
107 
108  struct AngleParams
109  {
118  };
120  {
125  };
126  static Angle3Points get3AnglePoints(AngleParams ap);
127 
129  static Geom::Ax2 makeAxisPlacementFrom2Points(const Geom::Pnt& p1, const Geom::Pnt& p2, double& xLength, double& angleXYPlane);
130  static double getDistanceBetween2Points(const Geom::Pnt& p1, const Geom::Pnt& p2);
131  static Geom::Pnt findClosestPointToPoints(const Geom::Pnt& pnt, const std::vector<Geom::Pnt>& pnts);
132 
133  static bool isEqual(double v1, double v2, double tolerance = 1E-06);
134  static bool isEqual(const Geom::XYZ& v1, const Geom::XYZ& v2, double tolerance = 1E-06);
135  static bool isEqual(const Geom::Pnt& p1, const Geom::Pnt& p2, double tolerance = 1E-06);
136  static bool isEqual(const Geom::Vec& v1, const Geom::Vec& v2, double tolerance = 1E-06);
137  static bool isEqual(const Geom::Dir& d1, const Geom::Dir& d2, double tolerance = 1E-06);
138  static bool isEqual(const Geom::XY& p1, const Geom::XY& p2, double tolerance = 1E-06);
139  static bool isEqual(const Geom::Pnt2d& p1, const Geom::Pnt2d& p2, double tolerance = 1E-06);
140  static bool isEqual(const Geom::Vec2d& p1, const Geom::Vec2d& p2, double tolerance = 1E-06);
141  static bool isEqual(const Geom::Dir2d& p1, const Geom::Dir2d& p2, double tolerance = 1E-06);
142  static bool isEqual(const Geom::Ax1& a1, const Geom::Ax1& a2, double tolerance = 1E-06);
143  static bool isEqual(const Geom::Ax2& a1, const Geom::Ax2& a2, double tolerance = 1E-06);
144  static bool isEqual(const Geom::Ax2d& a1, const Geom::Ax2d& a2, double tolerance = 1E-06);
145  static bool isEqual(const Geom::Ax3& a1, const Geom::Ax3& a2, double tolerance = 1E-06);
146  static bool isEqual(const Geom::Trsf& t1, const Geom::Trsf& t2, double tolerance = 1E-06);
147  static bool isEqual(const Geom::Ax22d& a1, const Geom::Ax22d& a2, double tolerance = 1E-06);
148  static bool isEqual(const Geom::GTrsf& t1, const Geom::GTrsf& t2, double tolerance = 1E-06);
149  static bool isEqual(const Geom::Pln& p1, const Geom::Pln& p2, double tolerance = 1E-06);
150  static bool isEqual(const Geom::Bnd_Box& b1, const Geom::Bnd_Box& b2, double tolerance = 1E-06);
151 
152  static bool intersectLineWithLine(const Geom::Lin& lin1, const Geom::Lin& lin2, Geom::Pnt& intersectPnt, double tolerance = 1E-06);
153  static bool intersectDirWithDir(const Geom::Dir& dir1,
154  const Geom::Pnt& pnt1,
155  const Geom::Dir& dir2,
156  const Geom::Pnt& pnt2,
157  Geom::Pnt& intersection);
158  static Geom::Pnt intersectLineWithPlane(const Geom::Lin& lin, const Geom::Pln& plane);
159  static bool intersectLineWithPlane(const Geom::Lin& lin, const Geom::Pln& plane, Geom::Pnt& intersection); // no exception version
160  static bool intersectBBoxWithPlane(const Geom::Bnd_Box& box, const Geom::Pln& plane);
161  static bool intersectLineWithBoundedRect(const Geom::Lin& lin, const Geom::Pnt& rectPoint1, const Geom::Pnt& rectPoint2, Geom::Pnt& result);
162  static bool intersectPlaneWithPlane(const Geom::Pln& plnA, const Geom::Pln& plnB, Geom::Lin& line, double tolerance = 1e-6);
163  static bool intersectLineWithBBox(const Geom::Lin& lin, const Geom::Bnd_Box& bbox, Geom::Pnt& pnear, Geom::Pnt& pfar, double epsilon = 0.0);
164  static bool makePlaneFrom2Lines(const Geom::Lin& lin1, const Geom::Lin& lin2, Geom::Pln& plane);
165  static bool makeCircleFrom3Points(const Geom::Pnt& p1, const Geom::Pnt& p2, const Geom::Pnt& p3, Geom::Circ& circle);
166  static bool makeCirclesFrom2TangentsAndRadius(const Geom::Lin& lin1,
167  const Geom::Lin& lin2,
168  double radius,
169  std::vector<Geom::Circ>& circles,
170  std::vector<Geom::Pnt>& pnt1,
171  std::vector<Geom::Pnt>& pnt2,
172  std::vector<double>& paramOnLin1 = std::vector<double>(),
173  std::vector<double>& paramOnLin2 = std::vector<double>(),
174  std::vector<double>& paramOnCirclesFromLin1 = std::vector<double>(),
175  std::vector<double>& paramOnCirclesFromLin2 = std::vector<double>(),
178  double tolerance = 1E-06);
179  static bool makeCirclesFrom2TangentsAndCenterOnLine(const Geom::Lin& lin1,
180  const Geom::Lin& lin2,
181  const Geom::Lin& lin3,
182  std::vector<Geom::Circ>& circles,
183  std::vector<Geom::Pnt>& pnt1,
184  std::vector<Geom::Pnt>& pnt2,
185  std::vector<double>& paramOnLin1 = std::vector<double>(),
186  std::vector<double>& paramOnLin2 = std::vector<double>(),
187  std::vector<double>& paramOnCirclesFromLin1 = std::vector<double>(),
188  std::vector<double>& paramOnCirclesFromLin2 = std::vector<double>(),
191  double tolerance = 1E-06);
192  static bool makeLinePerpendicularToLineThroughPoint(const Geom::Pln& plane,
193  const Geom::Pnt& thruPnt,
194  const Geom::Lin& line,
195  Geom::Lin& solution,
196  Geom::Pnt& point,
197  double& paramOnLine,
198  double& paramOnSolution);
199  static bool make2DLines_Tangent2Circles(const Geom::Circ& circle1,
200  const Geom::Circ& circle2,
201  std::vector<Geom::Lin>& lines,
202  std::vector<Geom::Pnt>& tangentPoints1,
203  std::vector<Geom::Pnt>& tangentPoints2);
204  static bool make2DLines_TangentCirclePoint(const Geom::Circ& circle,
205  const Geom::Pnt& point,
206  std::vector<Geom::Lin>& lines,
207  std::vector<Geom::Pnt>& tangentPoints);
208  static bool makeLines_BisLineLine(const Geom::Lin l1, const Geom::Lin l2, std::vector<Geom::Lin>& result);
209  static bool make2DCircles_RadiusPointPoint(double radius, const Geom::Pnt& point1, const Geom::Pnt& point2, std::vector<Geom::Circ>& result);
210  static bool makeCircles_RadiusLinePoint(double radius, const Geom::Lin& line, const Geom::Pnt& point, std::vector<Geom::Circ>& result);
211  static bool makeCircles_RadiusCirclePoint(double radius, const Geom::Circ& circle, const Geom::Pnt& point, std::vector<Geom::Circ>& result);
212  static bool makeCircles_RadiusLineLine(double radius, const Geom::Lin& line1, const Geom::Lin& line2, std::vector<Geom::Circ>& result);
213  static bool makeCircles_RadiusLineCircle(double radius, const Geom::Lin& line, const Geom::Circ& circle, std::vector<Geom::Circ>& result);
214  static bool makeCircles_RadiusCircleCircle(double radius, const Geom::Circ& circle1, const Geom::Circ& circle2, std::vector<Geom::Circ>& result);
215  static double calculateAngleFrom3Points(const Geom::Pnt& first, const Geom::Pnt& center, const Geom::Pnt& second, const Geom::Vec& refVec);
216  static double getSignedDistanceFromPointToPlane(const Geom::Pnt& p, const Geom::Pln& plane);
217  static double convertRadianToDegree(double radValue);
218  static double convertDegreeToRadian(double degValue);
219  static double convertPercentToRadian(double percentValue);
220  static double convertRadianToPercent(double radValue);
221  static Geom::Pnt getNormalizedCoordinatesRelativeToBndBox(const Geom::Bnd_Box& box, const Geom::Pnt& p);
222  static Geom::Pnt getCoordinatesFromNormalizedRelativeToBndBox(const Geom::Bnd_Box& box, const Geom::Pnt& p);
223  static void getAnglesFromPosition(const Geom::Ax2& position, double& rotx, double& roty, double& rotz);
224  static bool pointsOnSamePlane(const std::vector<Geom::Pnt>& inVector, Geom::Pln& outPlane);
225  static bool pointsAreCollinear(const std::vector<Geom::Pnt>& inVector);
226  static void debugOccTransform(const Geom::GTrsf& transform, const std::string& msg = "");
227  static void debugOccTransform(const Geom::Trsf& transform, const std::string& msg = "");
228  static bool Geom::GeomTools::getUnitCylinderLineIntersection(const Geom::Pnt& lineStart,
229  const Geom::Pnt& lineEnd,
230  Geom::Pnt& isectFront,
231  Geom::Pnt& isectBack);
233  const double& cylinder_radius,
234  const Geom::Pnt& lineStart,
235  const Geom::Pnt& lineEnd,
236  Geom::Pnt& isectFront,
237  Geom::Pnt& isectBack);
238  static Geom::Vec getClosestAxis(const Geom::Vec& vec);
239  static int gcd(int a, int b);
240  static void circumscribeSphereAroundBox(Geom::Bnd_Box box, Geom::Vec& center, double& radius);
241  static bool getIntersectionWithTriangle(const Geom::Pnt& p1,
242  const Geom::Pnt& p2,
243  const Geom::Pnt& p3,
244  const Geom::Pnt& pickedPnt,
245  Geom::Pnt& intersection);
246  static void calculatePositionToViewBoundingBoxForDefaultView(Geom::Bnd_Box bbox,
247  Geom::Vec direction,
248  float aspectRatio,
249  double heightAngle,
250  Geom::Vec& position,
251  Geom::Vec& center);
252  static Geom::Pnt lineValue(const double& u, const Geom::Ax1& ax1);
253  static bool computeComplemetaryAngle(const Geom::Pnt& P1, const Geom::Pnt& S, const Geom::Pnt& P2, double& radians);
254  static bool computeClothoidMaxR(const double& radians, const double& TG, double& R);
255  static Geom::Trsf computeTrsfFromAx2(const Geom::Ax2& worldAxis);
256  static bool isConvexPolyon(const std::vector<Geom::Pnt>& inVector);
257  static bool isConvexPolyon(const std::vector<int>& inModel, const std::vector<Geom::Pnt>& inVector);
258  static bool rayTriangleIntersect(const Geom::Vec& orig,
259  const Geom::Vec& dir,
260  const Geom::Vec& v0,
261  const Geom::Vec& v1,
262  const Geom::Vec& v2,
263  float& t,
264  float& u,
265  float& v);
266  static bool centroid(Geom::Pnt& ret_centroid, std::vector<Geom::Pnt>& pnts);
267  static bool testRayThruTriangle(const Geom::Pnt& P1,
268  const Geom::Pnt& P2,
269  const Geom::Pnt& P3,
270  const Geom::Dir& normal,
271  const Geom::Lin& ray,
272  Geom::Pnt& PIP);
273 
276  static GT_MakePlaneFrom3Points_Result makePlaneFrom3Points(const Geom::Pnt& p1, const Geom::Pnt& p2, const Geom::Pnt& p3);
277  static GT_MakeLineFrom2Points1_Result makeLineFrom2Points1(const Geom::Pnt& p1, const Geom::Pnt& p2);
278  static GT_ProjectPointOnPlane1_Result projectPointOnPlane1(const Geom::Pnt& p, const Geom::Pln& plane);
279  static GT_ProjectPointOnPlane2_Result projectPointOnPlane2(const Geom::Pnt& p, const Geom::Pln& plane);
280  static GT_ProjectPointOnLine1_Result projectPointOnLine1(const Geom::Pnt& p, const Geom::Lin& line);
281  static GT_ProjectPointOnLine2_Result projectPointOnLine2(const Geom::Pnt& p, const Geom::Lin& line);
282  static GT_ProjectPointOnCircle1_Result projectPointOnCircle1(const Geom::Pnt& p, const Geom::Circ& circle);
283  static GT_MakeAxisPlacementFrom2Points_Result makeAxisPlacementFrom2Points(const Geom::Pnt& p1, const Geom::Pnt& p2);
285 };
286 
287 } // namespace Geom
Definition: Circ.h:53
Definition: Variant.h:60
Definition: XY.h:33
Definition: Pln.h:57
Definition: GeomTools.h:108
Defines a non-persistent 3D Cartesian point.
Definition: Pnt.h:43
Struct holding the return values from GeomTools::makeAxisPlacementFrom2Points(). Returns ok=true if t...
Definition: ToolResults.h:120
Geom::Pnt pntOnEdge2
Definition: GeomTools.h:115
Definition: Ax2d.h:48
Geom::Pnt endPoint
Definition: GeomTools.h:122
Definition: GeomTools.h:119
Definition: Dir2d.h:38
Qualifier
Definition: GeomTools.h:69
Geom::Pnt startPoint
Definition: GeomTools.h:121
Geom::Pln plane
Definition: GeomTools.h:116
Definition: Bnd_Box.h:63
Geom::Pnt e2p1
Definition: GeomTools.h:112
Definition: GeomTools.h:74
Definition: GeomTools.h:71
static bool getUnitCylinderLineIntersection(const Geom::Pnt &lineStart, const Geom::Pnt &lineEnd, Geom::Pnt &isectFront, Geom::Pnt &isectBack)
Struct holding the return values from GeomTools::makePlaneFrom3Points(). Returns ok=true if the opera...
Definition: ToolResults.h:18
bool secondViewerMode
Definition: GeomTools.h:117
void transform(Container container, OutputIt out, BinaryFunction function)
Definition: Algorithms.h:29
Geom::Pnt e1p1
Definition: GeomTools.h:110
Definition: Ax2.h:67
Definition: XYZ.h:43
Definition: Lin.h:48
bool pointsFound
Definition: GeomTools.h:124
Definition: Trsf.h:57
Definition: Dir.h:45
Struct holding the return values from GeomTools::projectPointOnCircle1(). Returns ok=true if the oper...
Definition: ToolResults.h:106
Geom::Pnt e1p2
Definition: GeomTools.h:111
Geom::Pnt pntOnEdge1
Definition: GeomTools.h:114
Struct holding the return values from GeomTools::projectPointOnPlane1(). Returns ok=true if the opera...
Definition: ToolResults.h:47
Struct holding the return values from GeomTools::projectPointOnPlane2(). Returns ok=true if the opera...
Definition: ToolResults.h:61
Defines a non-persistent vector in 2D space.
Definition: Vec2d.h:34
Struct holding the return values from GeomTools::projectPointOnLine1(). Returns ok=true if the operat...
Definition: ToolResults.h:77
Definition: Ax3.h:69
Geom::Pnt e2p2
Definition: GeomTools.h:113
Definition: GeomTools.h:73
Definition: Ax1.h:50
Struct holding the return values from GeomTools::makeLineFrom2Points1(). Returns ok=true if the opera...
Definition: ToolResults.h:33
Defines a non-persistent vector in 3D space.
Definition: Vec.h:44
Definition: GTrsf.h:47
Geom::Pnt apexPoint
Definition: GeomTools.h:123
Definition: Ax22d.h:50
Struct holding the return values from GeomTools::projectPointOnLine2(). Returns ok=true if the operat...
Definition: ToolResults.h:91
static bool getCylinderLineIntersection(Geom::Ax2 &cylinder_ax, const double &cylinder_radius, const Geom::Pnt &lineStart, const Geom::Pnt &lineEnd, Geom::Pnt &isectFront, Geom::Pnt &isectBack)
Definition: GeomTools.h:77
Definition: GeomTools.h:72
Defines a non-persistent 2D cartesian point.
Definition: Pnt2d.h:33