#lang scheme (require test-engine/scheme-tests) (require 2htdp/universe) (define (True x) true) ;; all geometric shapes support these methods in all contexts (define shape<%> (interface () area ;; -> Number ;; compute the area of this shape render ;; Scene -> Scene ;; add this shape to the given scene )) ;; a circle (define circle% (class* object% (shape<%>) (init-field x ; Number, x pixels of center from left y ; Number, y pixels of center from top r ; Number, radius c) ; ColorString (define/public (area) (* pi r r)) (define/public (render s) (place-image IMG x y s)) (field [IMG (circle r "solid" c)]) (super-new))) ;; a square parallel to sides of canvas (define square% (class* object% (shape<%>) (init-field x ; Number, x pixels of upper-left from left y ; Number, y pixels of upper-left from top l ; Number, length of one side c) ; ColorString (define/public (area) (* l l)) (define/public (render s) (place-image IMG x y s)) (field [IMG (rectangle l l "solid" c)]) (super-new))) (define s1 (new circle% [x 10][y 20][r 40][c "red"])) (define s2 (new square% [x 80][y 70][l 40][c "blue"])) (define mt (empty-scene 100 100)) (check-within (send s1 area) (* pi 1600) .1) (check-expect (send s2 area) 1600) (check-expect (True (send s1 render mt)) true) (check-expect (True (send s2 render mt)) true) (test)