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