never executed always true always false
1 module Reanimate.Math.Triangulate
2 ( Triangulation
3 , edgesToTriangulation
4 , edgesToTriangulationM
5 , trianglesToTriangulation
6 , trianglesToTriangulationM
7 )
8 where
9
10 import Control.Monad
11 import qualified Data.IntSet as ISet
12 import qualified Data.Vector as V
13 import qualified Data.Vector.Mutable as MV
14 import Control.Monad.ST
15
16 -- Max edges: n-2
17 -- Each edge is represented twice: 2n-4
18 -- Flat structure:
19 -- edges :: V.Vector Int -- max length (2n-4)
20 -- offsets :: V.Vector Int -- length n
21 -- Combine the two vectors? < n => offsets, >= n => edges?
22 type Triangulation = V.Vector [Int]
23
24 -- FIXME: Move to Common or a Triangulation module
25 -- O(n)
26 edgesToTriangulation :: Int -> [(Int, Int)] -> Triangulation
27 edgesToTriangulation size edges = runST $ do
28 v <- edgesToTriangulationM size edges
29 V.unsafeFreeze v
30
31 edgesToTriangulationM :: Int -> [(Int, Int)] -> ST s (V.MVector s [Int])
32 edgesToTriangulationM size edges = do
33 v <- MV.replicate size []
34 forM_ edges $ \(e1, e2) -> do
35 MV.modify v (e1 :) e2
36 MV.modify v (e2 :) e1
37 forM_ [0 .. size - 1] $ \i -> MV.modify v (ISet.toList . ISet.fromList) i
38 return v
39
40 trianglesToTriangulation :: Int -> V.Vector (Int, Int, Int) -> Triangulation
41 trianglesToTriangulation size edges = runST $ do
42 v <- trianglesToTriangulationM size edges
43 V.unsafeFreeze v
44
45 trianglesToTriangulationM
46 :: Int -> V.Vector (Int, Int, Int) -> ST s (V.MVector s [Int])
47 trianglesToTriangulationM size trigs = do
48 v <- MV.replicate size []
49 forM_ (V.toList trigs) $ \(a, b, c) -> do
50 MV.modify v (\x -> b : c : x) a
51 MV.modify v (\x -> a : c : x) b
52 MV.modify v (\x -> a : b : x) c
53 forM_ [0 .. size - 1] $ \i -> MV.modify v (ISet.toList . ISet.fromList) i
54 return v