17#include <geos/export.h>
18#include <geos/geom/Coordinate.h>
19#include <geos/geom/LineSegment.h>
20#include <geos/geom/Quadrant.h>
21#include <geos/algorithm/CircularArcs.h>
22#include <geos/algorithm/Orientation.h>
47 CircularArc(std::unique_ptr<CoordinateSequence>, std::size_t pos);
48 CircularArc(std::unique_ptr<CoordinateSequence>, std::size_t pos,
const CoordinateXY& center,
double radius,
int orientation);
62 template<typename CoordType>
63 static
CircularArc create(const CoordType& p0, const CoordType& p1, const CoordType& p2)
65 auto seq = std::make_unique<CoordinateSequence>(3, CoordType::template has<Ordinate::Z>(), CoordType::template has<Ordinate::M>());
75 static CircularArc create(
const CoordinateXY& p0,
const CoordinateXY& p2,
const CoordinateXY& center,
double radius,
int orientation);
77 static CircularArc create(
const CoordinateXYM& p0,
const CoordinateXYM& p2,
const CoordinateXY& center,
double radius,
int orientation);
78 static CircularArc create(
const CoordinateXYZM& p0,
const CoordinateXYZM& p2,
const CoordinateXY& center,
double radius,
int orientation);
88 if (!m_center_known) {
89 m_center = algorithm::CircularArcs::getCenter(p0(), p1(), p2());
90 m_center_known =
true;
100 std::size_t getCoordinatePosition()
const {
112 if (!m_orientation_known) {
113 m_orientation = algorithm::Orientation::index(p0(), p1(), p2());
114 m_orientation_known =
true;
116 return m_orientation;
121 if (!m_radius_known) {
122 m_radius = getCenter().distance(p0());
123 m_radius_known =
true;
131 CoordinateXY midpoint = algorithm::CircularArcs::getMidpoint(p0(), p2(), getCenter(), getRadius(), isCCW());
132 return algorithm::Distance::pointToSegment(midpoint, p0(), p2());
136 return getOrientation() == algorithm::Orientation::COUNTERCLOCKWISE;
141 return p0().equals(p2());
146 return !std::isfinite(getRadius());
151 return algorithm::CircularArcs::getAngle(p0(), getCenter());
156 return algorithm::CircularArcs::getAngle(p1(), getCenter());
161 return algorithm::CircularArcs::getAngle(p2(), getCenter());
174 double theta = std::atan2(q.y - getCenter().y, q.x - getCenter().x);
175 return containsAngle(theta);
189 bool equals(
const CircularArc& other,
double tol)
const;
193 using iterator_category = std::forward_iterator_tag;
194 using difference_type = std::ptrdiff_t;
195 using value_type = geom::CoordinateXY;
196 using pointer =
const geom::CoordinateXY*;
197 using reference =
const geom::CoordinateXY&;
199 Iterator(
const CircularArc& arc,
int i) : m_arc(arc), m_i(i) {}
201 reference operator*()
const {
202 return m_i == 0 ? m_arc.p0() : (m_i == 1 ? m_arc.p1() : m_arc.p2());
205 Iterator& operator++() {
210 Iterator operator++(
int) {
211 Iterator ret = *
this;
216 bool operator==(
const Iterator& other)
const {
217 return m_i == other.m_i;
220 bool operator!=(
const Iterator& other)
const {
221 return !(*
this == other);
225 const CircularArc& m_arc;
230 Iterator begin()
const {
231 return Iterator(*
this, 0);
234 Iterator end()
const {
235 return Iterator(*
this, 3);
238 template<
typename T=CoordinateXY>
239 const T& p0()
const {
240 return m_seq->getAt<T>(m_pos);
243 template<
typename T=CoordinateXY>
244 const T& p1()
const {
245 return m_seq->getAt<T>(m_pos + 1);
248 template<
typename T=CoordinateXY>
249 const T& p2()
const {
250 return m_seq->getAt<T>(m_pos + 2);
253 std::string toString()
const;
256 auto applyAt(std::size_t i, F&& f)
const {
257 return m_seq->applyAt(m_pos + i, f);
261 const CoordinateSequence* m_seq;
264 mutable CoordinateXY m_center;
265 mutable double m_radius;
266 mutable int m_orientation;
267 mutable bool m_center_known =
false;
268 mutable bool m_radius_known =
false;
269 mutable bool m_orientation_known =
false;
270 bool m_own_coordinates;
Definition CircularArc.h:29
bool containsPointOnCircle(const CoordinateXY &q) const
Definition CircularArc.h:173
bool isUpwardAtPoint(const CoordinateXY &q) const
CircularArc(std::unique_ptr< CoordinateSequence >, std::size_t pos)
bool isCircle() const
Return whether this arc forms a complete circle.
Definition CircularArc.h:140
CircularArc(const CoordinateSequence &, std::size_t pos)
bool containsAngle(double theta) const
Check to see if a given angle lies on this arc.
int getOrientation() const
Definition CircularArc.h:111
const CoordinateXY & getCenter() const
Return the center point of the circle associated with this arc.
Definition CircularArc.h:87
double getSagitta() const
Return the distance from the centerpoint of the arc to the line segment formed by the end points of t...
Definition CircularArc.h:130
bool isLinear() const
Returns whether this arc forms a straight line (p0, p1, and p2 are collinear)
Definition CircularArc.h:145
double getAngle() const
Return the inner angle of the sector associated with this arc.
double getLength() const
Return the length of the arc.
double getArea() const
Return the area enclosed by the arc p0-p1-p2 and the line segment p2-p0.
double getRadius() const
Return the radius of the circle associated with this arc.
Definition CircularArc.h:120
bool containsPoint(const CoordinateXY &q) const
double theta0() const
Return the angle of p0.
Definition CircularArc.h:150
double theta1() const
Return the angle of p1.
Definition CircularArc.h:155
double theta2() const
Return the angle of p2.
Definition CircularArc.h:160
The internal representation of a list of coordinates inside a Geometry.
Definition CoordinateSequence.h:56
Coordinate is the lightweight class used to store coordinates.
Definition Coordinate.h:220
Basic namespace for all GEOS functionalities.
Definition geos.h:38