; ex 2.2

; point
(define (make-point x y) (cons x y))
(define (x-point p) (car p))
(define (y-point p) (cdr p))
(define (point2str p)
  (format "(~a,~a)"
          (x-point p) (y-point p)))
(define (print-point p)
  (newline)
  (display (point2str p)))

; segment
(define (make-segment p1 p2) (cons p1 p2))
(define (start-segment s) (car s))
(define (end-segment s) (cdr s))
(define (segment2str s)
  (format "~a->~a"
          (point2str (start-segment s))
          (point2str (end-segment s))))
(define (print-segment s)
  (newline)
  (display (segment2str s)))

(define (midpoint-segment s)
  (define (average a b) (/ (+ a b) 2))
  (let ((p1 (start-segment s))
        (p2 (end-segment s)))
    (make-point (average (x-point p1) (x-point p2))
                (average (y-point p1) (y-point p2)))))

; ex 2.3

; rect

(define (make-rect tl-point br-point) (cons tl-point br-point))
;(define (make-rect p1 p2) (cons p1 p2))
(define (top-left-rect r) (car r))
(define (top-right-rect r)
  (make-point (x-point (cdr r)) (y-point (car r))))
(define (bottom-left-rect r)
  (make-point (x-point (car r)) (y-point (cdr r))))
(define (bottom-right-rect r) (cdr r))
;(define (top-left-rect r)
;  (let ((x1 (x-point (car r)))
;        (y1 (y-point (car r)))
;        (x2 (x-point (cdr r)))
;        (y2 (y-point (cdr r))))
;    (make-point (min x1 x2) (max y1 y2))))
;(define (top-right-rect r)
;  (let ((x1 (x-point (car r)))
;        (y1 (y-point (car r)))
;        (x2 (x-point (cdr r)))
;        (y2 (y-point (cdr r))))
;    (make-point (max x1 x2) (max y1 y2))))
;(define (bottom-left-rect r)
;  (let ((x1 (x-point (car r)))
;        (y1 (y-point (car r)))
;        (x2 (x-point (cdr r)))
;        (y2 (y-point (cdr r))))
;    (make-point (min x1 x2) (min y1 y2))))
;(define (bottom-right-rect r)
;  (let ((x1 (x-point (car r)))
;        (y1 (y-point (car r)))
;        (x2 (x-point (cdr r)))
;        (y2 (y-point (cdr r))))
;    (make-point (max x1 x2) (min y1 y2))))
(define (rect2str r)
  (format "tl=~a\ntr=~a\nbl=~a\nbr=~a"
          (top-left-rect r)
          (top-right-rect r)
          (bottom-left-rect r)
          (bottom-right-rect r)))
(define (print-rect r)
  (newline)
  (display (rect2str r)))

(define (width-rect r)
  (- (x-point (top-right-rect r)) (x-point (top-left-rect r))))
(define (height-rect r)
  (- (y-point (top-left-rect r)) (y-point (bottom-left-rect r))))
(define (area-rect r)
  (* (width-rect r) (height-rect r)))
(define (girth-rect r)
  (+ (* (width-rect r) 2) (* (height-rect r) 2)))
AND