From cd5220116aa7a9cc85f4f8940174379408fca5bf Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Thu, 26 Nov 2009 17:07:20 +0000 Subject: [PATCH] added underlay svn: r17072 --- collects/2htdp/image.ss | 3 + collects/2htdp/private/image-more.ss | 28 +++- collects/2htdp/tests/test-image.ss | 149 ++++++++++++++++-- .../teachpack/2htdp/scribblings/image-gen.ss | 8 +- .../teachpack/2htdp/scribblings/image-toc.ss | 74 ++++++++- .../teachpack/2htdp/scribblings/image.scrbl | 64 ++++++++ .../2htdp/scribblings/img/157ab5efca7.png | Bin 0 -> 179 bytes .../2htdp/scribblings/img/201c231dce2.png | Bin 0 -> 965 bytes .../2htdp/scribblings/img/26bd803042c.png | Bin 0 -> 117 bytes .../2htdp/scribblings/img/28253f4c3c.png | Bin 0 -> 1648 bytes .../2htdp/scribblings/img/2d1e52503d7.png | Bin 0 -> 1085 bytes .../2htdp/scribblings/img/42f9f9e4cf.png | Bin 0 -> 178 bytes .../2htdp/scribblings/img/9858b8d5d.png | Bin 0 -> 1144 bytes .../2htdp/scribblings/img/ff2fcb7b87.png | Bin 0 -> 354 bytes 14 files changed, 307 insertions(+), 19 deletions(-) create mode 100644 collects/teachpack/2htdp/scribblings/img/157ab5efca7.png create mode 100644 collects/teachpack/2htdp/scribblings/img/201c231dce2.png create mode 100644 collects/teachpack/2htdp/scribblings/img/26bd803042c.png create mode 100644 collects/teachpack/2htdp/scribblings/img/28253f4c3c.png create mode 100644 collects/teachpack/2htdp/scribblings/img/2d1e52503d7.png create mode 100644 collects/teachpack/2htdp/scribblings/img/42f9f9e4cf.png create mode 100644 collects/teachpack/2htdp/scribblings/img/9858b8d5d.png create mode 100644 collects/teachpack/2htdp/scribblings/img/ff2fcb7b87.png diff --git a/collects/2htdp/image.ss b/collects/2htdp/image.ss index eeb3fb0d4c..bf2612ed7d 100644 --- a/collects/2htdp/image.ss +++ b/collects/2htdp/image.ss @@ -52,6 +52,9 @@ and they all have good sample contracts. (It is amazing what we can do with kids (provide overlay overlay/align overlay/xy + underlay + underlay/align + underlay/xy beside beside/align diff --git a/collects/2htdp/private/image-more.ss b/collects/2htdp/private/image-more.ss index aa8142316f..7b0e94034e 100644 --- a/collects/2htdp/private/image-more.ss +++ b/collects/2htdp/private/image-more.ss @@ -307,10 +307,14 @@ ;; overlay : image image image ... -> image ;; places images on top of each other with their upper left corners aligned. last one goes on the bottom - (define/chk (overlay image image2 . image3) (overlay/internal 'left 'top image (cons image2 image3))) +;; underlay : image image image ... -> image +(define (underlay image image2 . image3) + (let ([imgs (reverse (list* image image2 image3))]) + (overlay/internal 'left 'top (car imgs) (cdr imgs)))) + ;; overlay/align : string string image image image ... -> image ;; the first string has to be one of "center" "middle" "left" or "right" (or symbols) ;; the second string has to be one of "center" "middle" "top" "bottom" or "baseline" (or symbols) @@ -322,6 +326,10 @@ (define/chk (overlay/align x-place y-place image image2 . image3) (overlay/internal x-place y-place image (cons image2 image3))) +(define/chk (underlay/align x-place y-place image image2 . image3) + (let ([imgs (reverse (list* image image2 image3))]) + (overlay/internal x-place y-place (car imgs) (cdr imgs)))) + (define (overlay/internal x-place y-place fst rst) (let loop ([fst fst] [rst rst]) @@ -346,14 +354,16 @@ (case x-place [(left) 0] [(middle) (/ (image-right image) 2)] - [(right) (image-right image)])) + [(right) (image-right image)] + [else (error 'find-x-spot "~s" x-place)])) (define (find-y-spot y-place image) (case y-place [(top) 0] [(middle) (/ (image-bottom image) 2)] [(bottom) (image-bottom image)] - [(baseline) (image-baseline image)])) + [(baseline) (image-baseline image)] + [else (error 'find-y-spot "~s" y-place)])) ;; overlay/xy : image number number image -> image ;; places images on top of each other with their upper-left corners offset by the two numbers @@ -366,6 +376,14 @@ (if (< dx 0) 0 dx) (if (< dy 0) 0 dy))) +(define/chk (underlay/xy image dx dy image2) + (overlay/δ image2 + (if (< dx 0) 0 dx) + (if (< dy 0) 0 dy) + image + (if (< dx 0) (- dx) 0) + (if (< dy 0) (- dy) 0))) + (define (overlay/δ image1 dx1 dy1 image2 dx2 dy2) (make-image (make-overlay (make-translate dx1 dy1 (image-shape image1)) (make-translate dx2 dy2 (image-shape image2))) @@ -943,6 +961,10 @@ (provide overlay overlay/align overlay/xy + underlay + underlay/align + underlay/xy + beside beside/align above diff --git a/collects/2htdp/tests/test-image.ss b/collects/2htdp/tests/test-image.ss index abb3d83197..64eb05ce34 100644 --- a/collects/2htdp/tests/test-image.ss +++ b/collects/2htdp/tests/test-image.ss @@ -285,9 +285,9 @@ #f)) (test (overlay/align 'middle - 'middle - (ellipse 100 50 'solid 'green) - (ellipse 50 100 'solid 'red)) + 'middle + (ellipse 100 50 'solid 'green) + (ellipse 50 100 'solid 'red)) => (make-image (make-overlay @@ -297,9 +297,9 @@ #f)) (test (overlay/align 'middle - 'middle - (ellipse 50 100 'solid 'red) - (ellipse 100 50 'solid 'green)) + 'middle + (ellipse 50 100 'solid 'red) + (ellipse 100 50 'solid 'green)) => (make-image (make-overlay @@ -310,9 +310,9 @@ (test (overlay/align 'right - 'bottom - (ellipse 50 100 'solid 'red) - (ellipse 100 50 'solid 'green)) + 'bottom + (ellipse 50 100 'solid 'red) + (ellipse 100 50 'solid 'green)) => (make-image (make-overlay @@ -322,9 +322,9 @@ #f)) (test (overlay/align 'right - 'baseline - (ellipse 50 100 'solid 'red) - (ellipse 100 50 'solid 'green)) + 'baseline + (ellipse 50 100 'solid 'red) + (ellipse 100 50 'solid 'green)) => (make-image (make-overlay @@ -413,13 +413,136 @@ #f)) (test (above (ellipse 50 100 'solid 'red) - (ellipse 100 50 'solid 'blue)) + (ellipse 100 50 'solid 'blue)) => (above/align 'left (ellipse 50 100 'solid 'red) (ellipse 100 50 'solid 'blue))) + +(test (underlay (ellipse 100 100 'solid 'blue) + (ellipse 120 120 'solid 'red)) + => + (make-image + (make-overlay + (make-translate 0 0 (image-shape (ellipse 120 120 'solid 'red))) + (make-translate 0 0 (image-shape (ellipse 100 100 'solid 'blue)))) + (make-bb 120 + 120 + 120) + #f)) + +(test (underlay/xy (ellipse 100 100 'solid 'blue) + 0 0 + (ellipse 120 120 'solid 'red)) + => + (underlay (ellipse 100 100 'solid 'blue) + (ellipse 120 120 'solid 'red))) + + +(test (underlay/xy (ellipse 50 100 'solid 'red) + -25 25 + (ellipse 100 50 'solid 'green)) + => + (make-image + (make-overlay + (make-translate 0 25 (image-shape (ellipse 100 50 'solid 'green))) + (make-translate 25 0 (image-shape (ellipse 50 100 'solid 'red)))) + (make-bb 100 + 100 + 100) + #f)) + +(test (underlay/xy (ellipse 100 50 'solid 'green) + 10 10 + (ellipse 50 100 'solid 'red)) + => + (make-image + (make-overlay + (make-translate 10 10 (image-shape (ellipse 50 100 'solid 'red))) + (make-translate 0 0 (image-shape (ellipse 100 50 'solid 'green)))) + (make-bb 100 + 110 + 110) + #f)) + +(test (underlay (ellipse 100 50 'solid 'green) + (ellipse 50 100 'solid 'red)) + => + (make-image + (make-overlay + (make-translate 0 0 (image-shape (ellipse 50 100 'solid 'red))) + (make-translate 0 0 (image-shape (ellipse 100 50 'solid 'green)))) + (make-bb 100 + 100 + 100) + #f)) + +(test (underlay (ellipse 100 100 'solid 'blue) + (ellipse 120 120 'solid 'red) + (ellipse 140 140 'solid 'green)) + => + (make-image + (make-overlay + (make-translate + 0 0 + (make-overlay + (make-translate 0 0 (image-shape (ellipse 140 140 'solid 'green))) + (make-translate 0 0 (image-shape (ellipse 120 120 'solid 'red))))) + (make-translate 0 0 (image-shape (ellipse 100 100 'solid 'blue)))) + (make-bb 140 140 140) + #f)) + +(test (underlay/align 'middle + 'middle + (ellipse 100 50 'solid 'green) + (ellipse 50 100 'solid 'red)) + => + (make-image + (make-overlay + (make-translate 25 0 (image-shape (ellipse 50 100 'solid 'red))) + (make-translate 0 25 (image-shape (ellipse 100 50 'solid 'green)))) + (make-bb 100 100 100) + #f)) + +(test (underlay/align 'middle + 'middle + (ellipse 50 100 'solid 'red) + (ellipse 100 50 'solid 'green)) + => + (make-image + (make-overlay + (make-translate 0 25 (image-shape (ellipse 100 50 'solid 'green))) + (make-translate 25 0 (image-shape (ellipse 50 100 'solid 'red)))) + (make-bb 100 100 100) + #f)) + +(test (underlay/align 'right + 'bottom + (ellipse 50 100 'solid 'red) + (ellipse 100 50 'solid 'green)) + => + (make-image + (make-overlay + (make-translate 0 50 (image-shape (ellipse 100 50 'solid 'green))) + (make-translate 50 0 (image-shape (ellipse 50 100 'solid 'red)))) + (make-bb 100 100 100) + #f)) + +(test (underlay/align "right" + "baseline" + (ellipse 50 100 'solid 'red) + (ellipse 100 50 'solid 'green)) + => + (make-image + (make-overlay + (make-translate 0 50 (image-shape (ellipse 100 50 'solid 'green))) + (make-translate 50 0 (image-shape (ellipse 50 100 'solid 'red)))) + (make-bb 100 100 100) + #f)) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; testing normalization diff --git a/collects/teachpack/2htdp/scribblings/image-gen.ss b/collects/teachpack/2htdp/scribblings/image-gen.ss index cbaf4b9c66..753806ba2e 100644 --- a/collects/teachpack/2htdp/scribblings/image-gen.ss +++ b/collects/teachpack/2htdp/scribblings/image-gen.ss @@ -28,7 +28,13 @@ (define (handle-image exp) (printf ".") (flush-output) - (let ([result (parameterize ([current-namespace image-ns]) (eval exp))]) + (let ([result + (with-handlers ([exn:fail? + (λ (x) + (printf "\nerror evaluating:\n") + (pretty-print exp) + (raise x))]) + (parameterize ([current-namespace image-ns]) (eval exp)))]) (cond [(image? result) (let ([fn (exp->filename exp)]) diff --git a/collects/teachpack/2htdp/scribblings/image-toc.ss b/collects/teachpack/2htdp/scribblings/image-toc.ss index 5ff0c76d67..314d641b85 100644 --- a/collects/teachpack/2htdp/scribblings/image-toc.ss +++ b/collects/teachpack/2htdp/scribblings/image-toc.ss @@ -8,8 +8,8 @@ (list (list '(image-height (rectangle 100 100 "solid" "black")) 'val 100) (list '(image-baseline (rectangle 100 100 "solid" "black")) 'val 100) - (list '(image-height (text "Hello" 24 "black")) 'val 24.0) - (list '(image-baseline (text "Hello" 24 "black")) 'val 18.0) + (list '(image-height (text "Hello" 24 "black")) 'val 41.0) + (list '(image-baseline (text "Hello" 24 "black")) 'val 31.0) (list '(image-height (overlay (circle 20 "solid" "orange") (circle 30 "solid" "purple"))) @@ -114,6 +114,76 @@ (ellipse 20 10 "solid" "black")) 'image "28c73238138.png") + (list + '(underlay/xy + (underlay/xy + (ellipse 40 40 "solid" "gray") + 10 + 15 + (ellipse 10 10 "solid" "forestgreen")) + 20 + 15 + (ellipse 10 10 "solid" "forestgreen")) + 'image + "201c231dce2.png") + (list + '(underlay/xy + (rectangle 20 20 "solid" "red") + -20 + -20 + (rectangle 20 20 "solid" "black")) + 'image + "42f9f9e4cf.png") + (list + '(underlay/xy + (rectangle 20 20 "solid" "red") + 20 + 20 + (rectangle 20 20 "solid" "black")) + 'image + "157ab5efca7.png") + (list + '(underlay/xy + (rectangle 20 20 "outline" "black") + 20 + 0 + (rectangle 20 20 "outline" "black")) + 'image + "26bd803042c.png") + (list + '(underlay/align + "right" + "top" + (rectangle 50 50 "solid" "seagreen") + (rectangle 40 40 "solid" "silver") + (rectangle 30 30 "solid" "seagreen") + (rectangle 20 20 "solid" "silver")) + 'image + "ff2fcb7b87.png") + (list + '(underlay/align + "middle" + "middle" + (rectangle 30 60 "solid" "orange") + (ellipse 60 30 "solid" "purple")) + 'image + "2d1e52503d7.png") + (list + '(underlay + (ellipse 10 60 "solid" "red") + (ellipse 20 50 "solid" "black") + (ellipse 30 40 "solid" "red") + (ellipse 40 30 "solid" "black") + (ellipse 50 20 "solid" "red") + (ellipse 60 10 "solid" "black")) + 'image + "28253f4c3c.png") + (list + '(underlay + (rectangle 30 60 "solid" "orange") + (ellipse 60 30 "solid" "purple")) + 'image + "9858b8d5d.png") (list '(overlay/xy (overlay/xy diff --git a/collects/teachpack/2htdp/scribblings/image.scrbl b/collects/teachpack/2htdp/scribblings/image.scrbl index 3698a01242..bc1f123196 100644 --- a/collects/teachpack/2htdp/scribblings/image.scrbl +++ b/collects/teachpack/2htdp/scribblings/image.scrbl @@ -318,6 +318,70 @@ other. The top and bottom pair of angles is @scheme[angle] and the left and righ (ellipse 10 10 "solid" "forestgreen"))] } +@defproc[(underlay [i1 image?] [i2 image?] [is image?] ...) image?]{ + Underlays all of its arguments building a single image. + + It behaves like @scheme[overlay], but with the arguments in the reverse order. + That is, the first argument goes + underneath of the second argument, which goes underneath the third argument, etc. + The images are all lined up on their upper-left corners. + + @image-examples[(underlay (rectangle 30 60 "solid" "orange") + (ellipse 60 30 "solid" "purple")) + (underlay (ellipse 10 60 "solid" "red") + (ellipse 20 50 "solid" "black") + (ellipse 30 40 "solid" "red") + (ellipse 40 30 "solid" "black") + (ellipse 50 20 "solid" "red") + (ellipse 60 10 "solid" "black"))] + + } + +@defproc[(underlay/align [x-place x-place?] [y-place y-place?] [i1 image?] [i2 image?] [is image?] ...) image?]{ + Underlays all of its image arguments, much like the @scheme[underlay] function, but using + @scheme[x-place] and @scheme[y-place] to determine where the images are lined up. For example, if + @scheme[x-place] and @scheme[y-place] are both @scheme["middle"], then the images are lined up + on their centers. + + @image-examples[(underlay/align "middle" "middle" + (rectangle 30 60 "solid" "orange") + (ellipse 60 30 "solid" "purple")) + (underlay/align "right" "top" + (rectangle 50 50 "solid" "seagreen") + (rectangle 40 40 "solid" "silver") + (rectangle 30 30 "solid" "seagreen") + (rectangle 20 20 "solid" "silver"))] + + + } + +@defproc[(underlay/xy [i1 image?] [x real?] [y real?] [i2 image?]) image?]{ + Constructs an image by underlaying @scheme[i1] underneath of @scheme[i2] after + shifting @scheme[i2] over by @scheme[x] pixels to the right and @scheme[y] + pixels down. + + This is the same as @scheme[(overlay/xy i2 (- x) (- y) i1)]. + + @image-examples[(underlay/xy (rectangle 20 20 "outline" "black") + 20 0 + (rectangle 20 20 "outline" "black")) + (underlay/xy (rectangle 20 20 "solid" "red") + 20 20 + (rectangle 20 20 "solid" "black")) + (underlay/xy (rectangle 20 20 "solid" "red") + -20 -20 + (rectangle 20 20 "solid" "black")) + (underlay/xy + (underlay/xy (ellipse 40 40 "solid" "gray") + 10 + 15 + (ellipse 10 10 "solid" "forestgreen")) + 20 + 15 + (ellipse 10 10 "solid" "forestgreen"))] +} + + @defproc[(beside [i1 image?] [i2 image?] [is image?] ...) image?]{ Constructs an image by placing all of the argument images in a horizontal row, aligned along their top edges. diff --git a/collects/teachpack/2htdp/scribblings/img/157ab5efca7.png b/collects/teachpack/2htdp/scribblings/img/157ab5efca7.png new file mode 100644 index 0000000000000000000000000000000000000000..59966a6bc9cb7c65315d62b114d4b63f4abd4bf8 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^njp-<1SHj&rY{6iRh}-6ArY-_uWb}OV8FrbVEKIE z6~k#a8+OJVjh?7iyWrH^k}bQIUpevn*gcJwmdK?))Rcu*%&GoXv{mlC>$aSmn^I3t z`)gm_bR=qORLZ6~F*oqN#LaqIHCb$ivKAqxM^xT!fgX6f4Ww2XIK a)8v*Wt_cfnJM}&>B5zp7#KqX{3~Yuqw{$N>zwfr2q7@H9LE_92DWXF$K#jtG)-@8Z16k}A)G&3 zY@Q&~G@qWHI-SmFG{S^I2t`qpWm%FWk|ZP35}0)(gxc-4rfGx0V4g<|L{XHYD5|RB zpI|22vaE8syeRdh7=}4GI7p|{i?KCLySuydJnz53fijs)KA$HDBASg5s#Ge?X7laT zK%1MJg+gI+|HH3kxm;c@7yw`xMyXVq+{IVy`}_M=tF>HkfWN)HoyqQYyY+f~6<}Yj zRx7lyziiiaC!cHSs#GerZHL*Krs3vh z8jZ$3cDvnP8yEo4>2&<1LeKO1{r)=Hp6BVh4giQ*mK9k$`{Vw#dEIk*005F8PsEe= z-1|A*sWJ>hQ553w@$u&71{3$&{QdR*tL@n@CqHg~{Gxn`bZ3bq$@BAb=r|50s6Xyc zrUn4~X#M!v{fT!mXH%TWknHh$G48vd|a$N4yyHAtz1)*@MT;g3!S^z*i9*^-nj}Q91 z^Ld-u{@(oVR}V`#+kOV1#Ns^9^ zj;3A$%>4GR*X#9qeWBZ!kVulu<#LLm%nHEWdA#N7VQXtEpU<-_i;2Op0RRXgUDq3p z#&C!`q6C5vrqk)&-Q9VrMFcyLX_~sO8-_8pOgZC NJYD@<);T3K0RS(}_O-@d> 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 KMNUMnLSTXp7$d#_ literal 0 HcmV?d00001 diff --git a/collects/teachpack/2htdp/scribblings/img/ff2fcb7b87.png b/collects/teachpack/2htdp/scribblings/img/ff2fcb7b87.png new file mode 100644 index 0000000000000000000000000000000000000000..0930b8b91a3e00a376c1c086fed05adc338c79a5 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^#vshW1SGc}US7+2rJfJ>6%XNSIvsY~cb@#Z zymg`N=T@El{3611@862|eUn&st6$vLw#Hnt>qOhJXa8L!~~inG-g9^`e^XZ>Jv# z5c{3@rd|8fACt0WNuP6rAm)8LHEqw9TlJNbzhzl(3R(7dy7|iB)g5QIdqOO`sa?!} tXh(6$#=K+e`4;c$u&A83KH6x%{wgo)2N##$@&tw*gQu&X%Q~loCIAHMp*#Qp literal 0 HcmV?d00001