GEOS 3.15.0dev
SegmentString.h
1/**********************************************************************
2 *
3 * GEOS - Geometry Engine Open Source
4 * http://geos.osgeo.org
5 *
6 * Copyright (C) 2011 Sandro Santilli <strk@kbt.io>
7 * Copyright (C) 2005-2006 Refractions Research Inc.
8 * Copyright (C) 2001-2002 Vivid Solutions Inc.
9 *
10 * This is free software; you can redistribute and/or modify it under
11 * the terms of the GNU Lesser General Public Licence as published
12 * by the Free Software Foundation.
13 * See the COPYING file for more information.
14 *
15 **********************************************************************
16 *
17 * Last port: noding/SegmentString.java r430 (JTS-1.12+)
18 *
19 **********************************************************************/
20
21#pragma once
22
23#include <geos/export.h>
24#include <geos/geom/Coordinate.h>
25#include <geos/geom/CoordinateSequence.h>
26#include <geos/noding/Octant.h>
27
28#include <vector>
29
30// Forward declarations
31namespace geos {
32namespace algorithm {
33class LineIntersector;
34}
35}
36
37namespace geos {
38namespace noding { // geos.noding
39
47class GEOS_DLL SegmentString {
48public:
49 typedef std::vector<const SegmentString*> ConstVect;
50 typedef std::vector<SegmentString*> NonConstVect;
51
52 friend std::ostream& operator<< (std::ostream& os,
53 const SegmentString& ss);
54
60 SegmentString(const void* newContext, const std::shared_ptr<const geom::CoordinateSequence>& newSeq)
61 :
62 seq(newSeq),
63 context(newContext)
64 {}
65
66 virtual
68
74 const void*
75 getData() const
76 {
77 return context;
78 }
79
85 void
86 setData(const void* data)
87 {
88 context = data;
89 }
90
91 std::size_t size() const {
92 return seq->size();
93 }
94
95 template<typename CoordType = geom::Coordinate>
96 const CoordType& getCoordinate(std::size_t i) const {
97 return seq->getAt<CoordType>(i);
98 }
99
103 const std::shared_ptr<const geom::CoordinateSequence>& getCoordinates() const {
104 return seq;
105 }
106
107 void setCoordinates(const std::shared_ptr<const geom::CoordinateSequence>& newSeq) {
108 seq = newSeq;
109 }
110
118 int getSegmentOctant(std::size_t index) const
119 {
120 if (index >= size() - 1) {
121 return -1;
122 }
123 return safeOctant(seq->getAt<geom::CoordinateXY>(index),
124 seq->getAt<geom::CoordinateXY>(index + 1));
125 };
126
127 static int getSegmentOctant(const SegmentString& ss, std::size_t index) {
128 return ss.getSegmentOctant(index);
129 }
130
139 const geom::CoordinateXY& nextInRing(std::size_t index) const
140 {
141 std::size_t nextIndex = index + 1;
142 if (nextIndex > size() - 1) {
143 nextIndex = 1;
144 }
145 return getCoordinate(nextIndex);
146 }
147
156 const geom::CoordinateXY& prevInRing(std::size_t index) const
157 {
158 std::size_t prevIndex;
159 if (index == 0)
160 prevIndex = size() - 2;
161 else
162 prevIndex = index - 1;
163 return getCoordinate( prevIndex );
164 }
165
166
167 bool isClosed() const {
168 return seq->front<geom::CoordinateXY>().equals(seq->back<geom::CoordinateXY>());
169 }
170
171 static std::vector<SegmentString*> toRawPointerVector(const std::vector<std::unique_ptr<SegmentString>> & segStrings);
172
173 virtual std::ostream& print(std::ostream& os) const;
174
175protected:
176 std::shared_ptr<const geom::CoordinateSequence> seq;
177
178private:
179 const void* context;
180
181 static int safeOctant(const geom::CoordinateXY& p0, const geom::CoordinateXY& p1)
182 {
183 if(p0.equals2D(p1)) {
184 return 0;
185 }
186 return Octant::octant(p0, p1);
187 };
188
189 // Declare type as noncopyable
190 SegmentString(const SegmentString& other) = delete;
191 SegmentString& operator=(const SegmentString& rhs) = delete;
192};
193
194std::ostream& operator<< (std::ostream& os, const SegmentString& ss);
195
196} // namespace geos.noding
197} // namespace geos
198
An interface for classes which represent a sequence of contiguous line segments.
Definition SegmentString.h:47
SegmentString(const void *newContext, const std::shared_ptr< const geom::CoordinateSequence > &newSeq)
Construct a SegmentString.
Definition SegmentString.h:60
const geom::CoordinateXY & nextInRing(std::size_t index) const
Definition SegmentString.h:139
const void * getData() const
Gets the user-defined data for this segment string.
Definition SegmentString.h:75
int getSegmentOctant(std::size_t index) const
Gets the octant of the segment starting at vertex index.
Definition SegmentString.h:118
const std::shared_ptr< const geom::CoordinateSequence > & getCoordinates() const
Return a pointer to the CoordinateSequence associated with this SegmentString.
Definition SegmentString.h:103
const geom::CoordinateXY & prevInRing(std::size_t index) const
Definition SegmentString.h:156
void setData(const void *data)
Sets the user-defined data for this segment string.
Definition SegmentString.h:86
Basic namespace for all GEOS functionalities.
Definition geos.h:38