转换画家如何在SICP的图片语言中工作

时间:2013-03-21 07:21:41

标签: scheme image sicp

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 origincorner1corner2作为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)

在坐标平面上观察这些点,结果似乎不正确,而在减法发生之前,原始角落结果是这样的。我做错了什么?

1 个答案:

答案 0 :(得分:1)

请查看附图(抱歉我的绘图技巧:))。 我已经标记为 m corner1 转换后的矢量,你说它就足够了 画家将要采取行动的新框架的角落( m corner1 是映射到 corner1 点的 m 坐标转换)。

但请注意这是 一个向右“结束”的向量。您还必须翻译原点以获得正确的帧。现在观察新的原点位于新原点点,并且你寻找的新角(红色角)确实是前两个的向量差。

the blue frame that lies in the unit square is mapped onto the red frame

(图片显示位于单位正方形的蓝框被映射到红框上)