qhull-0.1.0.1: src-exe/Adjacency/AdjacencyMatrix.hs
module Adjacency.AdjacencyMatrix
where
import qualified Data.IntMap.Strict as IM
import qualified Data.IntSet as IS
import Data.List
import Data.Monoid ((<>))
import Delaunay.Delaunay
import Delaunay.Types
import Options.Applicative
delaunayTess :: [[Double]] -> IO Tesselation
delaunayTess vertices = delaunay vertices False False Nothing
delaunayVertices :: FilePath -> IO [[Double]]
delaunayVertices verts = do
v <- readFile verts
return $ read v :: IO [[Double]]
adjacency :: Tesselation -> Int -> [Int]
adjacency tess i = map (fromEnum . ((i `IS.member`) . _neighsitesIds) . snd) $ IM.toList $ _sites tess
adjacency' :: Tesselation -> [[Int]]
adjacency' tess = map (adjacency tess) (IM.keys ( _sites tess ))
data Arguments = Arguments { infile :: FilePath, outfile :: FilePath }
run :: Parser Arguments
run = Arguments
<$> argument str
( metavar "INFILE"
<> help "File of vertices" )
<*> argument str
( metavar "OUTFILE"
<> help "adjacency matrix" )
writeMatrix :: [[Int]] -> FilePath -> IO ()
writeMatrix matrix outfile = writeFile outfile (intercalate "\n" (map show matrix))
doMatrix :: Arguments -> IO ()
doMatrix (Arguments infile outfile) =
do
v <- delaunayVertices infile
tess <- delaunayTess v
let mat = adjacency' tess
writeMatrix mat outfile
main :: IO ()
main = execParser opts >>= doMatrix
where
opts = info (helper <*> run)
( fullDesc
<> progDesc "Adjacency matrix of a Delaunay tesselation"
<> header "adjacencymatrix -- based on qhull" )