diff --git a/collects/2htdp/image.ss b/collects/2htdp/image.ss index 022b1f160c..6475cb8716 100644 --- a/collects/2htdp/image.ss +++ b/collects/2htdp/image.ss @@ -88,6 +88,8 @@ and they all have good sample contracts. (It is amazing what we can do with kids line add-line add-curve + scene+line + scene+curve text text/font bitmap diff --git a/collects/2htdp/private/image-more.ss b/collects/2htdp/private/image-more.ss index 2ee20d620d..9ce702be76 100644 --- a/collects/2htdp/private/image-more.ss +++ b/collects/2htdp/private/image-more.ss @@ -290,7 +290,7 @@ ;; place-image : image x y scene -> scene (define/chk (place-image image1 x1 y1 image2) - (place-image/internal image1 x1 y1 image2 'left 'top)) + (place-image/internal image1 x1 y1 image2 'middle 'middle)) (define/chk (place-image/align image1 x1 y1 x-place y-place image2) (place-image/internal image1 x1 y1 image2 x-place y-place)) @@ -309,6 +309,28 @@ (if (< dx 0) (- dx) 0) (if (< dy 0) (- dy) 0))))) +(define/chk (scene+line image x1 y1 x2 y2 color) + (let* ([dx (abs (min 0 x1 x2))] + [dy (abs (min 0 y1 y2))]) + (make-image (make-overlay + (make-crop (rectangle-points (get-right image) (get-bottom image)) + (make-line-segment (make-point x1 y1) (make-point x2 y2) color)) + (image-shape image)) + (image-bb image) + #f))) + +(define/chk (scene+curve image x1 y1 angle1 pull1 x2 y2 angle2 pull2 color) + (let* ([dx (abs (min 0 x1 x2))] + [dy (abs (min 0 y1 y2))]) + (make-image (make-overlay + (make-crop (rectangle-points (get-right image) (get-bottom image)) + (make-curve-segment (make-point x1 y1) angle1 pull1 + (make-point x2 y2) angle2 pull2 + color)) + (image-shape image)) + (image-bb image) + #f))) + ;; frame : image -> image ;; draws a black frame around a image where the bounding box is ;; (useful for debugging images) @@ -931,7 +953,8 @@ line add-line add-curve - + scene+line + scene+curve text text/font diff --git a/collects/2htdp/tests/test-image.ss b/collects/2htdp/tests/test-image.ss index 378fa0199c..147abbe5f2 100644 --- a/collects/2htdp/tests/test-image.ss +++ b/collects/2htdp/tests/test-image.ss @@ -987,6 +987,35 @@ => (+ bl 10))) +(test (scene+line (rectangle 100 100 'solid 'black) + 10 10 + 90 50 + "red") + => + (add-line (rectangle 100 100 'solid 'black) + 10 10 + 90 50 + "red")) + +(test (image-width (scene+line (rectangle 100 100 'solid 'black) + -10 -20 + 110 120 + "green")) + => + 100) +(test (image-height (scene+line (rectangle 100 100 'solid 'black) + -10 -20 + 110 120 + 'purple)) + => + 100) +(test (image-baseline (scene+line (rectangle 100 100 'solid 'black) + -10 -20 + 110 120 + 'olive)) + => + 100) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; curves @@ -1033,6 +1062,27 @@ (rectangle 100 100 'solid 'black) 20 80 90 1/3 80 20 90 1/3 'white)) +(test (add-curve (rectangle 100 100 'solid 'black) + 10 10 0 1/4 + 90 90 0 1/4 + 'white) + => + (scene+curve (rectangle 100 100 'solid 'black) + 10 10 0 1/4 + 90 90 0 1/4 + 'white)) +(test (scene+curve (rectangle 100 100 'solid 'black) + 10 10 0 1/4 + 110 110 0 1/4 + 'red) + + => + (crop 0 0 100 100 + (add-curve (rectangle 100 100 'solid 'black) + 10 10 0 1/4 + 110 110 0 1/4 + 'red))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; bitmap tests @@ -1195,39 +1245,44 @@ (rectangle 10 10 'solid 'black) (rectangle 10 10 'solid 'green))) -(test (place-image (circle 4 'solid 'black) - 10 10 - (rectangle 40 40 'solid 'orange)) +(test (place-image/align (circle 4 'solid 'black) + 10 10 + 'left 'top + (rectangle 40 40 'solid 'orange)) => (underlay/xy (rectangle 40 40 'solid 'orange) 10 10 (circle 4 'solid 'black))) -(test (place-image (circle 4 'solid 'black) - 50 50 - (rectangle 40 40 'solid 'orange)) +(test (place-image/align (circle 4 'solid 'black) + 50 50 + 'left 'top + (rectangle 40 40 'solid 'orange)) => (rectangle 40 40 'solid 'orange)) -(test (place-image (circle 4 'solid 'black) - 36 36 - (rectangle 40 40 'solid 'orange)) +(test (place-image/align (circle 4 'solid 'black) + 36 36 + 'left 'top + (rectangle 40 40 'solid 'orange)) => (underlay/xy (rectangle 40 40 'solid 'orange) 36 36 (crop 0 0 4 4 (circle 4 'solid 'black)))) -(test (place-image (circle 8 'solid 'black) - -4 -4 - (rectangle 40 40 'solid 'orange)) +(test (place-image/align (circle 8 'solid 'black) + -4 -4 + 'left 'top + (rectangle 40 40 'solid 'orange)) => (overlay/xy (crop 4 4 16 16 (circle 8 'solid 'black)) 0 0 (rectangle 40 40 'solid 'orange))) -(test (place-image (circle 4 'solid 'black) - -4 0 - (rectangle 40 40 'solid 'orange)) +(test (place-image/align (circle 4 'solid 'black) + -4 0 + 'left 'top + (rectangle 40 40 'solid 'orange)) => (overlay/xy (crop 4 0 4 8 (circle 4 'solid 'black)) 0 0 diff --git a/collects/teachpack/2htdp/scribblings/image-toc.ss b/collects/teachpack/2htdp/scribblings/image-toc.ss index eace9c52d0..3802a8f2ed 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) - (list '(image-baseline (text "Hello" 24 "black")) 'val 18) + (list '(image-height (text "Hello" 24 "black")) 'val 41) + (list '(image-baseline (text "Hello" 24 "black")) 'val 31) (list '(image-height (overlay (circle 20 "solid" "orange") (circle 30 "solid" "purple"))) @@ -75,6 +75,90 @@ '(rotate 45 (ellipse 60 20 "solid" "olivedrab")) 'image "28daec71a64.png") + (list + '(scene+curve + (rectangle 100 100 "solid" "black") + -20 + -20 + 0 + 1 + 120 + 120 + 0 + 1 + "red") + 'image + "25dd3e2d97c.png") + (list + '(scene+curve + (add-curve + (rectangle 40 100 "solid" "black") + 20 + 10 + 180 + 1/2 + 20 + 90 + 180 + 1/2 + "white") + 20 + 10 + 0 + 1/2 + 20 + 90 + 0 + 1/2 + "white") + 'image + "1132401ea93.png") + (list + '(scene+curve + (rectangle 100 100 "solid" "black") + 20 + 20 + 0 + 1 + 80 + 80 + 0 + 1 + "white") + 'image + "6efa12ea15.png") + (list + '(scene+curve + (rectangle 100 100 "solid" "black") + 20 + 20 + 0 + 1/3 + 80 + 80 + 0 + 1/3 + "white") + 'image + "353ed4578.png") + (list + '(scene+line (rectangle 40 40 "solid" "gray") -10 50 50 -10 "maroon") + 'image + "1f5944ec1ed.png") + (list + '(scene+line + (ellipse 80 60 "outline" "darkolivegreen") + (+ 40 (* 40 (cos (* pi 1/4)))) + (+ 30 (* 30 (sin (* pi 1/4)))) + (+ 40 (* 40 (cos (* pi 5/4)))) + (+ 30 (* 30 (sin (* pi 5/4)))) + "darkolivegreen") + 'image + "2353974cf1b.png") + (list + '(scene+line (ellipse 40 40 "outline" "maroon") 0 40 40 0 "maroon") + 'image + "2b944b7ab91.png") (list '(beside (place-image/align @@ -127,39 +211,39 @@ (list '(place-image (circle 4 "solid" "white") - 16 18 + 20 (place-image (circle 4 "solid" "white") - -2 - 4 + 0 + 6 (place-image (circle 4 "solid" "white") - 12 - 0 + 14 + 2 (place-image (circle 4 "solid" "white") - 6 - 12 + 8 + 14 (rectangle 24 24 "solid" "goldenrod"))))) 'image - "1178fdd1294.png") + "ab1841ea36.png") (list '(place-image (triangle 64 "solid" "red") - -8 - -8 + 24 + 24 (rectangle 48 48 "solid" "gray")) 'image - "2875b40781.png") + "13e518b230e.png") (list '(place-image (triangle 32 "solid" "red") - 8 - 8 + 24 + 24 (rectangle 48 48 "solid" "gray")) 'image - "2bea495d1f.png") + "126418b230e.png") (list '(above/align "left" @@ -381,10 +465,24 @@ "169f2ceb45c.png") (list '(text "Goodbye" 36 "indigo") 'image "169990a635e.png") (list '(text "Hello" 24 "olive") 'image "1bbeedc0d6.png") + (list + '(add-curve + (rectangle 100 100 "solid" "black") + -20 + -20 + 0 + 1 + 120 + 120 + 0 + 1 + "red") + 'image + "1532990d5cb.png") (list '(add-curve (add-curve - (rectangle 40 100 'solid 'black) + (rectangle 40 100 "solid" "black") 20 10 180 @@ -393,7 +491,7 @@ 90 180 1/2 - 'white) + "white") 20 10 0 @@ -402,27 +500,41 @@ 90 0 1/2 - 'white) + "white") 'image - "13121248a3c.png") - (list - '(add-curve (rectangle 100 100 'solid 'black) 20 20 0 1 80 80 0 1 'white) - 'image - "df251e846.png") + "2751bdfe579.png") (list '(add-curve - (rectangle 100 100 'solid 'black) + (rectangle 100 100 "solid" "black") 20 20 0 - 1/3 + 1 80 80 0 - 1/3 - 'white) + 1 + "white") 'image - "12472655f6c.png") + "fa1a9f17b6.png") + (list + '(add-curve + (rectangle 100 100 "solid" "black") + 20 + 20 + 0 + 1/3 + 80 + 80 + 0 + 1/3 + "white") + 'image + "2a1f3988f.png") + (list + '(add-line (rectangle 40 40 "solid" "gray") -10 50 50 -10 "maroon") + 'image + "12b0447b10c.png") (list '(add-line (ellipse 80 60 "outline" "darkolivegreen") diff --git a/collects/teachpack/2htdp/scribblings/image.scrbl b/collects/teachpack/2htdp/scribblings/image.scrbl index bdbd04ce96..19a75f041b 100644 --- a/collects/teachpack/2htdp/scribblings/image.scrbl +++ b/collects/teachpack/2htdp/scribblings/image.scrbl @@ -200,6 +200,8 @@ other. The top and bottom pair of angles is @scheme[angle] and the left and righ Adds a line to the image @scheme[image], starting from the point (@scheme[x1],@scheme[y1]) and going to the point (@scheme[x2],@scheme[y2]). + Unlike @scheme[scene+line], if the line passes outside of @scheme[image], the image + gets larger to accomodate the line. @image-examples[(add-line (ellipse 40 40 "outline" "maroon") 0 40 40 0 "maroon") @@ -208,7 +210,9 @@ other. The top and bottom pair of angles is @scheme[angle] and the left and righ (+ 30 (* 30 (sin (* pi 1/4)))) (+ 40 (* 40 (cos (* pi 5/4)))) (+ 30 (* 30 (sin (* pi 5/4)))) - "darkolivegreen")] + "darkolivegreen") + (add-line (rectangle 40 40 "solid" "gray") + -10 50 50 -10 "maroon")] } @defproc[(add-curve [image image?] @@ -229,24 +233,34 @@ The @scheme[pull1] and @scheme[pull2] arguments control how long the curve tries to stay with that angle. Larger numbers mean that the curve stays with the angle longer. -@image-examples[(add-curve (rectangle 100 100 'solid 'black) +Unlike @scheme[scene+curve], if the line passes outside of @scheme[image], the image + gets larger to accomodate the curve. + + +@image-examples[(add-curve (rectangle 100 100 "solid" "black") 20 20 0 1/3 80 80 0 1/3 - 'white) - (add-curve (rectangle 100 100 'solid 'black) + "white") + (add-curve (rectangle 100 100 "solid" "black") 20 20 0 1 80 80 0 1 - 'white) + "white") (add-curve (add-curve - (rectangle 40 100 'solid 'black) + (rectangle 40 100 "solid" "black") 20 10 180 1/2 20 90 180 1/2 - 'white) + "white") 20 10 0 1/2 20 90 0 1/2 - 'white)] + "white") + + (add-curve (rectangle 100 100 "solid" "black") + -20 -20 0 1 + 120 120 0 1 + "red")] } + @defproc[(text [string string?] [font-size (and/c integer? (<=/c 1 255))] [color image-color?]) image?]{ @@ -506,26 +520,26 @@ and universes using @scheme[2htdp/universe]. @image-examples[(place-image (triangle 32 "solid" "red") - 8 8 + 24 24 (rectangle 48 48 "solid" "gray")) (place-image (triangle 64 "solid" "red") - -8 -8 + 24 24 (rectangle 48 48 "solid" "gray")) (place-image (circle 4 "solid" "white") - 16 18 + 18 20 (place-image (circle 4 "solid" "white") - -2 4 + 0 6 (place-image (circle 4 "solid" "white") - 12 0 + 14 2 (place-image (circle 4 "solid" "white") - 6 12 + 8 14 (rectangle 24 24 "solid" "goldenrod")))))] } @defproc[(place-image/align [image image?] [x real?] [y real?] [x-place x-place?] [y-place y-place?][scene image?]) @@ -558,6 +572,74 @@ and universes using @scheme[2htdp/universe]. (rectangle 32 32 "outline" "black")))] } +@defproc[(scene+line [image image?] + [x1 real?] [y1 real?] + [x2 real?] [y2 real?] + [color image-color?]) + image?]{ + + Adds a line to the image @scheme[scene], starting from the point (@scheme[x1],@scheme[y1]) + and going to the point (@scheme[x2],@scheme[y2]); unlike + @scheme[add-line], this function crops the resulting image to the size of @scheme[scene]. + + @image-examples[(scene+line (ellipse 40 40 "outline" "maroon") + 0 40 40 0 "maroon") + (scene+line (ellipse 80 60 "outline" "darkolivegreen") + (+ 40 (* 40 (cos (* pi 1/4)))) + (+ 30 (* 30 (sin (* pi 1/4)))) + (+ 40 (* 40 (cos (* pi 5/4)))) + (+ 30 (* 30 (sin (* pi 5/4)))) + "darkolivegreen") + (scene+line (rectangle 40 40 "solid" "gray") + -10 50 50 -10 "maroon")] +} + +@defproc[(scene+curve [scene image?] + [x1 real?] [y1 real?] [angle1 angle?] [pull1 real?] + [x2 real?] [y2 real?] [angle2 angle?] [pull2 real?] + [color image-color?]) + image?]{ + +Adds a curve to @scheme[scene], starting at the point +(@scheme[x1],@scheme[y1]), and ending at the point +(@scheme[x2],@scheme[y2]). + +The @scheme[angle1] and @scheme[angle2] arguments specify the +angle that the curve has as it leaves the initial point and +as it reaches the final point, respectively. + +The @scheme[pull1] and @scheme[pull2] arguments control how +long the curve tries to stay with that angle. Larger numbers +mean that the curve stays with the angle longer. + +Unlike @scheme[add-curve], this function crops the curve, only showing +the parts that fit onto @scheme[scene]. + +@image-examples[(scene+curve (rectangle 100 100 "solid" "black") + 20 20 0 1/3 + 80 80 0 1/3 + "white") + (scene+curve (rectangle 100 100 "solid" "black") + 20 20 0 1 + 80 80 0 1 + "white") + (scene+curve + (add-curve + (rectangle 40 100 "solid" "black") + 20 10 180 1/2 + 20 90 180 1/2 + "white") + 20 10 0 1/2 + 20 90 0 1/2 + "white") + + (scene+curve (rectangle 100 100 "solid" "black") + -20 -20 0 1 + 120 120 0 1 + "red")] +} + + @section{Rotating, Scaling, Cropping, and Framing Images} @defproc[(rotate [angle angle?] [image image?]) image?]{ diff --git a/collects/teachpack/2htdp/scribblings/img/1132401ea93.png b/collects/teachpack/2htdp/scribblings/img/1132401ea93.png new file mode 100644 index 0000000000..c2850db3df Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/1132401ea93.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/12472655f6c.png b/collects/teachpack/2htdp/scribblings/img/12472655f6c.png deleted file mode 100644 index f65336b245..0000000000 Binary files a/collects/teachpack/2htdp/scribblings/img/12472655f6c.png and /dev/null differ diff --git a/collects/teachpack/2htdp/scribblings/img/126418b230e.png b/collects/teachpack/2htdp/scribblings/img/126418b230e.png new file mode 100644 index 0000000000..5a7a02197c Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/126418b230e.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/12b0447b10c.png b/collects/teachpack/2htdp/scribblings/img/12b0447b10c.png new file mode 100644 index 0000000000..679eea1bf7 Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/12b0447b10c.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/13121248a3c.png b/collects/teachpack/2htdp/scribblings/img/13121248a3c.png deleted file mode 100644 index 840826375e..0000000000 Binary files a/collects/teachpack/2htdp/scribblings/img/13121248a3c.png and /dev/null differ diff --git a/collects/teachpack/2htdp/scribblings/img/13e518b230e.png b/collects/teachpack/2htdp/scribblings/img/13e518b230e.png new file mode 100644 index 0000000000..9c530e40c9 Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/13e518b230e.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/14ecb83eb01.png b/collects/teachpack/2htdp/scribblings/img/14ecb83eb01.png new file mode 100644 index 0000000000..7720ebc694 Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/14ecb83eb01.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/1532990d5cb.png b/collects/teachpack/2htdp/scribblings/img/1532990d5cb.png new file mode 100644 index 0000000000..3e12325e90 Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/1532990d5cb.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/1f5944ec1ed.png b/collects/teachpack/2htdp/scribblings/img/1f5944ec1ed.png new file mode 100644 index 0000000000..4b5ebab9c3 Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/1f5944ec1ed.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/2353974cf1b.png b/collects/teachpack/2htdp/scribblings/img/2353974cf1b.png new file mode 100644 index 0000000000..632e9293ac Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/2353974cf1b.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/25dd3e2d97c.png b/collects/teachpack/2htdp/scribblings/img/25dd3e2d97c.png new file mode 100644 index 0000000000..5a0a08b733 Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/25dd3e2d97c.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/2751bdfe579.png b/collects/teachpack/2htdp/scribblings/img/2751bdfe579.png new file mode 100644 index 0000000000..c2850db3df Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/2751bdfe579.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/2a1f3988f.png b/collects/teachpack/2htdp/scribblings/img/2a1f3988f.png new file mode 100644 index 0000000000..1750445e01 Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/2a1f3988f.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/2b944b7ab91.png b/collects/teachpack/2htdp/scribblings/img/2b944b7ab91.png new file mode 100644 index 0000000000..38db4626cf Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/2b944b7ab91.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/353ed4578.png b/collects/teachpack/2htdp/scribblings/img/353ed4578.png new file mode 100644 index 0000000000..1750445e01 Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/353ed4578.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/6efa12ea15.png b/collects/teachpack/2htdp/scribblings/img/6efa12ea15.png new file mode 100644 index 0000000000..a9b3cfaaa1 Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/6efa12ea15.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/ab1841ea36.png b/collects/teachpack/2htdp/scribblings/img/ab1841ea36.png new file mode 100644 index 0000000000..fa58a6e213 Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/ab1841ea36.png differ diff --git a/collects/teachpack/2htdp/scribblings/img/df251e846.png b/collects/teachpack/2htdp/scribblings/img/df251e846.png deleted file mode 100644 index 3836986460..0000000000 Binary files a/collects/teachpack/2htdp/scribblings/img/df251e846.png and /dev/null differ diff --git a/collects/teachpack/2htdp/scribblings/img/fa1a9f17b6.png b/collects/teachpack/2htdp/scribblings/img/fa1a9f17b6.png new file mode 100644 index 0000000000..a9b3cfaaa1 Binary files /dev/null and b/collects/teachpack/2htdp/scribblings/img/fa1a9f17b6.png differ