DYT/Tool/OpenSceneGraph-3.6.5/include/geos/geomgraph/DirectedEdge.h
2024-12-25 07:49:36 +08:00

237 lines
5.0 KiB
C++

/**********************************************************************
*
* GEOS - Geometry Engine Open Source
* http://geos.osgeo.org
*
* Copyright (C) 2011 Sandro Santilli <strk@kbt.io>
* Copyright (C) 2005-2006 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: geomgraph/DirectedEdge.java r428 (JTS-1.12)
*
**********************************************************************/
#pragma once
#include <geos/export.h>
#include <string>
#include <geos/geom/Location.h>
#include <geos/geomgraph/EdgeEnd.h> // for inheritance
// Forward declarations
namespace geos {
namespace geomgraph {
class Edge;
class EdgeRing;
}
}
namespace geos {
namespace geomgraph { // geos.geomgraph
/// A directed EdgeEnd
class GEOS_DLL DirectedEdge final: public EdgeEnd {
public:
/** \brief
* Computes the factor for the change in depth when moving from
* one location to another.
* E.g. if crossing from the INTERIOR to the EXTERIOR the depth
* decreases, so the factor is -1
*/
static int depthFactor(geom::Location currLocation, geom::Location nextLocation);
//DirectedEdge();
//virtual ~DirectedEdge();
DirectedEdge(Edge* newEdge, bool newIsForward);
// this is no different from Base class, no need to override
//Edge* getEdge();
void setInResult(bool v)
{
isInResultVar = v;
};
bool isInResult() const
{
return isInResultVar;
};
bool isVisited() const
{
return isVisitedVar;
};
void setVisited(bool v)
{
isVisitedVar = v;
};
void setEdgeRing(EdgeRing* er)
{
edgeRing = er;
};
EdgeRing* getEdgeRing() const
{
return edgeRing;
};
void setMinEdgeRing(EdgeRing* mer)
{
minEdgeRing = mer;
};
EdgeRing* getMinEdgeRing() const
{
return minEdgeRing;
};
int getDepth(int position) const
{
return depth[position];
};
void setDepth(int position, int newDepth);
int getDepthDelta() const;
/// Marks both DirectedEdges attached to a given Edge.
///
/// This is used for edges corresponding to lines, which will only
/// appear oriented in a single direction in the result.
///
void setVisitedEdge(bool newIsVisited);
/** \brief
* Each Edge gives rise to a pair of symmetric DirectedEdges,
* in opposite directions.
*
* @return the DirectedEdge for the same Edge but in the
* opposite direction
*/
DirectedEdge* getSym() const
{
return sym;
};
bool isForward() const
{
return isForwardVar;
};
void setSym(DirectedEdge* de)
{
sym = de;
};
DirectedEdge* getNext() const
{
return next;
};
void setNext(DirectedEdge* newNext)
{
next = newNext;
};
DirectedEdge* getNextMin() const
{
return nextMin;
};
void setNextMin(DirectedEdge* nm)
{
nextMin = nm;
};
/** \brief
* Tells whether this edge is a Line
*
* This edge is a line edge if
* - at least one of the labels is a line label
* - any labels which are not line labels have all Locations = EXTERIOR
*
*/
bool isLineEdge();
/** \brief
* Tells whether this edge is an Area
*
* This is an interior Area edge if
* - its label is an Area label for both Geometries
* - and for each Geometry both sides are in the interior.
*
* @return true if this is an interior Area edge
*/
bool isInteriorAreaEdge();
/** \brief
* Set both edge depths.
*
* One depth for a given side is provided.
* The other is computed depending on the Location transition and the
* depthDelta of the edge.
*/
void setEdgeDepths(int position, int newDepth);
std::string print() const override;
std::string printEdge();
protected:
bool isForwardVar;
private:
bool isInResultVar;
bool isVisitedVar;
/// the symmetric edge
DirectedEdge* sym;
/// the next edge in the edge ring for the polygon containing this edge
DirectedEdge* next;
/// the next edge in the MinimalEdgeRing that contains this edge
DirectedEdge* nextMin;
/// the EdgeRing that this edge is part of
EdgeRing* edgeRing;
/// the MinimalEdgeRing that this edge is part of
EdgeRing* minEdgeRing;
/** \brief
* The depth of each side (position) of this edge.
* The 0 element of the array is never used.
*/
int depth[3];
/// Compute the label in the appropriate orientation for this DirEdge
void computeDirectedLabel();
};
} // namespace geos.geomgraph
} // namespace geos