DYT/Tool/OpenSceneGraph-3.6.5/include/geos/algorithm/PointLocator.h

109 lines
3.1 KiB
C
Raw Normal View History

2024-12-24 23:49:36 +00:00
/**********************************************************************
*
* GEOS - Geometry Engine Open Source
* http://geos.osgeo.org
*
* Copyright (C) 2005-2011 Refractions Research Inc.
* Copyright (C) 2001-2002 Vivid Solutions 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/PointLocator.java 95fbe34b (JTS-1.15.2-SNAPSHOT)
*
**********************************************************************/
#pragma once
#include <geos/export.h>
#include <geos/geom/Location.h> // for inlines
// Forward declarations
namespace geos {
namespace geom {
class CoordinateXY;
class Geometry;
class LinearRing;
class LineString;
class Polygon;
class Point;
}
}
namespace geos {
namespace algorithm { // geos::algorithm
/**
* \class PointLocator
*
* \brief
* Computes the topological relationship (Location)
* of a single point to a Geometry.
*
* The algorithm obeys the SFS boundaryDetermination rule to correctly determine
* whether the point lies on the boundary or not.
*
* Notes:
* - instances of this class are not reentrant.
* - LinearRing objects do not enclose any area
* (points inside the ring are still in the EXTERIOR of the ring.)
*
*/
class GEOS_DLL PointLocator {
public:
PointLocator() {}
~PointLocator() {}
/**
* Computes the topological relationship (Location) of a single point
* to a Geometry. It handles both single-element and multi-element Geometries.
* The algorithm for multi-part Geometriestakes into account the SFS
* Boundary Determination rule.
*
* @return the Location of the point relative to the input Geometry
*/
geom::Location locate(const geom::CoordinateXY& p, const geom::Geometry* geom);
/**
* Convenience method to test a point for intersection with
* a Geometry
*
* @param p the coordinate to test
* @param geom the Geometry to test
* @return <code>true</code> if the point is in the interior or boundary of the Geometry
*/
bool
intersects(const geom::CoordinateXY& p, const geom::Geometry* geom)
{
return locate(p, geom) != geom::Location::EXTERIOR;
}
private:
bool isIn; // true if the point lies in or on any Geometry element
int numBoundaries; // the number of sub-elements whose boundaries the point lies in
void computeLocation(const geom::CoordinateXY& p, const geom::Geometry* geom);
void updateLocationInfo(geom::Location loc);
geom::Location locate(const geom::CoordinateXY& p, const geom::Point* pt);
geom::Location locate(const geom::CoordinateXY& p, const geom::LineString* l);
geom::Location locateInPolygonRing(const geom::CoordinateXY& p, const geom::LinearRing* ring);
geom::Location locate(const geom::CoordinateXY& p, const geom::Polygon* poly);
};
} // namespace geos::algorithm
} // namespace geos