Scheme 为什么我下面的过程在SICP图片语言中的实现表现得很奇怪?

Scheme 为什么我下面的过程在SICP图片语言中的实现表现得很奇怪?,scheme,racket,sicp,Scheme,Racket,Sicp,我一直在做SICP图片语言示例练习2.51的第一部分。下面是我的解决方案和得到的结果 #lang sicp (#%require sicp-pict) (define (transform-painter painter origin corner1 corner2) (lambda (frame) (let ((m (frame-coord-map frame))) (let ((new-origin (m origin))) (painter

我一直在做SICP图片语言示例练习2.51的第一部分。下面是我的解决方案和得到的结果

#lang sicp
(#%require sicp-pict)
(define (transform-painter painter origin corner1 corner2)
  (lambda (frame)
    (let ((m (frame-coord-map frame)))
      (let ((new-origin (m origin)))
        (painter
         (make-frame new-origin
                     (vector-sub (m corner1) new-origin)
                     (vector-sub (m corner2) new-origin)))))))

(define (below painter1 painter2)
  (let ((split-point (make-vect 0.0 0.5)))
    (let ((paint-bottom
           (transform-painter painter1
                              split-point
                              (make-vect 1.0 0.5)
                              (make-vect 0.0 1.0)))
          (paint-top
           (transform-painter painter2
                              (make-vect 0.0 0.0)
                              (make-vect 1.0 0.0)
                              split-point)))
      (lambda (frame)
        (paint-top frame)
        (paint-bottom frame)))))

(define einstein-below-diagonal-shading (below einstein diagonal-shading))
(paint einstein-below-diagonal-shading)


我希望通过这段代码,爱因斯坦的图像将按照练习要求在对角线阴影下渲染。如代码中所示,第一个绘制者用于将原点移动到(0,0.5)、第一条边移动到(1,0.5)和第二条边移动到(0,1)的变换,这与图像的底部相对应。然而,第二位画家被安置在那里!也许我遗漏了一些非常明显的东西,但我不明白为什么它会以相反的方式运行。有人能解释一下我做错了什么吗?

是不是y轴向上

如果我们更改
transform painter
以显示新的原点和帧:

(define (transform-painter painter origin corner1 corner2)
  (lambda (frame)
    (let ((m (frame-coord-map frame)))
      (let ((new-origin (m origin)))
        (display (list origin corner1 corner2))       (newline)
        (display new-origin)                          (newline)
        (display (vector-sub (m corner1) new-origin)) (newline)
        (display (vector-sub (m corner2) new-origin)) (newline)
        (painter
         (make-frame new-origin
                     (vector-sub (m corner1) new-origin)
                     (vector-sub (m corner2) new-origin)))))))
您的示例的输出是:

((0.0 . 0.0) (1.0 . 0.0) (0.0 . 0.5))
(0.0 . 0.0)                              ; <- new origin for top
(128.0 . 0.0)
(0.0 . 64.0)                  

((0.0 . 0.5) (1.0 . 0.5) (0.0 . 1.0))
(0.0 . 64.0)                             ; <- new origin for botton
(128.0 . 0.0)
(0.0 . 64.0)
((0.0.0.0)(1.0.0.0)(0.0.0.5))

(0.0 . 0.0) ; 谢谢你提供的信息。在我的示例中,这是否意味着问题出现在框架坐标贴图过程中?我将交换“绘制底部”和“在底部绘制顶部”。