;;;; geobox.scm ;;;; Kon Lovett, May '17 (module geobox (;export make-geobox geobox? check-geobox error-geobox geobox-minimum geobox-maximum geobox= geobox< geobox> geobox<= geobox>= geopoint-within-box? ) (import scheme chicken) (use type-checks) (use geopoint) ;;; ;; (: *make-geobox ((struct geopoint) (struct geopoint) --> (struct geobox))) (: geobox? (* --> boolean)) (: *geobox-minimum ((struct geobox) --> (struct geopoint))) (: *geobox-maximum ((struct geobox) --> (struct geopoint))) (define-record-type geobox (*make-geobox min max) geobox? (min *geobox-minimum) (max *geobox-maximum) ) ;(: make-geobox (or ((struct geopoint) (struct geopoint) --> (struct geobox)) (number number number number --> (struct geobox)))) (define make-geobox (case-lambda ((min-pnt max-pnt) (make-geobox* 'make-geobox min-pnt max-pnt) ) ((minLat minLon maxLat maxLon) (make-geobox* 'make-geobox (make-geopoint minLat minLon) (make-geopoint maxLat maxLon)) ) ) ) (: make-geobox* (symbol (struct geopoint) (struct geopoint) --> (struct geobox))) (define (make-geobox* loc min-pnt max-pnt) (check-geopoint loc min-pnt) (check-geopoint loc max-pnt) (unless (and (geopoint-above? min-pnt max-pnt) (geopoint-left? min-pnt max-pnt) ) (error loc "minimum-geopoint > maximum-geopoint" min-pnt max-pnt) ) (*make-geobox min-pnt max-pnt) ) (define-check+error-type geobox) (: geobox-minimum ((struct geobox) --> (struct geopoint))) (define (geobox-minimum gb) (*geobox-minimum (check-geobox 'geobox-minimum gb)) ) (: geobox-maximum ((struct geobox) --> (struct geopoint))) (define (geobox-maximum gb) (*geobox-maximum (check-geobox 'geobox-maximum gb)) ) ;; (: geobox= ((struct geobox) (struct geobox) --> boolean)) (define (geobox= gb1 gb2) (check-geobox 'geobox= gb1) (check-geobox 'geobox= gb2) (and (geopoint= (*geobox-minimum gb1) (*geobox-minimum gb2)) (geopoint= (*geobox-maximum gb1) (*geobox-maximum gb2)) ) ) (: geobox< ((struct geobox) (struct geobox) --> boolean)) (define (geobox< gb1 gb2) (check-geobox 'geobox< gb1) (check-geobox 'geobox< gb2) (and (geopoint< (*geobox-minimum gb1) (*geobox-minimum gb2)) (geopoint< (*geobox-maximum gb1) (*geobox-maximum gb2)) ) ) (: geobox> ((struct geobox) (struct geobox) --> boolean)) (define (geobox> gb1 gb2) (check-geobox 'geobox> gb1) (check-geobox 'geobox> gb2) (and (geopoint> (*geobox-minimum gb1) (*geobox-minimum gb2)) (geopoint> (*geobox-maximum gb1) (*geobox-maximum gb2)) ) ) (: geobox<= ((struct geobox) (struct geobox) --> boolean)) (define (geobox<= gb1 gb2) (check-geobox 'geobox<= gb1) (check-geobox 'geobox<= gb2) (and (geopoint<= (*geobox-minimum gb1) (*geobox-minimum gb2)) (geopoint<= (*geobox-maximum gb1) (*geobox-maximum gb2)) ) ) (: geobox>= ((struct geobox) (struct geobox) --> boolean)) (define (geobox>= gb1 gb2) (check-geobox 'geobox>= gb1) (check-geobox 'geobox>= gb2) (and (geopoint>= (*geobox-minimum gb1) (*geobox-minimum gb2)) (geopoint>= (*geobox-maximum gb1) (*geobox-maximum gb2)) ) ) (: geopoint-within-box? ((struct geobox) (struct geobox) --> boolean)) (define (geopoint-within-box? gp gb) (and (geopoint<= (*geobox-minimum gb) gp) (geopoint>= (*geobox-maximum gb) gp) ) ) ) ;geobox