GEOS 3.15.0dev
CircularArcs.h
1/**********************************************************************
2 *
3 * GEOS - Geometry Engine Open Source
4 * http://geos.osgeo.org
5 *
6 * Copyright (C) 2024 ISciences, LLC
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#pragma once
16
17#include <geos/export.h>
18#include <geos/geom/Coordinate.h>
19
20#include <array>
21#include <optional>
22
23namespace geos {
24namespace geom {
25class CoordinateSequence;
26class Envelope;
27}
28}
29
30namespace geos {
31namespace algorithm {
32
33class GEOS_DLL CircularArcs {
34public:
35
37 static geom::CoordinateXY getCenter(const geom::CoordinateXY& p0, const geom::CoordinateXY& p1,
38 const geom::CoordinateXY& p2);
39
40 static double getAngle(const geom::CoordinateXY& pt, const geom::CoordinateXY& center);
41
42 static geom::CoordinateXY getDirectionPoint(const geom::CoordinateXY& center, double radius, double theta, bool isCCW);
43
44 static double getMidpointAngle(double theta0, double theta2, bool isCCW);
45
46 static geom::CoordinateXY getMidpoint(const geom::CoordinateXY& p0, const geom::CoordinateXY& p2, const geom::CoordinateXY& center, double radius, bool isCCW);
47
49 static void expandEnvelope(geom::Envelope& e, const geom::CoordinateXY& p0, const geom::CoordinateXY& p1,
50 const geom::CoordinateXY& p2);
51
53 static geom::CoordinateXY createPoint(const geom::CoordinateXY& center, double radius, double theta);
54
65 static void interpolateZM(const geom::CoordinateSequence &seq, size_t i0, const geom::CoordinateXY &center, bool isCCW, geom::CoordinateXY &pt, double
66 &z, double &m);
67
78 static int
79 circleIntersectsLine(const geom::CoordinateXY& center, double r,
80 const geom::CoordinateXY& p0, const geom::CoordinateXY& p1,
81 geom::CoordinateXY& isect0, geom::CoordinateXY& isect1);
82
93 static int
94 circleIntersectsSegment(const geom::CoordinateXY& center, double r,
95 const geom::CoordinateXY& p0, const geom::CoordinateXY& p1,
96 geom::CoordinateXY& isect0, geom::CoordinateXY& isect1);
97
106 static bool
107 containsAngle(double t0, double t2, bool isCCW, double theta);
108
119 static bool
120 containsPointOnCircle(const geom::CoordinateXY& center,
121 const geom::CoordinateXY& p0, const geom::CoordinateXY& p2, bool isCCW,
122 const geom::CoordinateXY& q);
123
134 static double
135 distanceArcPoint(const geom::CoordinateXY& c, double r,
136 const geom::CoordinateXY& p0, const geom::CoordinateXY& p2, bool isCCW,
137 const geom::CoordinateXY& q);
138
149 static double
150 distanceArcSegment(const geom::CoordinateXY& c, double r,
151 const geom::CoordinateXY& p0, const geom::CoordinateXY& p2, bool isCCW,
152 const geom::CoordinateXY& q0, const geom::CoordinateXY& q1);
153
168 static double
169 distanceArcArc(const geom::CoordinateXY& ca, double ra,
170 const geom::CoordinateXY& a0, const geom::CoordinateXY& a2, bool aCCW,
171 const geom::CoordinateXY& cb, double rb,
172 const geom::CoordinateXY& b0, const geom::CoordinateXY& b2, bool bCCW);
173
184 static geom::CoordinateXY
185 closestPointArcPoint(const geom::CoordinateXY& c, double r,
186 const geom::CoordinateXY& p0, const geom::CoordinateXY& p2,
187 bool isCCW, const geom::CoordinateXY &q);
188
200 static std::array<geom::CoordinateXY, 2>
201 closestPointsArcSegment(const geom::CoordinateXY& c, double r,
202 const geom::CoordinateXY& p0, const geom::CoordinateXY& p2, bool isCCW, const geom::CoordinateXY& q0, const geom::CoordinateXY& q1);
203
204
219 static std::array<geom::CoordinateXY, 2> closestPointsArcArc(const geom::CoordinateXY& ca,
220 double ra,
221 const geom::CoordinateXY& a0,
222 const geom::CoordinateXY& a2,
223 bool aCCW,
224 const geom::CoordinateXY& cb,
225 double rb,
226 const geom::CoordinateXY& b0,
227 const geom::CoordinateXY& b2,
228 bool bCCW);
229
244 static std::optional<geom::CoordinateXY>
245 cocircularArcsIntersectionPoint(const geom::CoordinateXY& center, double radius,
246 const geom::CoordinateXY& a0, const geom::CoordinateXY& a2, bool aCCW,
247 const geom::CoordinateXY& b0, const geom::CoordinateXY& b2, bool bCCW);
248
265 static std::optional<geom::CoordinateXY>
266 arcIntersectionPoint(const geom::CoordinateXY& ca, double ra,
267 const geom::CoordinateXY& a0, const geom::CoordinateXY& a2, bool aCCW,
268 const geom::CoordinateXY& cb, double rb,
269 const geom::CoordinateXY& b0, const geom::CoordinateXY& b2, bool bCCW);
270
271};
272}
273}
Basic namespace for all GEOS functionalities.
Definition geos.h:38