练习 2.50

以数字 7 为例子,它在框架上的表示如下:

  e2
0.0 , 1.0
   ^
   |  ********
   |        *
   |       *
   |      *
   |     *
   +------------> 1.0 , 0.0
0.0 , 0.0         e1
origin

使用书本 94 页提供的 flip-vert 函数:

;;; p94-flip-vert.scm

(define (flip-vect painter)
    (transform-painter painter
                       (make-vect 0.0 1.0)
                       (make-vect 1.0 1.0)
                       (make-vect 0.0 0.0)))

可以将通过翻转框架来画出一个水平翻转的 7 :

origin
0.0 , 1.0            e1
   +------------> 1.0 , 1.0
   |     *
   |      *
   |       *
   |        *
   |  ********
   v
0.0 , 0.0
  e2

使用书本 94 页提供的 rotate90 函数:

;;; p94-rotate90.scm

(define (rotate90 painter)
    (transform-painter painter
                       (make-vect 1.0 0.0)
                       (make-vect 1.0 1.0)
                       (make-vect 0.0 0.0)))

可以将框架逆时针旋转 90 度:

               e1
             1.0 , 1.0
                ^
    ****        |
    *   ****    |
    *        ** |
    *           |
                |
   <------------+
0.0 , 0.0      1.0 , 0.0
  e2          origin

模仿以上的两个例子,现在可以给出变换 flip-horizrotate180rotate270

flip-horiz

以下是使用 flip-horiz 对画出数字 7 的画家进行水平翻转的过程:

   e2                                                     e2
0.0 , 1.0                                              1.0 , 1.0
   ^                                                       ^
   |  ********                                   ********  |
   |        *            flip-horiz               *        |
   |       *            =============>             *       |
   |      *                                         *      |
   |     *                                           *     |
   +------------> 1.0 , 0.0         0.0 , 0.0 <------------+
0.0 , 0.0            e1                e1              1.0 , 0.0
origin                                                  origin

以下是 flip-horiz 的定义:

;;; 50-flip-horiz.scm

(define (flip-horiz painter)
    (transform-painter painter
                       (make-vect 1.0 0.0)
                       (make-vect 0.0 0.0)
                       (make-vect 1.0 1.0)))

rotate180

以下是使用 rotate180 对画出数字 7 的画家进行逆时针 180 度翻转的过程:

   e2                                      e1           origin
0.0 , 1.0                               0.0 , 1.0      1.0 , 1.0
   ^                                         <------------+
   |  ********                                      *     |
   |        *            rotate180                 *      |
   |       *            =============>            *       |
   |      *                                      *        |
   |     *                                      ********  |
   +------------> 1.0 , 0.0                               v
0.0 , 0.0         e1                                  1.0 , 0.0
origin                                                   e2

以下是 rotate180 的定义:

;;; 50-rotate180.scm

(define (rotate180 painter)
    (transform-painter painter
                       (make-vect 1.0 1.0)
                       (make-vect 0.0 1.0)
                       (make-vect 1.0 0.0)))

rotate270

以下是使用 rotate270 对画出数字 7 的画家进行逆时针 270 度翻转的过程:

   e2                                      origin
0.0 , 1.0                                0.0 , 1.0             e2
   ^                                         +------------> 1.0 , 1.0
   |  ********                               |
   |        *            rotate270           |           *
   |       *            =============>       | ***       *
   |      *                                  |     ***   *
   |     *                                   |        ****
   +------------> 1.0 , 0.0                  v
0.0 , 0.0         e1                     0.0 , 0.0
origin                                       e1

以下是 rotate270 的定义:

;;; 50-rotate270.scm

(define (rotate270 painter)
    (transform-painter painter
                       (make-vect 0.0 1.0)
                       (make-vect 0.0 0.0)
                       (make-vect 1.0 1.0)))

讨论

blog comments powered by Disqus