1 module Render 2 3 4 5 6 ( render, 7 drawBSPT, drawFaces, 8 partitionedDraw,prettyPrintBSPT) 9 10 where 11 12 import BSPT (BSPT(..),Status(..),countLeaves,scanLine,foldBSPT) 13 import EuclidGMS (Point(..),Line,Face(..),Region,getRegion, 14 Faces,mkFace,section,drawSegment,Segment,Partition) 15 import Stdlib (mapcat,middle,const3) 16 import Params (renderTop,renderHeight,renderLeft,windowWidth) 17 import GeomNum 18 import MGRlib (line,func,movePrintTo,writeVert) 19 20 21 22 23 24 render :: BSPT -> String 25 render btree = drawFaces (mapcat (scanLine btree) scanLines) 26 where scanLines = rules (fromIntegral renderLeft) (fromIntegral windowWidth) (fromIntegral (renderTop+1)) 27 28 29 30 31 32 rules :: Numb -> Numb -> Numb -> Faces 33 rules left right = rules' 34 where rules' current | current > (fromIntegral renderHeight) = [] 35 rules' current = mkFace ((Pt left current),(Pt right current)):rules' (current+15) 36 37 38 39 40 41 drawBSPT :: BSPT -> String 42 drawBSPT = foldBSPT (const3 []) drawEmbedded 43 where 44 drawEmbedded _ (faces,_) x y = drawFaces faces ++ x ++ y 45 46 47 48 drawFaces :: Faces -> String 49 drawFaces = mapcat drawSegment.map faceToSection 50 where 51 faceToSection (Fc section _) = section 52 53 54 55 56 partitionedDraw :: BSPT -> String 57 partitionedDraw = foldBSPT temp3 temp 58 where 59 temp3 _ r _ = drawFaces (getRegion r) 60 temp _ _ = (++) 61 62 63 64 65 66 67 68 69 prettyPrintBSPT :: BSPT -> String 70 prettyPrintBSPT tree = func 4 ++ 71 printBSPT renderLeft windowWidth (renderHeight+40) tree ++ 72 func 15 73 74 75 76 77 printBSPT :: Int -> Int -> Int -> BSPT -> String 78 printBSPT le re d (Cell x _ _) | re-le<=20 = writeVert ((middle le re),d) (map (\x->x:[]) (show x)) 79 printBSPT le re d (Cell x _ _) = movePrintTo (middle le re) d (show x) 80 printBSPT le re d tree | re-le<=20 = writeVert (mid,d) (map (\x->x:[]) (show (countLeaves tree))) 81 where mid = middle le re 82 printBSPT le re d (BSP part nodeinfo left right) = movePrintTo mid d "@" ++ 83 (printBSPT le mid (d+14) left) ++ 84 (printBSPT mid re (d+14) right) 85 where mid = middle le re