--
import Draw
import Region
import SOEGraphics hiding (Region)
import qualified SOEGraphics as G (Region)
data Picture = Region Color Region
 | Picture `Over` Picture
 | EmptyPic
 deriving Show
-- The Color type is imported from SOEGraphics
-- and Exported from Picture
-- data Color = Black | Blue | Green | Cyan
-- | Red | Magenta | Yellow | White
------ Changes here --------
drawRegionInWindow::Window -> Color -> Region -> IO ()
drawRegionInWindow w c r =
 drawInWindow w
 (withColor c (drawRegion (regionToGRegion r)))
----------- End Changes ------------------
drawPic :: Window -> Picture -> IO ()
drawPic w (Region c r) = drawRegionInWindow w c r
drawPic w (p1 `Over` p2) = do { drawPic w p2
 ; drawPic w p1
 }
drawPic w EmptyPic = return ()
-- First a little side trip
data NewRegion = Rect Side Side -- Abstracts G.Region
regToNReg1 :: Region -> NewRegion
regToNReg1 (Shape (Rectangle sx sy))
 = Rect sx sy
regToNReg1 (Scale (x,y) r)
 = regToNReg1 (scaleReg (x,y) r)
 where scaleReg (x,y) (Shape (Rectangle sx sy))
 = Shape (Rectangle (x*sx) (y*sy))
 scaleReg (x,y) (Scale s r)
 = Scale s (scaleReg (x,y) r)
reverse1 [] = []
reverse1 (x:xs) = (reverse1 xs) ++ [x]
 where [] ++ zs = zs
 (y:ys) ++ zs = y : (ys ++ zs)
reverse2 xs = revhelp xs []
 where revhelp [] zs = zs
 revhelp (x:xs) zs = revhelp xs (x:zs)
regToNReg2 :: Region -> NewRegion
regToNReg2 r = rToNR (1,1) r
 where rToNR :: (Float,Float) -> Region -> NewRegion
 rToNR (x1,y1) (Shape (Rectangle sx sy))
 = Rect (x1*sx) (y1*sy)
 rToNR (x1,y1) (Scale (x2,y2) r)
 = rToNR (x1*x2,y1*y2) r
--- Return from side trip
regToGReg1 :: Vector -> Vector -> Region -> G.Region
regToGReg1 trans sca (Shape s) = shapeToGRegion trans sca s
regToGReg1 (x,y) sca (Translate (u,v) r)
 = regToGReg1 (x+u, y+v) sca r
regToGReg1 trans (x,y) (Scale (u,v) r)
 = regToGReg1 trans (x*u, y*v) r
regToGReg1 trans sca Empty = createRectangle (0,0) (0,0)
regToGReg1 trans sca (r1 `Union` r2)
 = let gr1 = regToGReg1 trans sca r1
 gr2 = regToGReg1 trans sca r2
 in orRegion gr1 gr2
---------- Changes here ------------
primGReg trans sca r1 r2 op
 = let gr1 = regToGReg trans sca r1
 gr2 = regToGReg trans sca r2
 in op gr1 gr2
regToGReg :: Vector -> Vector -> Region -> G.Region
regToGReg (trans @ (x,y)) (sca @ (a,b)) shape =
 case shape of
 (Shape s) -> shapeToGRegion trans sca s
 (Translate (u,v) r) -> regToGReg (x+u, y+v) sca r
 (Scale (u,v) r) -> regToGReg trans (a*u, b*v) r
 (Empty) -> createRectangle (0,0) (0,0)
 (r1 `Union` r2) -> primGReg trans sca r1 r2 orRegion
 (r1 `Intersect` r2) -> primGReg trans sca r1 r2 andRegion
 (Complement r) -> primGReg trans sca winRect r diffRegion
 where winRect :: Region
 winRect = Shape (Rectangle
 (pixelToInch xWin) (pixelToInch yWin))
regionToGRegion :: Region -> G.Region
regionToGRegion r = regToGReg (0,0) (1,1) r
----------- End Changes -----------------
xWin2 = xWin `div` 2
yWin2 = yWin `div` 2
shapeToGRegion1
 :: Vector -> Vector -> Shape -> G.Region
shapeToGRegion1 (lx,ly) (sx,sy) (Rectangle s1 s2)
 = createRectangle (trans(-s1/2,-s2/2)) (trans (s1/2,s2/2))
 where trans (x,y) = ( xWin2 + inchToPixel ((x+lx)*sx),
 yWin2 - inchToPixel ((y+ly)*sy) )
shapeToGRegion1 (lx,ly) (sx,sy) (Ellipse r1 r2)
 = createEllipse (trans (-r1,-r2)) (trans ( r1, r2))
 where trans (x,y) =
 ( xWin2 + inchToPixel ((x+lx)*sx),
 yWin2 - inchToPixel ((y+ly)*sy) )
shapeToGRegion1 (lx,ly) (sx,sy) (Polygon pts)
 = createPolygon (map trans pts)
 where trans (x,y) =
 ( xWin2 + inchToPixel ((x+lx)*sx),
 yWin2 - inchToPixel ((y+ly)*sy) )
