23#include <geos/export.h>
24#include <geos/geom/Coordinate.h>
25#include <geos/geom/LineSegment.h>
26#include <geos/algorithm/Distance.h>
27#include <geos/algorithm/Orientation.h>
34#include <unordered_set>
39class CoordinateSequence;
73 LineSegment(
double x0,
double y0,
double x1,
double y1)
81 void setCoordinates(
const Coordinate& c0,
const Coordinate& c1)
87 void setCoordinates(
const LineSegment& ls)
89 setCoordinates(ls.p0, ls.p1);
95 const Coordinate& operator[](std::size_t i)
const
104 Coordinate& operator[](std::size_t i)
116 return std::min(p0.x, p1.x);
122 return std::max(p0.x, p1.x);
128 return std::min(p0.y, p1.y);
134 return std::max(p0.y, p1.y);
140 return p0.distance(p1);
188 return orientationIndex(*seg);
204 return algorithm::Orientation::index(p0, p1, p);
225 return algorithm::Orientation::index(p0, p1, p);
238 if(p1.compareTo(p0) < 0) {
246 return std::atan2(p1.y - p0.y, p1.x - p0.x);
256 return midPoint(p0, p1);
259 static CoordinateXY midPoint(
const CoordinateXY& pt0,
const CoordinateXY& pt1)
263 (pt0.y + pt1.y) / 2);
269 return algorithm::Distance::segmentToSegment(p0, p1, ls.p0, ls.
p1);
275 return algorithm::Distance::pointToSegment(p, p0, p1);
290 return p0.distance(p);
291 return algorithm::Distance::pointToLinePerpendicular(p, p0, p1);
324 p0.x + segmentLengthFraction * (p1.x - p0.x),
325 p0.y + segmentLengthFraction * (p1.y - p0.y),
326 p0.
z + segmentLengthFraction * (p1.
z - p0.
z));
329 static CoordinateXY pointAlong(
double segmentLengthFraction,
const CoordinateXY& p0,
const CoordinateXY& p1)
331 return { p0.x + segmentLengthFraction * (p1.x - p0.x),
332 p0.y + segmentLengthFraction * (p1.y - p0.y) };
335 static Coordinate pointAlong(
double segmentLengthFraction,
const Coordinate& p0,
const Coordinate& p1)
337 return { p0.x + segmentLengthFraction * (p1.x - p0.x),
338 p0.y + segmentLengthFraction * (p1.y - p0.y),
339 p0.z + segmentLengthFraction * (p1.z - p0.z) };
342 static CoordinateXYM pointAlong(
double segmentLengthFraction,
const CoordinateXYM& p0,
const CoordinateXYM& p1)
344 return { p0.x + segmentLengthFraction * (p1.x - p0.x),
345 p0.y + segmentLengthFraction * (p1.y - p0.y),
346 p0.m + segmentLengthFraction * (p1.m - p0.m) };
349 static CoordinateXYZM pointAlong(
double segmentLengthFraction,
const CoordinateXYZM& p0,
const CoordinateXYZM& p1)
351 return { p0.x + segmentLengthFraction * (p1.x - p0.x),
352 p0.y + segmentLengthFraction * (p1.y - p0.y),
353 p0.z + segmentLengthFraction * (p1.z - p0.z),
354 p0.m + segmentLengthFraction * (p1.m - p0.m) };
382 double offsetDistance,
447 CoordinateXY project(
const CoordinateXY& p)
const;
493 std::array<Coordinate, 2> closestPoints(
const LineSegment* line)
496 return closestPoints(*line);
553 int comp0 = p0.compareTo(other.p0);
557 return p1.compareTo(other.
p1);
560 std::ostream& operator<< (std::ostream& o);
562 inline bool operator==(
const LineSegment& rhs)
const {
563 return compareTo(rhs) == 0;
566 inline bool operator<(
const LineSegment& rhs)
const {
567 return compareTo(rhs) < 0;
570 inline bool operator>(
const LineSegment& rhs)
const {
571 return compareTo(rhs) > 0;
575 inline std::size_t operator()(
const LineSegment & s)
const {
576 std::size_t h = std::hash<double>{}(s.p0.x);
577 h ^= (std::hash<double>{}(s.p0.y) << 1);
578 h ^= (std::hash<double>{}(s.p1.x) << 1);
579 return h ^ (std::hash<double>{}(s.p1.y) << 1);
582 inline std::size_t operator()(
const LineSegment * s)
const {
583 std::size_t h = std::hash<double>{}(s->p0.x);
584 h ^= (std::hash<double>{}(s->p0.y) << 1);
585 h ^= (std::hash<double>{}(s->p1.x) << 1);
586 return h ^ (std::hash<double>{}(s->p1.y) << 1);
591 using UnorderedSet = std::unordered_set<LineSegment, HashCode>;
595 void project(
double factor, CoordinateXY& ret)
const;
Coordinate is the lightweight class used to store coordinates.
Definition Coordinate.h:217
double z
z-coordinate
Definition Coordinate.h:241
Supplies a set of utility methods for building Geometry objects from CoordinateSequence or other Geom...
Definition GeometryFactory.h:71
Definition LineSegment.h:61
bool isVertical() const
Definition LineSegment.h:156
LineSegment(const Coordinate &c0, const Coordinate &c1)
Segment end.
Definition LineSegment.h:68
double minX() const
gets the minimum X ordinate value
Definition LineSegment.h:114
int compareTo(const LineSegment &other) const
Compares this object with the specified object for order.
Definition LineSegment.h:551
int orientationIndex(const CoordinateXY &p) const
Definition LineSegment.h:202
void pointAlongOffset(double segmentLengthFraction, double offsetDistance, Coordinate &ret) const
Computes the Coordinate that lies a given fraction along the line defined by this segment and offset ...
bool project(const LineSegment &seg, LineSegment &ret) const
Project a line segment onto this line segment and return the resulting line segment.
double minY() const
gets the minimum Y ordinate value
Definition LineSegment.h:126
void pointAlong(double segmentLengthFraction, Coordinate &ret) const
Computes the Coordinate that lies a given fraction along the line defined by this segment.
Definition LineSegment.h:321
void project(const Coordinate &p, Coordinate &ret) const
Compute the projection of a point onto the line determined by this line segment.
double maxX() const
gets the maximum X ordinate value
Definition LineSegment.h:120
bool equalsTopo(const LineSegment &other) const
Returns true if other is topologically equal to this LineSegment (e.g. irrespective of orientation).
void reverse()
Reverses the direction of the line segment.
CoordinateXY midPoint() const
Computes the midpoint of the segment.
Definition LineSegment.h:254
double distance(const LineSegment &ls) const
Computes the distance between this line segment and another one.
Definition LineSegment.h:267
int orientationIndex(const LineSegment &seg) const
std::unique_ptr< LineString > toGeometry(const GeometryFactory &gf) const
void normalize()
Puts the line segment into a normalized form.
Definition LineSegment.h:236
std::array< Coordinate, 2 > closestPoints(const LineSegment &line)
bool isHorizontal() const
Definition LineSegment.h:147
double getLength() const
Computes the length of the line segment.
Definition LineSegment.h:138
Coordinate p1
Segment start.
Definition LineSegment.h:66
double distancePerpendicular(const CoordinateXY &p) const
Definition LineSegment.h:287
Coordinate lineIntersection(const LineSegment &line) const
Computes the intersection point of the lines defined by two segments, if there is one.
LineSegment offset(double offsetDistance)
int orientationIndex(const Coordinate &p) const
Determines the orientation index of a Coordinate relative to this segment.
Definition LineSegment.h:223
double angle() const
Definition LineSegment.h:244
Coordinate intersection(const LineSegment &line) const
double maxY() const
gets the maximum Y ordinate value
Definition LineSegment.h:132
double distance(const CoordinateXY &p) const
Computes the distance between this line segment and a point.
Definition LineSegment.h:273
void closestPoint(const CoordinateXY &p, CoordinateXY &ret) const
Computes the closest point on this line segment to another point.
double distancePerpendicularOriented(const CoordinateXY &p) const
double segmentFraction(const CoordinateXY &inputPt) const
Computes the fraction of distance (in [0.0, 1.0]) that the projection of a point occurs along this li...
double projectionFactor(const CoordinateXY &p) const
Compute the projection factor for the projection of the point p onto this LineSegment.
Basic namespace for all GEOS functionalities.
Definition geos.h:38