GEOS  3.10.0
RayCrossingCounter.h
1 /**********************************************************************
2  *
3  * GEOS - Geometry Engine Open Source
4  * http://geos.osgeo.org
5  *
6  * Copyright (C) 2006 Refractions Research Inc.
7  *
8  * This is free software; you can redistribute and/or modify it under
9  * the terms of the GNU Lesser General Public Licence as published
10  * by the Free Software Foundation.
11  * See the COPYING file for more information.
12  *
13  *
14  **********************************************************************
15  *
16  * Last port: algorithm/RayCrossingCounter.java rev. 1.2 (JTS-1.9)
17  *
18  **********************************************************************/
19 
20 #ifndef GEOS_ALGORITHM_RAYCROSSINGCOUNTER_H
21 #define GEOS_ALGORITHM_RAYCROSSINGCOUNTER_H
22 
23 #include <geos/export.h>
24 #include <geos/geom/Location.h>
25 
26 #include <vector>
27 
28 // forward declarations
29 namespace geos {
30 namespace geom {
31 class Coordinate;
32 class CoordinateSequence;
33 }
34 }
35 
36 
37 namespace geos {
38 namespace algorithm {
39 
65 class GEOS_DLL RayCrossingCounter {
66 private:
67  const geom::Coordinate& point;
68 
69  int crossingCount;
70 
71  // true if the test point lies on an input segment
72  bool isPointOnSegment;
73 
74  // Declare type as noncopyable
75  RayCrossingCounter(const RayCrossingCounter& other) = delete;
76  RayCrossingCounter& operator=(const RayCrossingCounter& rhs) = delete;
77 
78 public:
89  const geom::CoordinateSequence& ring);
90 
93  const std::vector<const geom::Coordinate*>& ring);
94 
95  RayCrossingCounter(const geom::Coordinate& p_point)
96  : point(p_point),
97  crossingCount(0),
98  isPointOnSegment(false)
99  { }
100 
108  const geom::Coordinate& p2);
109 
119  bool
120  isOnSegment() const
121  {
122  return isPointOnSegment;
123  }
124 
136 
146  bool isPointInPolygon() const;
147 
148 };
149 
150 } // geos::algorithm
151 } // geos
152 
153 #endif // GEOS_ALGORITHM_RAYCROSSINGCOUNTER_H
Counts the number of segments crossed by a horizontal ray extending to the right from a given point,...
Definition: RayCrossingCounter.h:65
geom::Location getLocation() const
Gets the Location of the point relative to the ring, polygon or multipolygon from which the processed...
static geom::Location locatePointInRing(const geom::Coordinate &p, const std::vector< const geom::Coordinate * > &ring)
Semantically equal to the above, just different args encoding.
bool isPointInPolygon() const
Tests whether the point lies in or on the ring, polygon or multipolygon from which the processed segm...
static geom::Location locatePointInRing(const geom::Coordinate &p, const geom::CoordinateSequence &ring)
Determines the Location of a point in a ring.
bool isOnSegment() const
Reports whether the point lies exactly on one of the supplied segments.
Definition: RayCrossingCounter.h:120
void countSegment(const geom::Coordinate &p1, const geom::Coordinate &p2)
Counts a segment.
The internal representation of a list of coordinates inside a Geometry.
Definition: CoordinateSequence.h:58
Coordinate is the lightweight class used to store coordinates.
Definition: Coordinate.h:60
Location
Constants representing the location of a point relative to a geometry.
Definition: Location.h:34
Basic namespace for all GEOS functionalities.
Definition: Angle.h:26