hgeometry-0.14: src/Data/PlaneGraph.hs
{-# LANGUAGE ScopedTypeVariables #-}
--------------------------------------------------------------------------------
-- |
-- Module : Data.PlaneGraph
-- Copyright : (C) Frank Staals
-- License : see the LICENSE file
-- Maintainer : Frank Staals
--
-- Data type for planar graphs embedded in \(\mathbb{R}^2\). For functions that
-- export faces and edges etc, we assume the graph has a (planar) straight line
-- embedding.
--
--------------------------------------------------------------------------------
module Data.PlaneGraph( -- $setup
PlaneGraph(PlaneGraph), graph
, PlanarGraph
, VertexData(VertexData), vData, location, vtxDataToExt
, fromSimplePolygon, fromConnectedSegments
, toAdjRep, fromAdjRep
, numVertices, numEdges, numFaces, numDarts
, dual
, vertices', vertices
, edges', edges
, faces', faces, internalFaces, faces''
, darts', darts
, traverseVertices, traverseDarts, traverseFaces
, headOf, tailOf, twin, endPoints
, incidentEdges, incomingEdges, outgoingEdges
, neighboursOf
, nextIncidentEdge, prevIncidentEdge
, nextIncidentEdgeFrom, prevIncidentEdgeFrom
, leftFace, rightFace
, nextEdge, prevEdge
, boundary, boundary', boundaryDart, boundaryVertices
, outerFaceId, outerFaceDart
, vertexDataOf, locationOf, HasDataOf(..)
, endPointsOf, endPointData
, vertexData, faceData, dartData, rawDartData
, edgeSegment, edgeSegments
, faceBoundary, internalFacePolygon
, outerFacePolygon, outerFacePolygon'
, facePolygons, facePolygons'
, VertexId(..), FaceId(..), Dart, World(..), VertexId', FaceId'
, withEdgeDistances
, writePlaneGraph, readPlaneGraph
) where
import Data.PlaneGraph.IO
import Data.PlaneGraph.Core
--------------------------------------------------------------------------------
-- $setup
-- >>> import Data.Proxy
-- >>> import Data.PlaneGraph.AdjRep(Gr(Gr),Face(Face),Vtx(Vtx))
-- >>> import Data.PlaneGraph.IO(fromAdjRep)
-- >>> import Data.PlanarGraph.Dart(Dart(..),Arc(..))
-- >>> :{
-- let dart i s = Dart (Arc i) (read s)
-- small :: Gr (Vtx Int String Int) (Face String)
-- small = Gr [ Vtx 0 (Point2 0 0) [ (2,"0->2")
-- , (1,"0->1")
-- , (3,"0->3")
-- ] 0
-- , Vtx 1 (Point2 2 2) [ (0,"1->0")
-- , (2,"1->2")
-- , (3,"1->3")
-- ] 1
-- , Vtx 2 (Point2 2 0) [ (0,"2->0")
-- , (1,"2->1")
-- ] 2
-- , Vtx 3 (Point2 (-1) 4) [ (0,"3->0")
-- , (1,"3->1")
-- ] 3
-- ]
-- [ Face (2,1) "OuterFace"
-- , Face (0,1) "A"
-- , Face (1,0) "B"
-- ]
-- smallG = fromAdjRep (Proxy :: Proxy ()) small
-- :}
--
--
-- This represents the following graph. Note that the graph is undirected, the
-- arrows are just to indicate what the Positive direction of the darts is.
--
-- 
--
--
-- Here is also a slightly larger example graph:
-- 
--
-- >>> import Data.RealNumber.Rational
-- >>> data MyWorld
-- >>> :{
-- let myPlaneGraph :: PlaneGraph MyWorld Int () String (RealNumber 5)
-- myPlaneGraph = fromAdjRep (Proxy @MyWorld) myPlaneGraphAdjrep
-- myPlaneGraphAdjrep :: Gr (Vtx Int () (RealNumber 5)) (Face String)
-- myPlaneGraphAdjrep = Gr [ vtx 0 (Point2 0 0 ) [e 9, e 5, e 1, e 2]
-- , vtx 1 (Point2 4 4 ) [e 0, e 5, e 12]
-- , vtx 2 (Point2 3 7 ) [e 0, e 3]
-- , vtx 3 (Point2 0 5 ) [e 4, e 2]
-- , vtx 4 (Point2 3 8 ) [e 3, e 13]
-- , vtx 5 (Point2 8 1 ) [e 0, e 6, e 8, e 1]
-- , vtx 6 (Point2 6 (-1)) [e 5, e 9]
-- , vtx 7 (Point2 9 (-1)) [e 8, e 11]
-- , vtx 8 (Point2 12 1 ) [e 7, e 12, e 5]
-- , vtx 9 (Point2 8 (-5)) [e 0, e 10, e 6]
-- , vtx 10 (Point2 12 (-3)) [e 9, e 11]
-- , vtx 11 (Point2 14 (-1)) [e 10, e 7]
-- , vtx 12 (Point2 10 4 ) [e 1, e 8, e 13, e 14]
-- , vtx 13 (Point2 9 6 ) [e 4, e 14, e 12]
-- , vtx 14 (Point2 8 5 ) [e 13, e 12]
-- ]
-- [ Face (0,9) "OuterFace"
-- , Face (0,5) "A"
-- , Face (0,1) "B"
-- , Face (0,2) "C"
-- , Face (14,13) "D"
-- , Face (1,12) "E"
-- , Face (5,8) "F"
-- ]
-- where
-- e i = (i,())
-- vtx i p es = Vtx i p es i
-- :}