Scheme 为什么我下面的过程在SICP图片语言中的实现表现得很奇怪?
我一直在做SICP图片语言示例练习2.51的第一部分。下面是我的解决方案和得到的结果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
#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) ; 谢谢你提供的信息。在我的示例中,这是否意味着问题出现在框架坐标贴图过程中?我将交换“绘制底部”和“在底部绘制顶部”。