module Comparing (above,cmp) where import Numbers import Vectors import EdgePlate import Preds import Solve import Geometric import Cross import List(nub)--1.3 -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- section 8: Comparing cmp :: Plate -> [Edge] -> [Edge] cmp p ls = concat [comp l p| l<-ls] comp :: Edge -> Plate -> [Edge] comp l p@(Plt _ ks) = if inS && inT then [] else if crosses==[] then [l] else if inS && not inT then [edgeT w (t l)] else if not inS && inT then [edgeT (s l) v] else [edgeT (s l) v, edgeT w (t l)] where inS = s(l) `into` p inT = t(l) `into` p crosses = nub [p| k<-ks, (p,q)<-cross l k] cr1 = head crosses cr2 = last crosses (v,w) = if len(s(l)-cr1) <= len(s(l)-cr2) then (cr1,cr2) else (cr2,cr1) -- ls `above` ks means that the edges of ks have to be inspected -- individually, and hidden where lying inside ls. -- Be careful not to call 'alt ls' when ls is vertical above :: Plate -> Plate -> Bool ls `above` ks = if vertical ls then if vertical ks then or [z(p) > z(q)| p<-olk, q<-okl] else or [ z(p) > alt ks p| p<-olk] else if vertical ks then or [alt ls q > z(q) | q<-okl] else or [alt ls p > alt ks p| p<-ovl] where olk = overlap ls ks okl = overlap ks ls ovl = nub ([proj p|p<-olk]++[proj p|p<-okl])