In the picture language in 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),Edge1 =(4,0),Edge2 =(0,4)
因此,映射公式将变为(0,0) + x(4,0) + y(0, 4)
。
如果flip-vert
origin
,corner1
和corner2
作为transform-painter
的参数传递为(0,1)
,{{1}分别和(1,1)
。
因此,在将它们一个接一个地放入映射公式后,我们得到结果
new-origin =(0,0)+ 0 *(4,0)+ 1 *(0,4)=(0,4)
mapped-corner1 =(0,0)+ 1 *(4,0)+ 1 *(0,4)=(4,4)
mapped-corner2 =(0,0)
现在(0,0)
获取最后两个结果并通过transform-painter
减去它们以构建新框架,从而生成具有以下尺寸的框架。
Origin =(0,4),New-corner1 =(4,0),New-corner2 =(0,-4)
在坐标平面上观察这些点,结果似乎不正确,而在减法发生之前,原始角落结果是这样的。我做错了什么?
答案 0 :(得分:1)
请查看附图(抱歉我的绘图技巧:))。 我已经标记为 m corner1 转换后的矢量,你说它就足够了 画家将要采取行动的新框架的角落( m corner1 是映射到 corner1 点的 m 坐标转换)。
但请注意这是 一个向右“结束”的向量。您还必须翻译原点以获得正确的帧。现在观察新的原点位于新原点点,并且你寻找的新角(红色角)确实是前两个的向量差。
(图片显示位于单位正方形的蓝框被映射到红框上)