added overlay/align, underlay/align, overlay/align/offset, and underlay/align/offset

This commit is contained in:
Robby Findler 2011-02-20 15:36:13 -06:00
parent 5822f1e95f
commit c1668d894e
4 changed files with 188 additions and 23 deletions

View File

@ -42,9 +42,14 @@ and they all have good sample contracts. (It is amazing what we can do with kids
(provide-primitives (provide-primitives
overlay overlay
overlay/align overlay/align
overlay/offset
overlay/align/offset
overlay/xy overlay/xy
underlay underlay
underlay/align underlay/align
underlay/offset
underlay/align/offset
underlay/xy underlay/xy
beside beside

View File

@ -328,6 +328,33 @@
#t) #t)
(cdr rst)))]))) (cdr rst)))])))
(define/chk (overlay/offset image1 dx dy image2)
(overlay/offset/internal 'middle 'middle image1 dx dy image2))
(define/chk (overlay/align/offset x-place y-place image1 dx dy image2)
(overlay/offset/internal x-place y-place image1 dx dy image2))
(define/chk (underlay/offset image1 dx dy image2)
(overlay/offset/internal 'middle 'middle image2 (- dx) (- dy) image1))
(define/chk (underlay/align/offset x-place y-place image1 dx dy image2)
(overlay/offset/internal x-place y-place image2 (- dx) (- dy) image1))
(define (overlay/offset/internal x-place y-place fst orig-dx orig-dy snd)
(let* ([fst-x-spot (find-x-spot x-place fst)]
[fst-y-spot (find-y-spot y-place fst)]
[snd-x-spot (find-x-spot x-place snd)]
[snd-y-spot (find-y-spot y-place snd)]
[dx (+ (- fst-x-spot snd-x-spot) orig-dx)]
[dy (+ (- fst-y-spot snd-y-spot) orig-dy)])
(overlay/δ fst
(if (< dx 0) (- dx) 0)
(if (< dy 0) (- dy) 0)
snd
(if (< dx 0) 0 dx)
(if (< dy 0) 0 dy)
#t)))
; ;
; ;
@ -403,20 +430,6 @@
(if (< dy 0) (- dy) 0) (if (< dy 0) (- dy) 0)
#f)))) #f))))
(define (overlay/offset image1 dx dy image2)
(overlay/offset/internal image1 dx dy image2 'middle 'middle))
(define (overlay/offset/internal image orig-dx orig-dy scene x-place y-place)
(let ([dx (- orig-dx (find-x-spot x-place image))]
[dy (- orig-dy (find-y-spot y-place image))])
(overlay/δ image
(if (< dx 0) 0 dx)
(if (< dy 0) 0 dy)
scene
(if (< dx 0) (- dx) 0)
(if (< dy 0) (- dy) 0)
#f)))
(define/chk (scene+line image x1 y1 x2 y2 color) (define/chk (scene+line image x1 y1 x2 y2 color)
(let* ([dx (abs (min 0 x1 x2))] (let* ([dx (abs (min 0 x1 x2))]
[dy (abs (min 0 y1 y2))]) [dy (abs (min 0 y1 y2))])
@ -1396,9 +1409,14 @@
(provide overlay (provide overlay
overlay/align overlay/align
overlay/offset
overlay/align/offset
overlay/xy overlay/xy
underlay underlay
underlay/align underlay/align
underlay/align/offset
underlay/offset
underlay/xy underlay/xy
beside beside

View File

@ -675,12 +675,63 @@
(make-bb 100 100 100) (make-bb 100 100 100)
#f)) #f))
(test (overlay/offset (rectangle 10 100 'solid 'red)
0 0
(rectangle 100 10 'solid 'blue))
=>
(overlay (rectangle 10 100 'solid 'red)
(rectangle 100 10 'solid 'blue)))
(test (overlay/align/offset "center" "center"
(rectangle 10 100 'solid 'red)
0 0
(rectangle 100 10 'solid 'blue))
=>
(overlay/align "center" "center"
(rectangle 10 100 'solid 'red)
(rectangle 100 10 'solid 'blue)))
(test (overlay/align/offset "right" "top"
(rectangle 10 100 'solid 'red)
0 0
(rectangle 100 10 'solid 'blue))
=>
(overlay/align "right" "top"
(rectangle 10 100 'solid 'red)
(rectangle 100 10 'solid 'blue)))
(test (underlay/offset (rectangle 10 100 'solid 'red)
0 0
(rectangle 100 10 'solid 'blue))
=>
(underlay (rectangle 10 100 'solid 'red)
(rectangle 100 10 'solid 'blue)))
(test (underlay/align/offset "center" "center"
(rectangle 10 100 'solid 'red)
0 0
(rectangle 100 10 'solid 'blue))
=>
(underlay/align "center" "center"
(rectangle 10 100 'solid 'red)
(rectangle 100 10 'solid 'blue)))
(test (underlay/align/offset "left" "bottom"
(rectangle 10 100 'solid 'red)
0 0
(rectangle 100 10 'solid 'blue))
=>
(underlay/align "left" "bottom"
(rectangle 10 100 'solid 'red)
(rectangle 100 10 'solid 'blue)))
(test (empty-scene 185 100) (test (empty-scene 185 100)
=> =>
(crop 0 0 185 100 (crop 0 0 185 100
(overlay (rectangle 185 100 'outline (pen "black" 2 'solid 'round 'round)) (overlay (rectangle 185 100 'outline (pen "black" 2 'solid 'round 'round))
(rectangle 185 100 'solid 'white)))) (rectangle 185 100 'solid 'white))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; testing normalization ;; testing normalization

View File

@ -660,6 +660,49 @@ the @scheme[point-count] argument determines how many points the star has.
} }
@defproc[(overlay/offset [i1 image?] [x real?] [y real?] [i2 image?]) image?]{
Just like @racket[overlay], this function lines up its image arguments on top of
each other. Unlike @racket[overlay], it moves @racket[i2] by @racket[x] pixels to
the right and @racket[y] down before overlaying them.
@image-examples[(overlay/offset (circle 40 "solid" "red")
10 10
(circle 40 "solid" "blue"))
(overlay/offset (overlay/offset (rectangle 60 20 "solid" "black")
-50 0
(circle 20 "solid" "darkorange"))
70 0
(circle 20 "solid" "darkorange"))
(overlay/offset
(overlay/offset (circle 30 'solid (color 0 150 0 127))
26 0
(circle 30 'solid (color 0 0 255 127)))
0 26
(circle 30 'solid (color 200 0 0 127)))]
}
@defproc[(overlay/align/offset [x-place x-place?] [y-place y-place?] [i1 image?] [x real?] [y real?] [i2 image?])
image?]{
Overlays image @racket[i1] on top of @racket[i2], using @racket[x-place] and @racket[y-place] as the
starting points for the overlaying, and then adjusts @racket[i2] by @racket[x] to the right and
@racket[y] pixels down.
This function combines the capabilities of @racket[overlay/align] and @racket[overlay/offset].
@image-examples[(overlay/align/offset
"right" "bottom"
(star-polygon 20 20 3 "solid" "navy")
10 10
(circle 30 "solid" "cornflowerblue"))
(overlay/align/offset
"left" "bottom"
(star-polygon 20 20 3 "solid" "navy")
-10 10
(circle 30 "solid" "cornflowerblue"))]
}
@defproc[(overlay/xy [i1 image?] [x real?] [y real?] [i2 image?]) image?]{ @defproc[(overlay/xy [i1 image?] [x real?] [y real?] [i2 image?]) image?]{
Constructs an image by overlaying @racket[i1] on top of @racket[i2]. Constructs an image by overlaying @racket[i1] on top of @racket[i2].
The images are initially lined up on their upper-left corners and The images are initially lined up on their upper-left corners and
@ -668,6 +711,8 @@ the @scheme[point-count] argument determines how many points the star has.
This is the same as @racket[(underlay/xy i2 (- x) (- y) i1)]. This is the same as @racket[(underlay/xy i2 (- x) (- y) i1)].
See also @racket[overlay/offset] and @racket[underlay/offset].
@image-examples[(overlay/xy (rectangle 20 20 "outline" "black") @image-examples[(overlay/xy (rectangle 20 20 "outline" "black")
20 0 20 0
(rectangle 20 20 "outline" "black")) (rectangle 20 20 "outline" "black"))
@ -684,13 +729,7 @@ the @scheme[point-count] argument determines how many points the star has.
(ellipse 10 10 "solid" "forestgreen")) (ellipse 10 10 "solid" "forestgreen"))
20 20
15 15
(ellipse 10 10 "solid" "forestgreen")) (ellipse 10 10 "solid" "forestgreen"))]
(overlay/xy
(overlay/xy (circle 30 'solid (color 0 150 0 127))
26 0
(circle 30 'solid (color 0 0 255 127)))
13 26
(circle 30 'solid (color 200 0 0 127)))]
} }
@defproc[(underlay [i1 image?] [i2 image?] [is image?] ...) image?]{ @defproc[(underlay [i1 image?] [i2 image?] [is image?] ...) image?]{
@ -741,6 +780,56 @@ the @scheme[point-count] argument determines how many points the star has.
} }
@defproc[(underlay/offset [i1 image?] [x real?] [y real?] [i2 image?]) image?]{
Just like @racket[overlay], this function lines up its image arguments on top of
each other. Unlike @racket[overlay], it moves @racket[i2] by @racket[x] pixels to
the right and @racket[y] down before overlaying them.
@image-examples[(underlay/offset (circle 40 "solid" "red")
10 10
(circle 40 "solid" "blue"))
(underlay/offset (circle 40 "solid" "gray")
0 -10
(underlay/offset (circle 10 "solid" "navy")
-30 0
(circle 10 "solid" "navy")))]
}
@defproc[(underlay/align/offset [x-place x-place?] [y-place y-place?] [i1 image?] [x real?] [y real?] [i2 image?])
image?]{
Underlays image @racket[i1] underneath @racket[i2], using @racket[x-place] and @racket[y-place] as the
starting points for the combination, and then adjusts @racket[i2] by @racket[x] to the right and
@racket[y] pixels down.
This function combines the capabilities of @racket[underlay/align] and @racket[underlay/offset].
@image-examples[(underlay/align/offset
"right" "bottom"
(star-polygon 20 20 3 "solid" "navy")
10 10
(circle 30 "solid" "cornflowerblue"))
(underlay/align/offset
"right" "bottom"
(underlay/align/offset
"left" "bottom"
(underlay/align/offset
"right" "top"
(underlay/align/offset
"left" "top"
(rhombus 120 90 "solid" "navy")
16 16
(star-polygon 20 11 3 "solid" "cornflowerblue"))
-16 16
(star-polygon 20 11 3 "solid" "cornflowerblue"))
16 -16
(star-polygon 20 11 3 "solid" "cornflowerblue"))
-16 -16
(star-polygon 20 11 3 "solid" "cornflowerblue"))]
}
@defproc[(underlay/xy [i1 image?] [x real?] [y real?] [i2 image?]) image?]{ @defproc[(underlay/xy [i1 image?] [x real?] [y real?] [i2 image?]) image?]{
Constructs an image by underlaying @racket[i1] underneath @racket[i2]. Constructs an image by underlaying @racket[i1] underneath @racket[i2].
The images are initially lined up on their upper-left corners and The images are initially lined up on their upper-left corners and
@ -749,6 +838,8 @@ the @scheme[point-count] argument determines how many points the star has.
This is the same as @racket[(overlay/xy i2 (- x) (- y) i1)]. This is the same as @racket[(overlay/xy i2 (- x) (- y) i1)].
See also @racket[underlay/offset] and @racket[overlay/offset].
@image-examples[(underlay/xy (rectangle 20 20 "outline" "black") @image-examples[(underlay/xy (rectangle 20 20 "outline" "black")
20 0 20 0
(rectangle 20 20 "outline" "black")) (rectangle 20 20 "outline" "black"))