From 9105b92240694bed17a7c30a431687daf69df3ce Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Tue, 7 Sep 2010 09:19:23 -0500 Subject: [PATCH] added overlay/pinhole and underlay/pinhole --- collects/2htdp/image.rkt | 2 + collects/2htdp/private/image-more.rkt | 18 +++++++ .../teachpack/2htdp/scribblings/image-toc.rkt | 36 ++++++++++++++ .../teachpack/2htdp/scribblings/image.scrbl | 45 +++++++++++++++++- .../2htdp/scribblings/img/1648582961a.png | Bin 0 -> 2227 bytes .../2htdp/scribblings/img/1847b22ee5c.png | Bin 0 -> 765 bytes .../2htdp/scribblings/img/31011b92fc.png | Bin 0 -> 5318 bytes .../2htdp/scribblings/img/d2d7809e7e.png | Bin 0 -> 2230 bytes 8 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 collects/teachpack/2htdp/scribblings/img/1648582961a.png create mode 100644 collects/teachpack/2htdp/scribblings/img/1847b22ee5c.png create mode 100644 collects/teachpack/2htdp/scribblings/img/31011b92fc.png create mode 100644 collects/teachpack/2htdp/scribblings/img/d2d7809e7e.png diff --git a/collects/2htdp/image.rkt b/collects/2htdp/image.rkt index b25ed2fab7..80502263d2 100644 --- a/collects/2htdp/image.rkt +++ b/collects/2htdp/image.rkt @@ -130,6 +130,8 @@ and they all have good sample contracts. (It is amazing what we can do with kids center-pinhole pinhole-x pinhole-y + overlay/pinhole + underlay/pinhole make-color make-pen pen diff --git a/collects/2htdp/private/image-more.rkt b/collects/2htdp/private/image-more.rkt index 37a515c495..8f69ca0f9a 100644 --- a/collects/2htdp/private/image-more.rkt +++ b/collects/2htdp/private/image-more.rkt @@ -156,6 +156,22 @@ (let ([imgs (reverse (list* image image2 image3))]) (overlay/internal x-place y-place (car imgs) (cdr imgs)))) +(define/chk (overlay/pinhole image1 image2 . image3) + (overlay/internal 'pinhole 'pinhole + (maybe-center-pinhole image1) + (map maybe-center-pinhole (cons image2 image3)))) + +(define/chk (underlay/pinhole image1 image2 . image3) + (let ([imgs (map maybe-center-pinhole (reverse (list* image1 image2 image3)))]) + (overlay/internal 'pinhole 'pinhole + (car imgs) + (cdr imgs)))) + +(define (maybe-center-pinhole img) + (if (send img get-pinhole) + img + (center-pinhole img))) + (define (overlay/internal x-place y-place fst rst) (let loop ([fst fst] [rst rst]) @@ -1384,6 +1400,8 @@ pinhole-y clear-pinhole center-pinhole + overlay/pinhole + underlay/pinhole build-color/make-color build-color/color diff --git a/collects/teachpack/2htdp/scribblings/image-toc.rkt b/collects/teachpack/2htdp/scribblings/image-toc.rkt index a8da696940..48297d42d6 100644 --- a/collects/teachpack/2htdp/scribblings/image-toc.rkt +++ b/collects/teachpack/2htdp/scribblings/image-toc.rkt @@ -36,6 +36,42 @@ (above r r r r r r)) 'image "245380940d6-1.png") + (list + '(let* ((t (triangle 40 "solid" "orange")) + (w (image-width t)) + (h (image-height t))) + (clear-pinhole + (overlay/pinhole + (put-pinhole (/ w 2) 0 t) + (put-pinhole w h t) + (put-pinhole 0 h t)))) + 'image + "1847b22ee5c.png") + (list + '(underlay/pinhole + (put-pinhole 25 10 (ellipse 100 50 "solid" "red")) + (put-pinhole 75 40 (ellipse 100 50 "solid" "blue"))) + 'image + "1648582961a.png") + (list + '(let ((petal (put-pinhole 20 20 (ellipse 100 40 "solid" "purple")))) + (clear-pinhole + (overlay/pinhole + (circle 30 "solid" "yellow") + (rotate (* 60 0) petal) + (rotate (* 60 1) petal) + (rotate (* 60 2) petal) + (rotate (* 60 3) petal) + (rotate (* 60 4) petal) + (rotate (* 60 5) petal)))) + 'image + "31011b92fc.png") + (list + '(overlay/pinhole + (put-pinhole 25 10 (ellipse 100 50 "solid" "red")) + (put-pinhole 75 40 (ellipse 100 50 "solid" "blue"))) + 'image + "d2d7809e7e.png") (list '(pinhole-y (center-pinhole (rectangle 10 10 "solid" "red"))) 'val '5) (list '(pinhole-x (center-pinhole (rectangle 10 10 "solid" "red"))) 'val '5) (list diff --git a/collects/teachpack/2htdp/scribblings/image.scrbl b/collects/teachpack/2htdp/scribblings/image.scrbl index 2db75ff2ab..921de46a91 100644 --- a/collects/teachpack/2htdp/scribblings/image.scrbl +++ b/collects/teachpack/2htdp/scribblings/image.scrbl @@ -1290,8 +1290,9 @@ in the image. The pinhole can then be used to facilitate overlaying images by lining them up on the their pinholes. When an image has a pinhole, the pinhole -is drawn with crosshairs drawn across the image. -The crosshairs are drawn with a two one pixel wide black lines and two one pixel wide white lines, +is drawn with crosshairs on the image. +The crosshairs are drawn with a two one pixel wide black lines (one horizontal and one vertical) +and two one pixel wide white lines, where the black lines is drawn .5 pixels to the left and above the pinhole, and the white lines are drawn .5 pixels to the right and below the pinhole. Accordingly, when the pixel is on an integral coordinate, then black and white lines all @@ -1325,6 +1326,46 @@ then the scene argument's pinhole is preserved. Removes a pinhole from @racket[image] (if the image has a pinhole). } +@defproc[(overlay/pinhole [i1 image?] [i2 image?] [is image?] ...) image?]{ + + Overlays all of the image arguments on their pinholes. If any of the + arguments do not have pinholes, then the center of the image is used instead. + + @image-examples[(overlay/pinhole + (put-pinhole 25 10 (ellipse 100 50 "solid" "red")) + (put-pinhole 75 40 (ellipse 100 50 "solid" "blue"))) + (let ([petal (put-pinhole + 20 20 + (ellipse 100 40 "solid" "purple"))]) + (clear-pinhole + (overlay/pinhole + (circle 30 "solid" "yellow") + (rotate (* 60 0) petal) + (rotate (* 60 1) petal) + (rotate (* 60 2) petal) + (rotate (* 60 3) petal) + (rotate (* 60 4) petal) + (rotate (* 60 5) petal))))] +} + +@defproc[(underlay/pinhole [i1 image?] [i2 image?] [is image?] ...) image?]{ + + Underlays all of the image arguments on their pinholes. If any of the + arguments do not have pinholes, then the center of the image is used instead. + + @image-examples[(underlay/pinhole + (put-pinhole 25 10 (ellipse 100 50 "solid" "red")) + (put-pinhole 75 40 (ellipse 100 50 "solid" "blue"))) + (let* ([t (triangle 40 "solid" "orange")] + [w (image-width t)] + [h (image-height t)]) + (clear-pinhole + (overlay/pinhole + (put-pinhole (/ w 2) 0 t) + (put-pinhole w h t) + (put-pinhole 0 h t))))] +} + @section[#:tag "nitty-gritty"]{The nitty gritty of pixels, pens, and lines} The image library treats coordinates as if they are in the upper-left corner diff --git a/collects/teachpack/2htdp/scribblings/img/1648582961a.png b/collects/teachpack/2htdp/scribblings/img/1648582961a.png new file mode 100644 index 0000000000000000000000000000000000000000..d780f14c6c0978e6efbbfe2e266e0154e69773cc GIT binary patch literal 2227 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 j`SuKk-&HfC9iQ?>GoI#?( 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�Ncp6uJl^AwjgaYv!VdzCN*UpC~TY_`c5!{%a>Qlto0Riy&Tp zSqu$n?4pO;w?#{f`1DgzTrA>)--X~mA?%(Ii z6}r3K{cHC3bL&a;fCpIrQsdEXt)4s}=pasON-|u5dWeuZuAPL9Z_AIiaL0 zGBeSyi?Jw|N^*12uZyuLmr7QxLccD?qFgGes6f9ix}sb$e6w;TufB?YT?FdtWGm1; zd-uBj>exkBlq-fe-hP{s64$>vb`dyogsd#tB6P{@*)%kGKIz-Vj0{ekAR$4v4xKS+ z5+_dlH3X?|7l9QkIDQl9OfYkV;Al&COI*y*S1oE&}V;ap8il`wj{#bLMdIB5T%6IMO&S0?CN5oK;X-ed7|KN;HI<`BX>H}Dmt;$c2(xF?+RBk5q@?(m%4jaS zc=JsL2H3L)vst#3uwgb+SI4ivs(CPAOcw#OnVmbidX<_QU%@^jl9!ORyOb#8wW}~)N`>uc@PkK7Fwb*PNJQ&b(a)Z0*V%99`>$!G~h6c~AMT1dN z!r{aG@dx$w%$gPG+!1}NIJ_h!QC&@SwfhI?zx|fMLD`!8F=r0%zRP>>k(U?JawGe=pupX^=AuO^&o+Z2%3Yi}bLR7d zLX2{m%_JmXGLe$PJpcdz07*qoM6N<$ Ef`Xw_v;Y7A literal 0 HcmV?d00001