在 SICP 中的图片语言中,我无法理解该transform-painter
过程的工作原理:
(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
(sub-vect (m corner1) new-origin)
(sub-vect (m corner2) new-origin)))))))
特别是为什么新原点对参数帧的边缘映射的向量减法是必要的。我会认为新角的映射,即(m corner1)
和(m corner2)
,可以作为变换框架的新边缘。
我做了一些计算,我想知道我在哪里搞混了。举flip-vert
个例子,
(define (flip-vert painter)
(transform-painter painter
(make-vect 0.0 1.0) ; new origin
(make-vect 1.0 1.0) ; new end of edge1
(make-vect 0.0 0.0))) ; new end of edge2
让flip-vert
具有以下尺寸的框架作为参数,
原点 = (0, 0), 边 1 = (4, 0), 边 2 = (0, 4)
因此,映射公式将变为(0,0) + x(4,0) + y(0, 4)
。
在, , 和作为参数传递给flip-vert
,和的情况下。origin
corner1
corner2
transform-painter
(0,1)
(1,1)
(0,0)
所以在把它们放入映射公式之后,一个接一个,我们得到结果
新原点 = (0,0)+0*(4,0)+1*(0,4) = (0,4)
映射角1 = (0,0)+1*(4,0)+1*(0,4) = (4,4)
映射角2 = (0,0)
现在transform-painter
获取最后两个结果并将它们减去new-origin
以构建新框架,从而得到具有以下尺寸的框架。
原点 = (0,4),新角 1 = (4,0),新角 2 = (0,-4)
在坐标平面上查看这些点,结果似乎不正确,而在减法发生之前的原始角结果,确实如此。我究竟做错了什么?