练习 2.2

平面上的一个线段可以使用两个点表示,而一个点又可以使用两个坐标来表示。以下是一个示例:

y

5

4
     s       m      e
3    *-------*------*

2

1

0    1    2    3    4    5    x

其中线段的起点 \(s\) 在坐标 \((1,3)\) ,终点 \(e\) 在坐标 \((4,3)\) ,中点 \(m\) 在坐标 \((2.5,3.0)\)

线段的构造函数和选择函数定义如下:

;;; 2-segment-constructor.scm

(define (make-segment start-point end-point)
    (cons start-point end-point))
;;; 2-segment-selector.scm

(define (start-segment seg)
    (car seg))

(define (end-segment seg)
    (cdr seg))

点的构造函数和选择函数定义如下:

;;; 2-point-constructor.scm

(define (make-point x y)
    (cons x y))
;;; 2-point-selector.scm

(define (x-point p)
    (car p))

(define (y-point p)
    (cdr p))

线段的中点可以通过以下公式计算得出:

\[\left(\frac{x_{start} + x_{end}}{2} , \frac{y_{start} + y_{end}}{2}\right)\]

相应的函数定义如下:

;;; 2-midpoint-segment.scm

(load "2-segment-selector.scm")
(load "2-point-constructor.scm")
(load "2-point-selector.scm")

(define (midpoint-segment seg)
    (let ((start (start-segment seg))
          (end (end-segment seg)))
        (make-point (average (x-point start)
                             (x-point end))
                    (average (y-point start)
                             (y-point end)))))

(define (average x y)
    (/ (+ x y)
       2.0))

最后,把题目给出的打印点的函数也敲下来:

;;; 2-print-point.scm

(load "2-point-selector.scm")

(define (print-point p)
    (newline)
    (display "(")
    (display (x-point p))
    (display ",")
    (display (y-point p))
    (display ")"))

测试

1 ]=> (load "2-point-constructor.scm")

;Loading "2-point-constructor.scm"... done
;Value: make-point

1 ]=> (load "2-point-selector.scm")

;Loading "2-point-selector.scm"... done
;Value: y-point

1 ]=> (load "2-segment-constructor.scm")

;Loading "2-segment-constructor.scm"... done
;Value: make-segment

1 ]=> (load "2-segment-selector.scm")

;Loading "2-segment-selector.scm"... done
;Value: end-segment

1 ]=> (load "2-midpoint-segment.scm")

;Loading "2-midpoint-segment.scm"...
;  Loading "2-segment-selector.scm"... done
;  Loading "2-point-constructor.scm"... done
;  Loading "2-point-selector.scm"... done
;... done
;Value: average

1 ]=> (load "2-print-point.scm")

;Loading "2-print-point.scm"...
;  Loading "2-point-selector.scm"... done
;... done
;Value: print-point

1 ]=> (define start (make-point 1 3))

;Value: start

1 ]=> (define end (make-point 4 3))

;Value: end

1 ]=> (define seg (make-segment start end))

;Value: seg

1 ]=> (define mid (midpoint-segment seg))

;Value: mid

1 ]=> (print-point mid)

(2.5,3.)
;Unspecified return value

See also

关于线段中点的更多信息,可以参考维基百科的 midpoint 词条

讨论

blog comments powered by Disqus