module Main where import Numeric.Qhull import Control.Parallel.Strategies import qualified Data.Vector.Unboxed as UV import qualified Data.Vector.Storable as SV import qualified Data.Vector as V import Data.Either import Data.List readPoints :: String -> [UV.Vector Double] readPoints s = map (UV.fromList . (map read) . words) (lines s) simplexToString :: SV.Vector Int -> String simplexToString x = concat $ intersperse " " (map show (SV.toList x)) main :: IO () main = getContents >>= \input -> let points = V.fromList (readPoints input) facets = either id (const []) (qhull' points) facets' = map (\fids -> V.map (\i -> points V.! i) (SV.convert fids)) facets output = unlines $ map simplexToString facets in putStr output >> putStrLn ((either show errorMessage) (qhull'' testPoints2)) testPoints :: [[Double]] testPoints = [[0,0], [1,1], [-1,1], [-1,-1], [1,-1] ] testPoints2 :: [[Double]] testPoints2 = [[0,0,0], [1,1,0], [-1,1,0], [-1,-1,0], [1,-1,0] ] testCube :: [[Double]] testCube = [[0, 0, 0], [1, 1, 1], [1, -1, 1], [-1, 1, 1], [1, 1, -1], [-1, -1, 1], [-1, 1, -1], [1, -1, -1], [-1,-1,-1] ]