moveR (xc,yc) r = \(x,y) -> r (x-xc, y-yc) frac x = x - floor x stripes width size x = frac ((x-width/2)/width) < size getPicture str = let im <- image str zoom <- slider "Scale" (0.1, 10) 1 moveX <- slider "X motion" (-200, 200) 0 moveY <- slider "Y motion" (-200, 200) 0 rot <- slider "Rotation" (-pi, pi) 0 in translate (moveX, moveY) $ rotate rot $ uscale zoom im fadeImage f = let t <- timer "Time" 1 true (im1x, im1y, im1) <- sizedImageD "First image" "guineapig.jpg" (im2x, im2y, im2) <- sizedImageD "Second image" "bob.jpg" im1m = max im1x im1y im2m = max im2x im2y im1s = translate (-1, -1) $ uscale (2/im1m) im1 im2s = translate (-1, -1) $ uscale (2/im2m) im2 in zoomIn 100 (f im1s im2s t) fadeRegion r = fadeImage (\im1 im2 t -> \p -> if r t p then im1 p else im2 p) interpolateN t n1 n2 = (1-t)*n1 + t*n2 interpolateP t (x1, y1) (x2, y2) = (interpolateN t x1 x2, interpolateN t y1 y2) -- interpolateC is already there!