#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) ;; ============================================================================= ;; NO NEED TO REVISE THE ABOVE ;; orthogonal triangle, with two sides parallel to vertical/horizontal of canvas (define triangle% (class* object% (shape<%>) (init-field x ; Number, x pixels of right-angle point from left y ; Number, y pixels of right-angle point from top v ; Number, length of vertical side (negative means downward) h ; Number, length of horizontal side (negative means leftward) c) (define/public (render s) (local ((define horizontal (scene+line s x y (+ x h) y c)) (define vertical (scene+line horizontal x y x (+ y v) c)) (define diagonal (scene+line vertical (+ x h) y x (+ y v) c))) diagonal)) (define/public (area) (/ (* (abs v) (abs h)) 2)) (super-new))) (define s3 (new triangle% [x 30][y 90][v -10][h -20][c "green"])) (check-expect (send s3 area) 100) (check-expect (True (send s3 render mt)) true) (test)