diff --git a/quad/quad2/main.rkt b/quad/quad2/main.rkt index 9c83feaf..098e141d 100644 --- a/quad/quad2/main.rkt +++ b/quad/quad2/main.rkt @@ -41,20 +41,25 @@ (error 'postcondition-failed)) res)) -(define (has-position? q) (not (eq? ($quad-posn q) #false))) - (struct $rect (x y width height) #:transparent #:mutable) +(define (min-x rect) ($rect-x rect)) +(define (max-x rect) (+ (min-x rect) ($rect-width rect))) +(define (min-y rect) ($rect-y rect)) +(define (max-y rect) (+ (min-y rect) ($rect-height rect))) + +(define/contract (rect-contains-posn? rect posn) + ($rect? $posn? . -> . boolean?) + (and (<= (min-x rect) ($posn-x posn) (max-x rect)) + (<= (min-y rect) ($posn-y posn) (max-y rect)))) + (define/contract (rect-contains-rect? outer inner) ($rect? $rect? . -> . boolean?) - (define (min-x rect) ($rect-x rect)) - (define (max-x rect) (+ (min-x rect) ($rect-width rect))) - (define (min-y rect) ($rect-y rect)) - (define (max-y rect) (+ (min-y rect) ($rect-height rect))) - (and (<= (min-x outer) (min-x inner) (max-x inner) (max-x outer)) - (<= (min-y outer) (min-y inner) (max-y inner) (max-y outer)))) + (and (rect-contains-posn? outer ($posn (min-x inner) (min-y inner))) + (rect-contains-posn? outer ($posn (max-x inner) (max-y inner))))) +(define (has-position? q) (not (eq? ($quad-posn q) #false))) (define-pass (layout qs) #:precondition (λ (qs) (andmap (λ (q) (not (has-position? q))) qs)) #:postcondition (λ (qs) (andmap has-position? qs)) @@ -62,7 +67,7 @@ (define (quad-fits? q posn) (define q-size (size q)) (define quad-rect ($rect ($posn-x posn) ($posn-y posn) - ($posn-x q-size) ($posn-y q-size))) + ($posn-x q-size) ($posn-y q-size))) (and (rect-contains-rect? frame quad-rect) posn)) (for/fold ([posn ($posn 0 0)] #:result qs)