00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef GEOS_GEOM_LINESEGMENT_H
00022 #define GEOS_GEOM_LINESEGMENT_H
00023
00024 #include <geos/export.h>
00025 #include <geos/geom/Coordinate.h>
00026
00027 #include <geos/inline.h>
00028
00029 #include <iostream>
00030 #include <memory>
00031
00032
00033 namespace geos {
00034 namespace geom {
00035 class CoordinateSequence;
00036 class GeometryFactory;
00037 class LineString;
00038 }
00039 }
00040
00041 namespace geos {
00042 namespace geom {
00043
00057 class GEOS_DLL LineSegment {
00058 public:
00059
00060 friend std::ostream& operator<< (std::ostream& o, const LineSegment& l);
00061
00062 Coordinate p0;
00063
00064 Coordinate p1;
00065
00066 LineSegment();
00067
00068 LineSegment(const LineSegment &ls);
00069
00071 LineSegment(const Coordinate& c0, const Coordinate& c1);
00072
00073 LineSegment(double x0, double y0, double x1, double y1);
00074
00075 virtual ~LineSegment();
00076
00077 void setCoordinates(const Coordinate& c0, const Coordinate& c1);
00078
00079
00080
00081
00082 const Coordinate& operator[](std::size_t i) const;
00083 Coordinate& operator[](std::size_t i);
00084
00085 void setCoordinates(const LineSegment& ls);
00086
00088 double getLength() const;
00089
00091
00094 bool isHorizontal() const;
00095
00097
00100 bool isVertical() const;
00101
00123 int orientationIndex(const LineSegment& seg) const;
00124
00125
00126 int orientationIndex(const LineSegment* seg) const;
00127
00144 int orientationIndex(const Coordinate& p) const;
00145
00147 void reverse();
00148
00150
00154 void normalize();
00155
00157 double angle() const;
00158
00160
00163 void midPoint(Coordinate& ret) const;
00164
00166 double distance(const LineSegment& ls) const;
00167
00169 double distance(const Coordinate& p) const;
00170
00175 double distancePerpendicular(const Coordinate& p) const;
00176
00191 void pointAlong(double segmentLengthFraction, Coordinate& ret) const;
00192
00217 void pointAlongOffset(double segmentLengthFraction,
00218 double offsetDistance,
00219 Coordinate& ret) const;
00220
00238 double projectionFactor(const Coordinate& p) const;
00239
00255 double segmentFraction(const Coordinate& inputPt) const;
00256
00265 void project(const Coordinate& p, Coordinate& ret) const;
00266
00282 bool project(const LineSegment& seg, LineSegment& ret) const;
00283
00285
00290 void closestPoint(const Coordinate& p, Coordinate& ret) const;
00291
00303 int compareTo(const LineSegment& other) const;
00304
00314 bool equalsTopo(const LineSegment& other) const;
00315
00323 CoordinateSequence* closestPoints(const LineSegment& line);
00324
00325 CoordinateSequence* closestPoints(const LineSegment* line);
00326
00340 bool intersection(const LineSegment& line, Coordinate& coord) const;
00341
00359 bool lineIntersection(const LineSegment& line, Coordinate& coord) const;
00360
00367 std::auto_ptr<LineString> toGeometry(const GeometryFactory& gf) const;
00368
00369 };
00370
00371 std::ostream& operator<< (std::ostream& o, const LineSegment& l);
00372
00374 bool operator==(const LineSegment& a, const LineSegment& b);
00375
00376
00377 }
00378 }
00379
00380 #ifdef GEOS_INLINE
00381 # include "geos/geom/LineSegment.inl"
00382 #endif
00383
00384 #endif // ndef GEOS_GEOM_LINESEGMENT_H