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
|
// Geometric Tools, LLC
// Copyright (c) 1998-2014
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
// http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
//
// File Version: 5.0.0 (2010/01/01)
#ifndef SEGMENTGRAPH
#define SEGMENTGRAPH
#include "Rational.h"
class SegmentGraph
{
public:
SegmentGraph ();
~SegmentGraph ();
class Vertex
{
public:
Vertex ();
~Vertex ();
void InsertAdjacent (Vertex* adjacent);
void RemoveAdjacent (Vertex* adjacent);
enum { VG_CHUNK = 16 };
RPoint2 Position;
int NumVertices;
Vertex** V;
};
class Edge
{
public:
Edge ();
Edge (Vertex* v0, Vertex* v1);
void SetVertices (Vertex* v0, Vertex* v1);
Vertex* GetVertex (int i) const;
bool operator== (const Edge& edge) const;
bool operator< (const Edge& edge) const;
private:
Vertex* mV[2];
};
typedef std::map<RPoint2,Vertex*> VMap;
typedef std::set<Edge> ESet;
VMap& GetVertices ();
ESet& GetEdges ();
void InsertEdge (const RPoint2& point0, const RPoint2& point1);
bool RemoveEdge (const RPoint2& point0, const RPoint2& point1);
void ExtractEnvelope (std::vector<RPoint2>& envelope);
private:
Vertex* GetVertex (const RPoint2& point);
Vertex* InsertVertex (const RPoint2& point);
VMap mVertexMap;
ESet mEdgeSet;
};
#endif
|