GEOS  3.14.0dev
Vertex.h
1 /**********************************************************************
2  *
3  * GEOS - Geometry Engine Open Source
4  * http://geos.osgeo.org
5  *
6  * Copyright (C) 2012 Excensus LLC.
7  *
8  * This is free software; you can redistribute and/or modify it under
9  * the terms of the GNU Lesser General Licence as published
10  * by the Free Software Foundation.
11  * See the COPYING file for more information.
12  *
13  **********************************************************************
14  *
15  * Last port: triangulate/quadedge/Vertex.java r705
16  *
17  **********************************************************************/
18 
19 #pragma once
20 
21 #include <cmath>
22 #include <memory>
23 #include <cstring>
24 
25 #include <geos/geom/Coordinate.h>
26 #include <geos/algorithm/HCoordinate.h>
27 #include <geos/triangulate/quadedge/TrianglePredicate.h>
28 
29 
30 //fwd declarations
31 namespace geos {
32 namespace triangulate {
33 namespace quadedge {
34 class QuadEdge;
35 }
36 }
37 }
38 
39 namespace geos {
40 namespace triangulate { //geos.triangulate
41 namespace quadedge { //geos.triangulate.quadedge
42 
60 class GEOS_DLL Vertex {
61 public:
62  static const int LEFT = 0;
63  static const int RIGHT = 1;
64  static const int BEYOND = 2;
65  static const int BEHIND = 3;
66  static const int BETWEEN = 4;
67  static const int ORIGIN = 5;
68  static const int DESTINATION = 6;
69 private:
71 
72 public:
73  Vertex(double _x, double _y);
74 
75  Vertex(double _x, double _y, double _z);
76 
77  Vertex(const geom::Coordinate& _p);
78 
79  Vertex();
80  ~Vertex() {};
81 
82  inline double
83  getX() const
84  {
85  return p.x;
86  }
87 
88  inline double
89  getY() const
90  {
91  return p.y;
92  }
93 
94  inline double
95  getZ() const
96  {
97  return p.z;
98  }
99 
100  inline void
101  setZ(double _z)
102  {
103  p.z = _z;
104  }
105 
106  inline const geom::Coordinate&
107  getCoordinate() const
108  {
109  return p;
110  }
111 
112  inline bool
113  equals(const Vertex& _x) const
114  {
115  return p.equals2D(_x.p);
116  }
117 
118  inline bool
119  equals(const Vertex& _x, double tolerance) const
120  {
121  if(p.distance(_x.getCoordinate()) < tolerance) {
122  return true;
123  }
124  return false;
125  }
126 
127  int classify(const Vertex& p0, const Vertex& p1);
128 
135  inline double
136  crossProduct(const Vertex& v) const
137  {
138  return (p.x * v.getY() - p.y * v.getX());
139  }
140 
147  inline double
148  dot(Vertex v) const
149  {
150  return (p.x * v.getX() + p.y * v.getY());
151  }
152 
159  inline std::unique_ptr<Vertex>
160  times(double c) const
161  {
162  return std::unique_ptr<Vertex>(new Vertex(c * p.x, c * p.y));
163  }
164 
165  /* Vector addition */
166  inline std::unique_ptr<Vertex>
167  sum(Vertex v) const
168  {
169  return std::unique_ptr<Vertex>(new Vertex(p.x + v.getX(), p.y + v.getY()));
170  }
171 
172  /* and subtraction */
173  inline std::unique_ptr<Vertex>
174  sub(const Vertex& v) const
175  {
176  return std::unique_ptr<Vertex>(new Vertex(p.x - v.getX(), p.y - v.getY()));
177  }
178 
179  /* magnitude of vector */
180  inline double
181  magn() const
182  {
183  return (std::sqrt(p.x * p.x + p.y * p.y));
184  }
185 
186  /* returns k X v (cross product). this is a vector perpendicular to v */
187  inline std::unique_ptr<Vertex>
188  cross() const
189  {
190  return std::unique_ptr<Vertex>(new Vertex(p.y, -p.x));
191  }
192 
194  /***********************************************************************************************
195  * Geometric primitives /
196  **********************************************************************************************/
197 
207  bool isInCircle(const Vertex& a, const Vertex& b, const Vertex& c) const {
209  }
210 
219  inline bool
220  isCCW(const Vertex& b, const Vertex& c) const
221  {
222  // check if signed area is positive
223  return (b.p.x - p.x) * (c.p.y - p.y)
224  > (b.p.y - p.y) * (c.p.x - p.x);
225  }
226 
227  bool rightOf(const QuadEdge& e) const;
228  bool leftOf(const QuadEdge& e) const;
229 
230 private:
231  static std::unique_ptr<algorithm::HCoordinate> bisector(const Vertex& a, const Vertex& b);
232 
233  inline double
234  distance(const Vertex& v1, const Vertex& v2)
235  {
236  return std::sqrt(pow(v2.getX() - v1.getX(), 2.0) +
237  pow(v2.getY() - v1.getY(), 2.0));
238  }
239 
250  double circumRadiusRatio(const Vertex& b, const Vertex& c);
251 
258  std::unique_ptr<Vertex> midPoint(const Vertex& a);
259 
267  std::unique_ptr<Vertex> circleCenter(const Vertex& b, const Vertex& c) const;
268 
273  double interpolateZValue(const Vertex& v0, const Vertex& v1, const Vertex& v2) const;
274 
288  static double interpolateZ(const geom::Coordinate& p, const geom::Coordinate& v0,
289  const geom::Coordinate& v1, const geom::Coordinate& v2);
290 
299  static double interpolateZ(const geom::Coordinate& p, const geom::Coordinate& p0,
300  const geom::Coordinate& p1);
301 };
302 
303 inline bool
304 operator<(const Vertex& v1, const Vertex& v2)
305 {
306  return v1.getCoordinate() < v2.getCoordinate();
307 }
308 
309 } //namespace geos.triangulate.quadedge
310 } //namespace geos.triangulate
311 } //namespace geos
312 
Coordinate is the lightweight class used to store coordinates.
Definition: Coordinate.h:217
double z
z-coordinate
Definition: Coordinate.h:241
A class that represents the edge data structure which implements the quadedge algebra.
Definition: QuadEdge.h:53
static geom::Location isInCircleRobust(const CoordinateXY &a, const CoordinateXY &b, const CoordinateXY &c, const CoordinateXY &p)
Models a site (node) in a QuadEdgeSubdivision.
Definition: Vertex.h:60
double crossProduct(const Vertex &v) const
Definition: Vertex.h:136
std::unique_ptr< Vertex > times(double c) const
Definition: Vertex.h:160
double dot(Vertex v) const
Definition: Vertex.h:148
bool isCCW(const Vertex &b, const Vertex &c) const
Definition: Vertex.h:220
bool isInCircle(const Vertex &a, const Vertex &b, const Vertex &c) const
Definition: Vertex.h:207
Basic namespace for all GEOS functionalities.
Definition: Angle.h:25