You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
4.1 KiB
C
174 lines
4.1 KiB
C
|
1 month ago
|
/**********************************************************************
|
||
|
|
*
|
||
|
|
* GEOS - Geometry Engine Open Source
|
||
|
|
* http://geos.osgeo.org
|
||
|
|
*
|
||
|
|
* Copyright (C) 2020 Paul Ramsey <pramsey@cleverelephant.ca>
|
||
|
|
*
|
||
|
|
* 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.
|
||
|
|
*
|
||
|
|
**********************************************************************/
|
||
|
|
|
||
|
|
#pragma once
|
||
|
|
|
||
|
|
#include <geos/edgegraph/HalfEdge.h>
|
||
|
|
#include <geos/geom/Location.h>
|
||
|
|
|
||
|
|
#include <geos/export.h>
|
||
|
|
|
||
|
|
#include <memory>
|
||
|
|
|
||
|
|
// Forward declarations
|
||
|
|
namespace geos {
|
||
|
|
namespace geom {
|
||
|
|
class Coordinate;
|
||
|
|
class CoordinateSequence;
|
||
|
|
class CoordinateArraySequence;
|
||
|
|
}
|
||
|
|
namespace operation {
|
||
|
|
namespace overlayng {
|
||
|
|
class OverlayEdgeRing;
|
||
|
|
class MaximalEdgeRing;
|
||
|
|
class OverlayLabel;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
namespace geos { // geos.
|
||
|
|
namespace operation { // geos.operation
|
||
|
|
namespace overlayng { // geos.operation.overlayng
|
||
|
|
|
||
|
|
using namespace geos::geom;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Creates a single OverlayEdge.
|
||
|
|
*/
|
||
|
|
class GEOS_DLL OverlayEdge : public edgegraph::HalfEdge {
|
||
|
|
|
||
|
|
private:
|
||
|
|
|
||
|
|
// Members
|
||
|
|
const CoordinateSequence* pts;
|
||
|
|
/**
|
||
|
|
* 'true' indicates direction is forward along segString
|
||
|
|
* 'false' is reverse direction
|
||
|
|
* The label must be interpreted accordingly.
|
||
|
|
*/
|
||
|
|
bool direction;
|
||
|
|
Coordinate dirPt;
|
||
|
|
OverlayLabel* label;
|
||
|
|
bool m_isInResultArea;
|
||
|
|
bool m_isInResultLine;
|
||
|
|
bool m_isVisited;
|
||
|
|
OverlayEdge* nextResultEdge;
|
||
|
|
const OverlayEdgeRing* edgeRing;
|
||
|
|
const MaximalEdgeRing* maxEdgeRing;
|
||
|
|
OverlayEdge* nextResultMaxEdge;
|
||
|
|
|
||
|
|
void markVisited();
|
||
|
|
|
||
|
|
|
||
|
|
public:
|
||
|
|
|
||
|
|
// takes ownershiph of CoordinateSequence
|
||
|
|
OverlayEdge(const Coordinate& p_orig, const Coordinate& p_dirPt,
|
||
|
|
bool p_direction, OverlayLabel* p_label,
|
||
|
|
const CoordinateSequence* p_pts)
|
||
|
|
: HalfEdge(p_orig)
|
||
|
|
, pts(p_pts)
|
||
|
|
, direction(p_direction)
|
||
|
|
, dirPt(p_dirPt)
|
||
|
|
, label(p_label)
|
||
|
|
, m_isInResultArea(false)
|
||
|
|
, m_isInResultLine(false)
|
||
|
|
, m_isVisited(false)
|
||
|
|
, nextResultEdge(nullptr)
|
||
|
|
, edgeRing(nullptr)
|
||
|
|
, maxEdgeRing(nullptr)
|
||
|
|
, nextResultMaxEdge(nullptr)
|
||
|
|
{}
|
||
|
|
|
||
|
|
bool isForward() const;
|
||
|
|
|
||
|
|
const Coordinate& directionPt() const override;
|
||
|
|
~OverlayEdge() override {};
|
||
|
|
|
||
|
|
OverlayLabel* getLabel() const;
|
||
|
|
|
||
|
|
Location getLocation(int index, int position) const;
|
||
|
|
|
||
|
|
const Coordinate& getCoordinate() const;
|
||
|
|
|
||
|
|
const CoordinateSequence* getCoordinatesRO() const;
|
||
|
|
|
||
|
|
std::unique_ptr<CoordinateSequence> getCoordinates();
|
||
|
|
|
||
|
|
std::unique_ptr<CoordinateSequence> getCoordinatesOriented();
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Adds the coordinates of this edge to the given list,
|
||
|
|
* in the direction of the edge.
|
||
|
|
* Duplicate coordinates are removed
|
||
|
|
* (which means that this is safe to use for a path
|
||
|
|
* of connected edges in the topology graph).
|
||
|
|
*
|
||
|
|
* @param coords the coordinate list to add to
|
||
|
|
*/
|
||
|
|
void addCoordinates(CoordinateArraySequence* coords);
|
||
|
|
|
||
|
|
OverlayEdge* symOE() const;
|
||
|
|
OverlayEdge* oNextOE() const;
|
||
|
|
|
||
|
|
bool isInResultArea() const;
|
||
|
|
|
||
|
|
bool isInResultAreaBoth() const;
|
||
|
|
|
||
|
|
void unmarkFromResultAreaBoth();
|
||
|
|
|
||
|
|
void markInResultArea();
|
||
|
|
|
||
|
|
void markInResultAreaBoth();
|
||
|
|
|
||
|
|
bool isInResultLine() const;
|
||
|
|
|
||
|
|
void markInResultLine();
|
||
|
|
|
||
|
|
bool isInResult() const;
|
||
|
|
|
||
|
|
bool isInResultEither() const;
|
||
|
|
|
||
|
|
void setNextResult(OverlayEdge* e);
|
||
|
|
|
||
|
|
OverlayEdge* nextResult() const;
|
||
|
|
|
||
|
|
bool isResultLinked() const;
|
||
|
|
|
||
|
|
void setNextResultMax(OverlayEdge* e);
|
||
|
|
|
||
|
|
OverlayEdge* nextResultMax() const;
|
||
|
|
|
||
|
|
bool isResultMaxLinked() const;
|
||
|
|
|
||
|
|
bool isVisited() const;
|
||
|
|
void markVisitedBoth();
|
||
|
|
|
||
|
|
const OverlayEdgeRing* getEdgeRing() const;
|
||
|
|
void setEdgeRing(const OverlayEdgeRing* p_edgeRing);
|
||
|
|
|
||
|
|
const MaximalEdgeRing* getEdgeRingMax() const;
|
||
|
|
void setEdgeRingMax(const MaximalEdgeRing* maximalEdgeRing);
|
||
|
|
|
||
|
|
friend std::ostream& operator<<(std::ostream& os, const OverlayEdge& oe);
|
||
|
|
std::string resultSymbol() const;
|
||
|
|
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
} // namespace geos.operation.overlayng
|
||
|
|
} // namespace geos.operation
|
||
|
|
} // namespace geos
|
||
|
|
|