shapeToGRegion1 (lx,ly) (sx,sy) (RtTriangle s1 s2) =
 createPolygon (map trans [(0,0),(s1,0),(0,s2)])
 where trans (x,y) =
 ( xWin2 + inchToPixel ((x+lx)*sx),
 yWin2 - inchToPixel ((y+ly)*sy) )
shapeToGRegion (lx,ly) (sx,sy) s =
 case s of
 Rectangle s1 s2 -> createRectangle
 (trans (-s1/2,-s2/2))
 (trans (s1/2,s2/2))
 Ellipse r1 r2 -> createEllipse
 (trans (-r1,-r2))
 (trans ( r1, r2))
 Polygon pts -> createPolygon (map trans pts)
 RtTriangle s1 s2 -> createPolygon
 (map trans [(0,0),
 (s1,0),
 (0,s2)])
 where trans (x,y) = ( xWin2 + inchToPixel ((x+lx)*sx),
 yWin2 - inchToPixel ((y+ly)*sy) )
 -- IMPORTANT that the WHERE be indented less than the patterns
 -- of the case. Because it then attaches to the last clause of
 -- the case rather than the defining equation. Since the Draw
 -- defines a trans function (with the right type) but the wrong
 -- functionality, the other clauses of the case appear well defined
 -- but do very strange things.
draw :: Picture -> IO ()
draw p
 = runGraphics (
 do w <- openWindow "Region Test" (xWin,yWin) drawPic w p spaceClose w ) r1 = Shape (Rectangle 3 2) r2 = Shape (Ellipse 1 1.5) r3 = Shape (RtTriangle 3 2) r4 = Shape (Polygon [(-2.5,2.5), (-3.0,0), (-1.7,-1.0), (-1.1,0.2), (-1.5,2.0)] ) reg1 = r3 `Union` --RtTriangle r1 `Intersect` -- Rectangle Complement r2 `Union` -- Ellispe r4 -- Polygon pic1 = Region Cyan reg1 main1 = draw pic1 reg2 = let circle = Shape (Ellipse 0.5 0.5) square = Shape (Rectangle 1 1) in (Scale (2,2) circle) `Union` (Translate (2,1) square) `Union` (Translate (-2,0) square) pic2 = Region Yellow reg2 main2 = draw pic2 pic3 = pic2 `Over` pic1 main3 = draw pic3 oneCircle = Shape (Ellipse 1 1) manyCircles = [ Translate (x,0) oneCircle | x <- [0,2..] ] fiveCircles = foldr Union Empty (take 5 manyCircles) pic4 = Region Magenta (Scale (0.25,0.25) fiveCircles) main4 = draw pic4 x0 = Region Magenta oneCircle x1 = Region Magenta (Scale (0.25,0.25) oneCircle) ---- Ordering Pictures pictToList :: Picture -> [(Color,Region)]
pictToList EmptyPic = []
pictToList (Region c r) = [(c,r)]
pictToList (p1 `Over` p2)
 = pictToList p1 ++ pictToList p2
pic6 = pic4 `Over` pic2 `Over` pic1 `Over` pic3
zz = pictToList pic6
-- [(Magenta,?), (yellow,?),(Cyan,?),(Cyan,?)]
adjust :: [(Color,Region)] -> Vertex ->
 (Maybe (Color,Region), [(Color,Region)])
adjust [] p = (Nothing, [])
adjust ((c,r):regs) p =
 if r `containsR` p
 then (Just (c,r), regs)
 else let (hit, rs) = adjust regs p
 in (hit, (c,r) : rs)
adjust2 regs p
 = case (break (\(_,r) -> r `containsR` p) regs) of
 (top,hit:rest) -> (Just hit, top++rest)
 (_,[]) -> (Nothing, [])
loop :: Window -> [(Color,Region)] -> IO ()
loop w regs =
 do clearWindow w
 sequence [ drawRegionInWindow w c r |
 (c,r) <- reverse regs ] (x,y) <- getLBP w print "Before adjust\n" case (adjust2 regs (pixelToInch (x - xWin2), pixelToInch (yWin2 - y) )) of (Nothing, _ ) -> do { print "Nothing"; closeWindow w }
 (Just hit, newRegs) -> do { print "after adjust"
 ; loop w (hit : newRegs) }
draw2 :: Picture -> IO ()
draw2 pic
 = runGraphics (
 do w <- openWindow "Picture demo" (xWin,yWin) loop w (pictToList pic)) p1,p2,p3,p4 :: Picture p1 = Region Magenta r1 p2 = Region Cyan r2 p3 = Region Green r3 p4 = Region Yellow r4 pic :: Picture pic = foldl Over EmptyPic [p1,p2,p3,p4] main5 = draw2 pic loop2 w regs = do clearWindow w sequence [ drawRegionInWindow w c r | (c,r) <- reverse regs ] (x,y) <- getLBP w let aux (_,r) = r `containsR` ( pixelToInch (x-xWin2), pixelToInch (yWin2-y) ) case (break aux regs) of (_,[]) -> closeWindow w
 (top,hit:bot) -> loop w (hit : (top++bot))
draw3 :: Picture -> IO ()
draw3 pic
 = runGraphics (
 do w <- openWindow "Picture demo" (xWin,yWin) loop2 w (pictToList pic) ) main6 = draw3 pic -- 

AltStyle によって変換されたページ (->オリジナル) /