module Hide(hiddenline) where import Numbers import Vectors import EdgePlate import Geometric import Comparing import Memo import Postscript import Array -- 1.3 -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- section 5: Hiding -- The following function does the entire job... hiddenline :: Vector -> Input -> Output hiddenline v corners = (draw . scale factor base . hideObj . makeObject) rotated where rotated = v `rot` corners (base,factor) = getExtremes (concat rotated) -- `hide' calculates the leftovers of plate bottom as compared to plates tops hide :: Array (Triangle Int) Bool -> Object -> Plate -> [Edge] hide memory obj bottom@(Plt _ ls) = foldr cmp ls tops where tops = [top| top <- obj, lazyAbove memory top bottom] -- `hideObj' hides edgeparts in an object, with view direction vec[0,0,1] hideObj :: Object -> [Edge] hideObj obj = concat [hide (mkmemo above obj) obj plt| plt <- obj] getExtremes :: [Vector] -> (Vector,Number) getExtremes vs = (vec [minimum xs, minimum ys, 0], factor) where factor = ((400 / ((maximum xs-minimum xs) `max` 1)) `min` (640 / ((maximum ys-minimum ys) `max` 1))) xs = map x vs ys = map y vs