(define Basic-Shapes
(unit (import)
(export Shape Rectangle Circle Translated)
(define Shape (interface () draw))
(define Rectangle
(class* object% (Shape) (width height)
(public
[draw (lambda (dc x y)
(send dc draw-rectangle x y width height))])
(sequence (super-init))))
(define Circle
(class* object% (Shape) (radius)
(public
[draw (lambda (dc x y)
(send dc draw-ellipse
(- x radius)
(- y radius)
(* 2 radius)
(* 2 radius)))])
(sequence (super-init))))
(define Translated
(class* object% (Shape) (orig-shape dx dy)
(public
[draw (lambda (dc x y)
(send orig-shape draw
dc (+ x dx) (+ y dy)))])
(sequence (super-init))))))
(define Union-Shape
(unit (import Shape)
(export Union)
(define Union
(class* object% (Shape) (left right)
(public
[draw (lambda (dc x y)
(send left draw dc x y)
(send right draw dc x y))])
(sequence (super-init))))))
(define Basic+Union-Shapes
(compound-unit
(import)
(link [S (Basic-Shapes)]
[US (Union-Shape (S Shape))])
(export(S Shape)
(S Rectangle)
(S Circle)
(S Translated)
(US Union))))
(define BB-Shapes
(unit (import Shape Rectangle Circle Translated Union)
(export BB-Shape BB-Rectangle BB-Circle
BB-Translated BB-Union
make-BB BB-left BB-top BB-right BB-bottom)
(define BB-Shape (interface (Shape) bounding-box))
(define-struct BB (left top right bottom))
(define BB-Rectangle
(class* Rectangle (BB-Shape) (width height)
(public
[bounding-box
(lambda () (make-BB 0 0 width height))])
(sequence (super-init width height))))
(define BB-Circle
(class* Circle (BB-Shape) (r)
(public
[bounding-box
(lambda () (make-BB (- r) (- r) r r))])
(sequence (super-init r))))
(define BB-Translated
(class* Translated (BB-Shape) (shape dx dy)
(public
[bounding-box
(lambda ()
(let ([pre-bb (send shape bounding-box)])
(make-BB (+ (BB-left pre-bb) dx)
(+ (BB-top pre-bb) dy)
(+ (BB-right pre-bb) dx)
(+ (BB-bottom pre-bb) dy))))])
(sequence (super-init shape dx dy))))
(define BB-Union
(class* Union (BB-Shape) (left right)
(public
[bounding-box
(lambda ()
(let ([left-bb (send left bounding-box)]
[right-bb (send right bounding-box)])
(make-BB (min (BB-left left-bb) (BB-left right-bb))
(min (BB-top left-bb) (BB-top right-bb))
(max (BB-right left-bb) (BB-right right-bb))
(max (BB-bottom left-bb) (BB-bottom right-bb)))))])
(sequence (super-init left right))))))
(define Basic+Union+BB-Shapes
(compound-unit
(import)
(link [S (Basic+Union-Shapes)]
[BS (BB-Shapes (S Shape)
(S Rectangle)
(S Circle)
(S Translated)
(S Union))])
(export (S Shape)
(BS BB-Shape)
;rename BS's BB-Rectangle to Rectangle, etc.:
(BS (BB-Rectangle Rectangle))
(BS (BB-Circle Circle))
(BS (BB-Translated Translated))
(BS (BB-Union Union))
(BS make-BB)
(BS BB-left)
(BS BB-top)
(BS BB-right)
(BS BB-bottom))))
(define Color-Shape
(unit (import Shape)
(export C-Shape)
(define C-Shape
(class* Shape () args
(rename
[super-draw draw])
(public
[color "BLACK"]
[change-color
(lambda (c)
(set! color c))]
[draw
(lambda (dc x y)
(let ([old-color (send dc get-color)])
(send dc set-color color)
(super-draw dc x y)
(send dc set-color old-color)))])
(sequence
(apply super-init args))))))
(define Basic+Union+BB+Color-Shapes
(compound-unit
(import)
(link [S (Basic+Union+BB-Shapes)]
[CR (Color-Shape (S Rectangle))]
[CC (Color-Shape (S Circle))]
[CT (Color-Shape (S Translated))]
[CU (Color-Shape (S Union))])
(export (S Shape)
(S BB-Shape)
(S make-BB)
(S BB-left)
(S BB-top)
(S BB-right)
(S BB-bottom)
(CR (C-Shape Rectangle))
(CC (C-Shape Circle))
(CT (C-Shape Translated))
(CU (C-Shape Union)))))
![]() | in context | contents | ![]() |