zoukankan      html  css  js  c++  java
  • SICP_2.50-2.51

     1 #lang sicp
     2 
     3 (#%require sicp-pict)
     4 
     5 (define (origin-frame frame)
     6   (car frame))
     7 
     8 (define (edge1-frame frame)
     9   (cadr frame))
    10 
    11 (define (edge2-frame frame)
    12   (caddr frame))
    13 
    14 (define (make-vect a b)
    15   (cons a b))
    16 
    17 (define (xcor-vect v)
    18   (car v))
    19 
    20 (define (ycor-vect v)
    21   (cdr v))
    22 
    23 (define (add-vect v1 v2)
    24   (make-vect (+ (xcor-vect v1)
    25                 (xcor-vect v2))
    26              (+ (ycor-vect v1)
    27                 (ycor-vect v2))))
    28 
    29 (define (sub-vect v1 v2)
    30   (make-vect (- (xcor-vect v1)
    31                 (xcor-vect v2))
    32              (- (ycor-vect v1)
    33                 (ycor-vect v2))))
    34 
    35 (define (scale-vect s v1)
    36   (make-vect (* s (xcor-vect v1))
    37              (* s (ycor-vect v1))))
    38 
    39 (define (frame-coord-map frame)
    40   (lambda (v)
    41     (add-vect
    42      (origin-frame frame)
    43      (add-vect (scale-vect (xcor-vect v)
    44                            (edge1-frame frame))
    45                (scale-vect (ycor-vect v)
    46                            (edge2-frame frame))))))
    47 ;;;;;;;;;;;;;;;;;;;2.50
    48 (define (transform-painter painter origin corner1 corner2)
    49   (lambda (frame)
    50     (let ((m (frame-coord-map frame)))
    51       (let ((new-origin (m origin)))
    52         (painter
    53          (make-frame new-origin
    54                      (sub-vect (m corner1) new-origin)
    55                      (sub-vect (m corner2) new-origin)))))))
    56 
    57 (define (flip-horiz painter)
    58   (transform-painter painter
    59                      (make-vect 1.0 0.0)
    60                      (make-vect 0.0 0.0)
    61                      (make-vect 1.0 1.0)))
    62 
    63 (define (roate90 painter)
    64   (transform-painter painter
    65                      (make-vect 1.0 0.0)
    66                      (make-vect 1.0 1.0)
    67                      (make-vect 0.0 0.0)))
    68 
    69 (define (roate180 painter)
    70   (transform-painter painter
    71                      (make-vect 1.0 1.0)
    72                      (make-vect 0.0 1.0)
    73                      (make-vect 1.0 0.0)))
    74 
    75 (define (roate270 painter)
    76   (transform-painter painter
    77                      (make-vect 0.0 1.0)
    78                      (make-vect 0.0 0.0)
    79                      (make-vect 1.0 1.0)))
    80 
    81 ;;;;;;;;;;;;;;;;;2.51
    82 (define (my-below painter1 painter2)
    83   (let ((split-point (make-vect 0.0 0.5)))
    84     (let ((paint-up
    85            (transform-painter painter2
    86                                split-point
    87                               (make-vect 1.0 0.5)
    88                               (make-vect 0.0 1.0)))
    89           (paint-bottom
    90            (transform-painter painter1
    91                               (make-vect 0.0 0.0)
    92                                (make-vect 1.0 0.0)
    93                                split-point)))
    94       (lambda (frame)
    95         (paint-up frame)
    96         (paint-bottom frame)))))
    97 
    98 (define (my-below2 painter1 painter2)
    99   (roate270 (beside (roate90 painter1) (roate90 painter2))))

    1.理解painter是个过程接受frame参数,即在frame中画painter

    2.frame-coord-map 中将一个单位正方形中的点映射到一个新框架中

    3.transform-painter 则是将painter映射到一个新框架中返回的也是一个过程,也可以理解为返回一个painter

    Yosoro
  • 相关阅读:
    Docker 安装 MySQL
    Docker安装
    Thymeleaf语法总结
    SpringBoot总结之事务和AOP
    SpringBoot总结之Spring Data Jpa
    SpringBoot总结之属性配置
    Spring总结之SpringMvc下
    Spring总结之SpringMvc上
    Spring总结之事务
    在什么情况下使用@ResponseBody 注解?
  • 原文地址:https://www.cnblogs.com/tclan126/p/6431103.html
Copyright © 2011-2022 走看看