GEOS 3.15.0beta1
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 {
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
68 static void interpolateZM(const geom::CoordinateSequence &seq, size_t i0, const geom::CoordinateXY &center, bool isCCW, geom::CoordinateXY &pt, double
69 &z, double &m);
70
81 static int
82 circleIntersectsLine(const geom::CoordinateXY& center, double r,
83 const geom::CoordinateXY& p0, const geom::CoordinateXY& p1,
84 geom::CoordinateXY& isect0, geom::CoordinateXY& isect1);
85
96 static int
97 circleIntersectsSegment(const geom::CoordinateXY& center, double r,
98 const geom::CoordinateXY& p0, const geom::CoordinateXY& p1,
99 geom::CoordinateXY& isect0, geom::CoordinateXY& isect1);
100
109 static bool
110 containsAngle(double t0, double t2, bool isCCW, double theta);
111
122 static bool
123 containsPointOnCircle(const geom::CoordinateXY& center,
124 const geom::CoordinateXY& p0, const geom::CoordinateXY& p2, bool isCCW,
125 const geom::CoordinateXY& q);
126
137 static double
138 distanceArcPoint(const geom::CoordinateXY& c, double r,
139 const geom::CoordinateXY& p0, const geom::CoordinateXY& p2, bool isCCW,
140 const geom::CoordinateXY& q);
141
152 static double
153 distanceArcSegment(const geom::CoordinateXY& c, double r,
154 const geom::CoordinateXY& p0, const geom::CoordinateXY& p2, bool isCCW,
155 const geom::CoordinateXY& q0, const geom::CoordinateXY& q1);
156
171 static double
172 distanceArcArc(const geom::CoordinateXY& ca, double ra,
173 const geom::CoordinateXY& a0, const geom::CoordinateXY& a2, bool aCCW,
174 const geom::CoordinateXY& cb, double rb,
175 const geom::CoordinateXY& b0, const geom::CoordinateXY& b2, bool bCCW);
176
187 static geom::CoordinateXY
188 closestPointArcPoint(const geom::CoordinateXY& c, double r,
189 const geom::CoordinateXY& p0, const geom::CoordinateXY& p2,
190 bool isCCW, const geom::CoordinateXY &q);
191
203 static std::array<geom::CoordinateXY, 2>
204 closestPointsArcSegment(const geom::CoordinateXY& c, double r,
205 const geom::CoordinateXY& p0, const geom::CoordinateXY& p2, bool isCCW, const geom::CoordinateXY& q0, const geom::CoordinateXY& q1);
206
207
222 static std::array<geom::CoordinateXY, 2> closestPointsArcArc(const geom::CoordinateXY& ca,
223 double ra,
224 const geom::CoordinateXY& a0,
225 const geom::CoordinateXY& a2,
226 bool aCCW,
227 const geom::CoordinateXY& cb,
228 double rb,
229 const geom::CoordinateXY& b0,
230 const geom::CoordinateXY& b2,
231 bool bCCW);
232
247 static std::optional<geom::CoordinateXY>
248 cocircularArcsIntersectionPoint(const geom::CoordinateXY& center, double radius,
249 const geom::CoordinateXY& a0, const geom::CoordinateXY& a2, bool aCCW,
250 const geom::CoordinateXY& b0, const geom::CoordinateXY& b2, bool bCCW);
251
268 static std::optional<geom::CoordinateXY>
269 arcIntersectionPoint(const geom::CoordinateXY& ca, double ra,
270 const geom::CoordinateXY& a0, const geom::CoordinateXY& a2, bool aCCW,
271 const geom::CoordinateXY& cb, double rb,
272 const geom::CoordinateXY& b0, const geom::CoordinateXY& b2, bool bCCW);
273
274};
275}
276}
The internal representation of a list of coordinates inside a Geometry.
Definition CoordinateSequence.h:56
An Envelope defines a rectangulare region of the 2D coordinate plane.
Definition Envelope.h:59
Contains classes and interfaces implementing fundamental computational geometry algorithms.
Definition Angle.h:32
Definition Angle.h:26
Basic namespace for all GEOS functionalities.
Definition geos.h:38