GEOS
3.2.3
|
00001 /********************************************************************** 00002 * $Id: LineSegment.h 2556 2009-06-06 22:22:28Z strk $ 00003 * 00004 * GEOS - Geometry Engine Open Source 00005 * http://geos.refractions.net 00006 * 00007 * Copyright (C) 2009 Sandro Santilli <strk@keybit.net> 00008 * Copyright (C) 2006 Refractions Research Inc. 00009 * 00010 * This is free software; you can redistribute and/or modify it under 00011 * the terms of the GNU Lesser General Public Licence as published 00012 * by the Free Software Foundation. 00013 * See the COPYING file for more information. 00014 * 00015 ********************************************************************** 00016 * 00017 * Last port: geom/LineSegment.java rev. 1.30 (JTS-1.9) 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> // for composition 00026 00027 #include <geos/inline.h> 00028 00029 #include <iostream> // for ostream 00030 #include <memory> // for auto_ptr 00031 00032 // Forward declarations 00033 namespace geos { 00034 namespace geom { 00035 class CoordinateSequence; 00036 class GeometryFactory; 00037 class LineString; 00038 } 00039 } 00040 00041 namespace geos { 00042 namespace geom { // geos::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 // obsoleted, use operator[] instead 00080 //const Coordinate& getCoordinate(size_t i) const; 00081 00082 const Coordinate& operator[](size_t i) const; 00083 Coordinate& operator[](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 // TODO: deprecate this 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 00215 void pointAlongOffset(double segmentLengthFraction, 00216 double offsetDistance, 00217 Coordinate& ret) const; 00218 00236 double projectionFactor(const Coordinate& p) const; 00237 00253 double segmentFraction(const Coordinate& inputPt) const; 00254 00263 void project(const Coordinate& p, Coordinate& ret) const; 00264 00280 bool project(const LineSegment& seg, LineSegment& ret) const; 00281 00283 // 00288 void closestPoint(const Coordinate& p, Coordinate& ret) const; 00289 00301 int compareTo(const LineSegment& other) const; 00302 00312 bool equalsTopo(const LineSegment& other) const; 00313 00321 CoordinateSequence* closestPoints(const LineSegment& line); 00322 00323 CoordinateSequence* closestPoints(const LineSegment* line); 00324 00338 bool intersection(const LineSegment& line, Coordinate& coord) const; 00339 00357 bool lineIntersection(const LineSegment& line, Coordinate& coord) const; 00358 00365 std::auto_ptr<LineString> toGeometry(const GeometryFactory& gf) const; 00366 00367 }; 00368 00369 std::ostream& operator<< (std::ostream& o, const LineSegment& l); 00370 00372 bool operator==(const LineSegment& a, const LineSegment& b); 00373 00374 00375 } // namespace geos::geom 00376 } // namespace geos 00377 00378 #ifdef GEOS_INLINE 00379 # include "geos/geom/LineSegment.inl" 00380 #endif 00381 00382 #endif // ndef GEOS_GEOM_LINESEGMENT_H 00383 00384 /********************************************************************** 00385 * $Log$ 00386 * Revision 1.8 2006/07/21 14:49:58 strk 00387 * Fixed typo in comment 00388 * 00389 * Revision 1.7 2006/06/12 10:10:39 strk 00390 * Fixed getGeometryN() to take size_t rather then int, changed unsigned int parameters to size_t. 00391 * 00392 * Revision 1.6 2006/04/12 17:19:56 strk 00393 * Ported TaggedLineStringSimplifier class, made LineSegment class 00394 * polymorphic to fix derivation of TaggedLineSegment 00395 * 00396 * Revision 1.5 2006/03/28 09:14:12 strk 00397 * Headers inclusion fix. 00398 * 00399 * Revision 1.4 2006/03/24 09:52:41 strk 00400 * USE_INLINE => GEOS_INLINE 00401 * 00402 * Revision 1.3 2006/03/16 13:28:22 strk 00403 * obsoleted getCoordinate(), replaced by operator[] 00404 * 00405 * Revision 1.2 2006/03/13 22:33:09 strk 00406 * Added missing forward declarations 00407 * 00408 * Revision 1.1 2006/03/09 16:46:49 strk 00409 * geos::geom namespace definition, first pass at headers split 00410 * 00411 **********************************************************************/