/usr/include/geos/algorithm/RayCrossingCounter.h is in libgeos-dev 3.2.2-3ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | /**********************************************************************
* $Id: RayCrossingCounter.h 2770 2009-12-03 19:27:18Z mloskot $
*
* GEOS - Geometry Engine Open Source
* http://geos.refractions.net
*
* Copyright (C) 2006 Refractions Research Inc.
*
* This is free software; you can redistribute and/or modify it under
* the terms of the GNU Lesser General Public Licence as published
* by the Free Software Foundation.
* See the COPYING file for more information.
*
*
**********************************************************************
*
* Last port: algorithm/RayCrossingCounter.java rev. 1.2 (JTS-1.9)
*
**********************************************************************/
#ifndef GEOS_ALGORITHM_RAYCROSSINGCOUNTER_H
#define GEOS_ALGORITHM_RAYCROSSINGCOUNTER_H
#include <geos/export.h>
#include <vector>
// forward declarations
namespace geos {
namespace geom {
class Coordinate;
class CoordinateSequence;
}
}
namespace geos {
namespace algorithm {
/** \brief
* Counts the number of segments crossed by a horizontal ray extending to the right
* from a given point, in an incremental fashion.
*
* This can be used to determine whether a point lies in a {@link Polygonal} geometry.
* The class determines the situation where the point lies exactly on a segment.
* When being used for Point-In-Polygon determination, this case allows short-circuiting
* the evaluation.
*
* This class handles polygonal geometries with any number of shells and holes.
* The orientation of the shell and hole rings is unimportant.
* In order to compute a correct location for a given polygonal geometry,
* it is essential that <b>all</b> segments are counted which
* <ul>
* <li>touch the ray
* <li>lie in in any ring which may contain the point
* </ul>
* The only exception is when the point-on-segment situation is detected, in which
* case no further processing is required.
* The implication of the above rule is that segments
* which can be a priori determined to <i>not</i> touch the ray
* (i.e. by a test of their bounding box or Y-extent)
* do not need to be counted. This allows for optimization by indexing.
*
* @author Martin Davis
*
*/
class GEOS_DLL RayCrossingCounter
{
private:
const geom::Coordinate& point;
int crossingCount;
// true if the test point lies on an input segment
bool isPointOnSegment;
// Declare type as noncopyable
RayCrossingCounter(const RayCrossingCounter& other);
RayCrossingCounter& operator=(const RayCrossingCounter& rhs);
public:
/**
* Determines the {@link Location} of a point in a ring.
* This method is an exemplar of how to use this class.
*
* @param p the point to test
* @param ring an array of Coordinates forming a ring
* @return the location of the point in the ring
*/
static int locatePointInRing(const geom::Coordinate& p,
const geom::CoordinateSequence& ring);
/// Semantically equal to the above, just different args encoding
static int locatePointInRing(const geom::Coordinate& p,
const std::vector<const geom::Coordinate*>& ring);
RayCrossingCounter(const geom::Coordinate& point)
: point( point),
crossingCount( 0),
isPointOnSegment( false)
{ }
/**
* Counts a segment
*
* @param p1 an endpoint of the segment
* @param p2 another endpoint of the segment
*/
void countSegment(const geom::Coordinate& p1,
const geom::Coordinate& p2);
/**
* Reports whether the point lies exactly on one of the supplied segments.
* This method may be called at any time as segments are processed.
* If the result of this method is <tt>true</tt>,
* no further segments need be supplied, since the result
* will never change again.
*
* @return true if the point lies exactly on a segment
*/
bool isOnSegment()
{
return isPointOnSegment;
}
/**
* Gets the {@link Location} of the point relative to
* the ring, polygon
* or multipolygon from which the processed segments were provided.
* <p>
* This method only determines the correct location
* if <b>all</b> relevant segments must have been processed.
*
* @return the Location of the point
*/
int getLocation();
/**
* Tests whether the point lies in or on
* the ring, polygon
* or multipolygon from which the processed segments were provided.
* <p>
* This method only determines the correct location
* if <b>all</b> relevant segments must have been processed.
*
* @return true if the point lies in or on the supplied polygon
*/
bool isPointInPolygon();
};
} // geos::algorithm
} // geos
#endif // GEOS_ALGORITHM_RAYCROSSINGCOUNTER_H
/**********************************************************************
* $Log$
**********************************************************************/
|