DYT/Tool/OpenSceneGraph-3.6.5/include/geos/geom/LinearRing.h

129 lines
3.4 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) 2001-2002 Vivid Solutions Inc.
* Copyright (C) 2005 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: geom/LinearRing.java r320 (JTS-1.12)
*
**********************************************************************/
#pragma once
#include <geos/export.h>
#include <string>
#include <vector>
#include <geos/geom/LineString.h>
// Forward declarations
namespace geos {
namespace geom { // geos::geom
class Coordinate;
}
}
namespace geos {
namespace geom { // geos::geom
/**
* \brief
* Models an OGC SFS LinearRing. A LinearRing is a LineString which is both
* closed and simple.
*
* In other words, the first and last coordinate in the ring must be equal,
* and the ring must not self-intersect. Either orientation
* of the ring is allowed.
*
* A ring must have either 0 or 3 or more points. The first and last points
* must be equal (in 2D). If these conditions are not met, the constructors
* throw an {@link geos::util::IllegalArgumentException}
* A ring with 3 points is invalid, because it is collapsed
* and thus has a self-intersection. It is allowed to be constructed
* so that it can be represented, and repaired if needed.
*/
class GEOS_DLL LinearRing : public LineString {
public:
/** \brief
* The minimum number of vertices allowed in a valid non-empty ring.
* Empty rings with 0 vertices are also valid.
*/
static const unsigned int MINIMUM_VALID_SIZE = 3;
LinearRing(const LinearRing& lr);
/**
* \brief Constructs a LinearRing with the given points.
*
* @param points points forming a closed and simple linestring, or
* <code>null</code> or an empty array to create the empty
* geometry.
* This array must not contain <code>null</code> elements.
* If not null LinearRing will take ownership of points.
*
* @param newFactory the GeometryFactory used to create this geometry
*
*/
LinearRing(CoordinateSequence::Ptr && points,
const GeometryFactory& newFactory);
std::unique_ptr<LinearRing> clone() const
{
return std::unique_ptr<LinearRing>(cloneImpl());
}
~LinearRing() override = default;
/** \brief
* Returns <code>Dimension.FALSE</code>, since by definition
* LinearRings do not have a boundary.
*
* @return Dimension::False
*/
int getBoundaryDimension() const override;
bool isClosed() const override;
std::string getGeometryType() const override;
GeometryTypeId getGeometryTypeId() const override;
void setPoints(const CoordinateSequence* cl);
std::unique_ptr<LinearRing> reverse() const { return std::unique_ptr<LinearRing>(reverseImpl()); }
void orient(bool isCW);
protected:
int
getSortIndex() const override
{
return SORTINDEX_LINEARRING;
};
LinearRing* cloneImpl() const override { return new LinearRing(*this); }
LinearRing* reverseImpl() const override;
private:
void validateConstruction();
};
} // namespace geos::geom
} // namespace geos