xmsgeom  1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
geoms.h
Go to the documentation of this file.
1 #pragma once
2 //------------------------------------------------------------------------------
9 //------------------------------------------------------------------------------
10 
11 //----- Included files ---------------------------------------------------------
12 
13 // 3. Standard Library Headers
14 #include <vector>
15 
16 // 4. External Library Headers
17 #include <xmscore/points/pt.h> // Pt3d, Pt2d, etc.
18 #include <xmscore/stl/vector.h>
19 
20 // 5. Shared Headers
21 
22 // 6. Non-shared Headers
23 
24 //----- Namespace declaration --------------------------------------------------
25 
26 namespace xms
27 {
29 enum Turn_enum {
30  TURN_LEFT,
31  TURN_RIGHT,
32  TURN_COLINEAR_180,
33  TURN_COLINEAR_0
34 };
35 
37 enum PtInOutOrOn_enum {
38  PT_ERROR = -1,
39  PT_IN,
40  PT_OUT,
41  PT_ON
42 };
43 
44 //----- Forward declarations ---------------------------------------------------
45 
46 //----- Global functions -------------------------------------------------------
47 
48 bool gmPointInOrOnBox2d(const Pt3d& a_bMin, const Pt3d& a_bMax, const Pt3d& a_pt);
49 bool gmBoxesOverlap2d(const Pt3d& a_b1Min,
50  const Pt3d& a_b1Max,
51  const Pt3d& a_b2Min,
52  const Pt3d& a_b2Max);
53 void gmCalculateNormalizedPlaneCoefficients(const Pt3d& p1,
54  const Pt3d& p2,
55  const Pt3d& p3,
56  double* a,
57  double* b,
58  double* c,
59  double* d);
60 void gmCalculateNormalizedPlaneCoefficients(const Pt3d* p1,
61  const Pt3d* p2,
62  const Pt3d* p3,
63  double* a,
64  double* b,
65  double* c,
66  double* d);
67 double gmMiddleZ(const VecPt3d& a_points);
68 PtInOutOrOn_enum gmPtInCircumcircle(const Pt3d& pt, Pt3d circumcirclePts[3]);
69 double gmXyDistanceSquared(const Pt3d& pt1, const Pt3d& pt2);
70 bool gmCircumcircleWithTol(const Pt3d* pt1,
71  const Pt3d* pt2,
72  const Pt3d* pt3,
73  double* xc,
74  double* yc,
75  double* r2,
76  double tol);
77 int gmCartToBary(const Pt3d* cart, const Pt3d* orig, double coef[6], int dir, Pt3d* bary);
78 int gmBaryPrepare(const Pt3d* p1,
79  const Pt3d* p2,
80  const Pt3d* p3,
81  const Pt3d* norm,
82  Pt3d* orig,
83  double coef[6],
84  int* dir,
85  bool flag);
86 bool gmColinearWithTol(const Pt3d& p1, const Pt3d& p2, const Pt3d& p3, const double tol);
87 bool gmIntersectLineSegmentsWithTol(const Pt3d& one1,
88  const Pt3d& one2,
89  const Pt3d& two1,
90  const Pt3d& two2,
91  double* xi,
92  double* yi,
93  double* zi1,
94  double* zi2,
95  double tol);
96 bool gmCounterClockwiseTri(const Pt3d& vtx0, const Pt3d& vtx1, const Pt3d& vtx2);
97 double gmCross2D(const double& dx1, const double& dy1, const double& dx2, const double& dy2);
98 double gmAngleBetween2DVectors(double dxp, double dyp, double dxn, double dyn);
99 double gmAngleBetween2DVectors(double dxp,
100  double dyp,
101  double dxn,
102  double dyn,
103  double a_magn,
104  double a_magp);
105 double gmAngleBetweenEdges(const Pt3d&, const Pt3d&, const Pt3d&);
106 double gmAngleBetweenEdges(const Pt2d& p1, const Pt2d& p2, const Pt2d& p3);
107 double gmComputeDeviationInDirection(const Pt3d&, const Pt3d&, const Pt3d&);
108 bool gmOnLineAndBetweenEndpointsWithTol(const Pt3d& a_pt1,
109  const Pt3d& a_pt2,
110  const double a_x,
111  const double a_y,
112  double a_tol);
113 bool gmOnLineWithTol(const Pt3d& vertex1,
114  const Pt3d& vertex2,
115  const double x,
116  const double y,
117  const double tol);
118 void gmAddToExtents(const Pt3d& a_pt, Pt3d& a_min, Pt3d& a_max);
119 void gmAddToExtents(const Pt3d& a_pt, Pt2d& a_min, Pt2d& a_max);
120 void gmAddToExtents(const Pt2d& a_pt, Pt3d& a_min, Pt3d& a_max);
121 double gmXyDistance(double x1, double y1, double x2, double y2);
122 double gmXyDistance(const Pt3d& pt1, const Pt3d& pt2);
123 Turn_enum gmTurn(const Pt3d& a_v1, const Pt3d& a_v2, const Pt3d& a_v3, double a_angtol = 0.0017453);
124 Pt3d gmComputeCentroid(const VecPt3d& a_points);
125 Pt3d gmComputePolygonCentroid(const VecPt3d& pts);
126 bool gmLinesIntersect(const Pt3d& one1, const Pt3d& one2, const Pt3d& two1, const Pt3d& two2);
127 int gmPointInPolygon2D(const Pt3d*, size_t, double, double);
128 int gmPointInPolygon2D(const Pt3d*, size_t, double, double);
129 int gmPointInPolygon2D(const Pt3d*, size_t, Pt3d);
130 int gmPointInPolygon2D(const Pt2i*, size_t, Pt2d);
131 int gmPointInPolygon2D(const Pt2i*, size_t, Pt2i);
132 int gmPointInPolygon2D(const Pt2i*, size_t, Pt3d);
133 int gmPointInPolygon2D(const VecPt3d&, const Pt3d&);
134 template <typename T>
135 int gmPointInPolygon2D(const T* theverts,
136  const size_t numverts,
137  const double xpt,
138  const double ypt,
139  const double tol);
140 double gmComputeXyTol(const Pt3d& a_mn, const Pt3d& a_mx);
141 double gmXyTol(bool a_set = false, double a_value = 1e-9);
142 double gmZTol(bool a_set = false, double a_value = 1e-6);
143 bool gmEqualPointsXY(double x1, double y1, double x2, double y2);
144 bool gmEqualPointsXY(double x1, double y1, double x2, double y2, double tol);
145 bool gmEqualPointsXY(const Pt2i&, const Pt2i&);
146 bool gmEqualPointsXY(const Pt2d& a_pt1, const Pt2d& a_pt2, double tol);
147 bool gmEqualPointsXY(const Pt3d& a_pt1, const Pt3d& a_pt2, double tol);
148 bool gmEqualPointsXYZ(double x1, double y1, double z1, double x2, double y2, double z2);
149 bool gmEqualPointsXYZ(double x1, double y1, double z1, double x2, double y2, double z2, double tol);
150 bool gmEqualPointsXYZ(const Pt3d& pt1, const Pt3d& pt2, double tol);
151 bool gmPointInTriangleWithTol(const Pt3d* p1,
152  const Pt3d* p2,
153  const Pt3d* p3,
154  double x,
155  double y,
156  double tol);
157 bool gmInsideOrOnLineWithTol(const Pt3d* p1,
158  const Pt3d* p2,
159  const Pt3d* inpoint,
160  double x,
161  double y,
162  double tol,
163  double* dist = NULL);
164 double gmPolygonArea(const Pt3d* points, size_t npoints);
165 VecPt3d gmArrayToVecPt3d(double* a_array, int a_size);
166 void gmEnvelopeOfPts(const VecPt3d& a_pts, Pt3d& a_min, Pt3d& a_max);
167 void gmOrderPointsCounterclockwise(const VecPt3d& pts, VecInt& ccwOrder, int startindex = 0);
168 void gmOrderPointsCounterclockwise(VecPt3d& pts);
169 double gmFindClosestPtOnSegment(const Pt3d& pt1,
170  const Pt3d& pt2,
171  const Pt3d& pt,
172  Pt3d& newpt,
173  const double tol);
174 double gmPtDistanceAlongSegment(const Pt3d& pt1, const Pt3d& pt2, const Pt3d& pt, const double tol);
175 bool gmInsideOfLineWithTol(const Pt3d& a_vertex1,
176  const Pt3d& a_vertex2,
177  const Pt3d& a_oppositevertex,
178  const double a_x,
179  const double a_y,
180  const double a_tol);
181 void gmExtents2D(const VecPt3d& a_pts, Pt2d& a_min, Pt2d& a_max);
182 void gmExtents2D(const VecPt3d& a_points, Pt3d& a_min, Pt3d& a_max);
183 void gmExtents3D(const VecPt3d& a_points, Pt3d& a_min, Pt3d& a_max);
184 double gmPerpendicularAngle(const Pt3d& point1, const Pt3d& point2);
185 double gmBisectingAngle(const Pt3d& p1, const Pt3d& p2, const Pt3d& p3);
186 void gmComponentMagnitudes(double* x, double* y, double* mag, double* dir, bool tomagdir);
187 Pt3d gmCreateVector(const Pt3d& p1, const Pt3d& p2);
188 double gmConvertAngleToBetween0And360(double a_angle, bool a_InDegrees = true);
189 void gmCross3D(const Pt3d& a_vec1, const Pt3d& a_vec2, Pt3d* a_vec3);
190 inline double gmDot3D(const Pt3d& a_vec1, const Pt3d& a_vec2);
191 int gmIntersectTriangleAndLineSegment(const Pt3d& a_pt1,
192  const Pt3d& a_pt2,
193  const Pt3d& a_t0,
194  const Pt3d& a_t1,
195  const Pt3d& a_t2,
196  Pt3d& a_IntersectPt);
197 double gm2DDistanceToLineWithTol(const Pt3d* pt1, const Pt3d* pt2, double x, double y, double tol);
198 
199 } // namespace xms
Pt3< double > Pt3d
std::vector< int > VecInt
std::vector< Pt3d > VecPt3d
Pt2< int > Pt2i