4

在 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,和的情况下。origincorner1corner2transform-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)

在坐标平面上查看这些点,结果似乎不正确,而在减法发生之前的原始角结果,确实如此。我究竟做错了什么?

4

1 回答 1

1

请看附图(对不起我的绘画技巧:))。我已将转换后的向量标记为mcorner1,您说它足以作为画家将要作用的新框架的新角(mcorner1是映射到corner1点的m坐标变换)。

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

位于单位正方形中的蓝框映射到红框

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

于 2013-03-21T14:53:49.833 回答