5aef5780befdae06c7bbf68c4817a844a76acad4
[nofib.git] / real / bspt / Render.lhs
1 > module Render 
2
3         Render controls the displaying of BSP images and
4         BSP trees.
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         render - fills in the image with a hashed pattern
21                 Algorithm creates scan_line segments from
22                 the list of rules accross the screen
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         rules - create the list of lines across the screen
29                 between current and max lines skipping every
30                 skip lines
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         drawBSPT - draws the edges of the image by drawing the lines
39                 stored in the sub-hyperplanes
40   
41 > drawBSPT :: BSPT -> String 
42 > drawBSPT = foldBSPT (const3 []) drawEmbedded
43 >               where 
44 >               drawEmbedded _ (faces,_) x y = drawFaces faces ++ x ++ y
45
46         drawFaces - draws a list of faces
47  
48 > drawFaces :: Faces -> String
49 > drawFaces = mapcat drawSegment.map faceToSection
50 >               where 
51 >               faceToSection (Fc section _) = section
52   
53
54         partitionedDraw - draws a BSPT image along with its partitions
55
56 > partitionedDraw :: BSPT -> String                
57 > partitionedDraw = foldBSPT temp3 temp 
58 >               where 
59 >               temp3 _ r _ = drawFaces (getRegion r)
60 >               temp _ _ = (++)
61
62                 const3 []
63                drawPartitions (Fc part _) (faces,region) x y 
64                                         = drawFaces faces ++
65                                             x ++ y
66
67         prettyPrintBSPT - pretty print the tree form of a BSP tree
68
69 > prettyPrintBSPT :: BSPT -> String
70 > prettyPrintBSPT tree = func 4 ++ 
71 >                        printBSPT  renderLeft windowWidth (renderHeight+40) tree ++  
72 >                        func 15
73
74
75         printBSPT - does the work for prettyPrintBSPT
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