平面上的一个线段可以使用两个点表示,而一个点又可以使用两个坐标来表示。以下是一个示例:
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))
线段的中点可以通过以下公式计算得出:
相应的函数定义如下:
;;; 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 词条 。