GEOS 3.14.0dev
CGAlgorithmsDD.h
1/**********************************************************************
2 *
3 * GEOS - Geometry Engine Open Source
4 * http://geos.osgeo.org
5 *
6 * Copyright (C) 2014 Mateusz Loskot <mateusz@loskot.net>
7 *
8 * This is free software; you can redistribute and/or modify it under
9 * the terms of the GNU Lesser General Public Licence as published
10 * by the Free Software Foundation.
11 * See the COPYING file for more information.
12 *
13 **********************************************************************
14 *
15 * Last port: algorithm/CGAlgorithmsDD.java r789 (JTS-1.14)
16 *
17 **********************************************************************/
18
19#pragma once
20
21#include <geos/export.h>
22#include <geos/math/DD.h>
23#include <cmath>
24
25// Forward declarations
26namespace geos {
27namespace geom {
28class CoordinateXY;
29class CoordinateSequence;
30}
31}
32
33namespace geos {
34namespace algorithm { // geos::algorithm
35
37class GEOS_DLL CGAlgorithmsDD {
38 using DD = geos::math::DD;
39
40public:
41
42 enum {
43 CLOCKWISE = -1,
44 COLLINEAR = 0,
45 COUNTERCLOCKWISE = 1
46 };
47
48 enum {
49 RIGHT = -1,
50 LEFT = 1,
51 STRAIGHT = 0,
52 FAILURE = 2
53 };
54
67 static int orientationIndex(const geom::CoordinateXY& p1,
68 const geom::CoordinateXY& p2,
69 const geom::CoordinateXY& q);
70
71
72 static int orientationIndex(double p1x, double p1y,
73 double p2x, double p2y,
74 double qx, double qy);
75
97 static inline int orientationIndexFilter(
98 double pax, double pay,
99 double pbx, double pby,
100 double pcx, double pcy)
101 {
102 double const detleft = (pax - pcx) * (pby - pcy);
103 double const detright = (pay - pcy) * (pbx - pcx);
104 double const det = detleft - detright;
105 // Coefficient as per Ozaki et al
106 double const error = std::abs(detleft + detright)
107 * 3.3306690621773724e-16;
108 if (std::abs(det) >= error)
109 return (det > 0) - (det < 0);
110 return CGAlgorithmsDD::FAILURE;
111 };
112
113 static int
114 orientation(double x)
115 {
116 if(x < 0) {
117 return CGAlgorithmsDD::RIGHT;
118 }
119 if(x > 0) {
120 return CGAlgorithmsDD::LEFT;
121 }
122 return CGAlgorithmsDD::STRAIGHT;
123 };
124
134 static geom::CoordinateXY intersection(const geom::CoordinateXY& p1, const geom::CoordinateXY& p2,
135 const geom::CoordinateXY& q1, const geom::CoordinateXY& q2);
136
137 static int signOfDet2x2(double dx1, double dy1, double dx2, double dy2);
138
139 static DD detDD(double x1, double y1, double x2, double y2);
140 static DD detDD(const DD& x1, const DD& y1, const DD& x2, const DD& y2);
141
161 static geom::CoordinateXY circumcentreDD(const geom::CoordinateXY& a, const geom::CoordinateXY& b, const geom::CoordinateXY& c);
162
163protected:
164
165 static int signOfDet2x2(const DD& x1, const DD& y1, const DD& x2, const DD& y2);
166
167};
168
169} // namespace geos::algorithm
170} // namespace geos
Implements basic computational geometry algorithms using extended precision float-point arithmetic.
Definition CGAlgorithmsDD.h:37
static int orientationIndexFilter(double pax, double pay, double pbx, double pby, double pcx, double pcy)
Definition CGAlgorithmsDD.h:97
static int orientationIndex(const geom::CoordinateXY &p1, const geom::CoordinateXY &p2, const geom::CoordinateXY &q)
Returns the index of the direction of the point q relative to a vector specified by p1-p2.
static geom::CoordinateXY circumcentreDD(const geom::CoordinateXY &a, const geom::CoordinateXY &b, const geom::CoordinateXY &c)
Computes the circumcentre of a triangle.
static geom::CoordinateXY intersection(const geom::CoordinateXY &p1, const geom::CoordinateXY &p2, const geom::CoordinateXY &q1, const geom::CoordinateXY &q2)
Wrapper for DoubleDouble higher precision mathematics operations.
Definition DD.h:108
Basic namespace for all GEOS functionalities.
Definition geos.h:39