問題 2.3

;問題の意図が良くわからない。
(define (square x) (* x x))
(define (average x y) (/ (+ x y) 2))
(define (make-segment s e) (cons s e))
(define (start-segment seg) (car seg))
(define (end-segment seg) (cdr seg))
(define (make-point x y) (cons x y))
(define (x-point p) (car p))
(define (y-point p) (cdr p))
(define (print-point p)
  (display "(")
  (display (x-point p))
  (display ",")
  (display (y-point p))
  (display ")")
  (newline))

;2点間の距離をとる関数
(define (distance p1 p2)
  (sqrt (+ (square (- (x-point p1) (x-point p2)))
           (square (- (y-point p1) (y-point p2))))))

;線の長さをとる関数
(define (how-long s)
  (distance (start-segment s) (end-segment s)))

;2つの点を取る長方形
;角度のついたものは考えていないので完全ではない
(define (make-rectangle1 p1 p2) (cons p1 p2))

(define (left-top-rectangle r) (car r))
(define (right-top-rectangle r) (make-point (x-point (cdr r)) (y-point (car r))))
(define (right-bottom-rectangle r) (cdr r))
(define (left-bottom-rectangle r) (make-point (x-point (car r)) (y-point (cdr r))))
;---壁
(define (width-rectangle r) (distance (left-top-rectangle r) (right-top-rectangle r)))
(define (height-rectangle r) (distance (right-top-rectangle r) (right-bottom-rectangle r)))
;---壁
(define (perimeter r)
  (+ (* (width-rectangle r) 2)
     (* (height-rectangle r) 2)))
(define (area r)
  (* (width-rectangle r) (height-rectangle r)))

;では、ここまで出来た状態でmake-rectangleだけ変えてみる。


;2本の直線をとる長方形
;長方形になるかのチェックは行わない。完全ではない。
;s1のstartがleft-top,s2のstartがright-top,両者の交点がright-topと限定する。
(define (make-rectangle2 s1 s2)
  (cons (start-segment s1) (end-segment s2)))

;そして、両者で同じものが出来れば正解。
(define p1 (make-point 1 1))
(define p2 (make-point 3 4))

(define r1 (make-rectangle1 p1 p2))
(define r2 (make-rectangle2 (make-segment p1 (make-point 3 1)) (make-segment (make-point 3 1) p2)))

(perimeter r1)
;->10
(area r1)
;->6
(perimeter r2)
;->10
(area r2)
;->6

;ok?こんな感じ??