3

我似乎无法理解 SICP 中框架的实现。

书中指出

我们将使用单位正方形中的坐标 (0< x,y< 1) 来指定图像

图像如何表示为坐标?我能想到的唯一解释是,所有图像,作为线条,只能映射到边界不能超过单位正方形的框架。但我对此表示怀疑,因为书中的下一行解释了“框架坐标图”,说

该映射通过将向量 v = (x,y) 映射到向量和 Origin(Frame) + x*Edge1(Frame) + y*Edge2(Frame) 将单位正方形转换为框架

向量 (0,0) 映射到框架的原点, (1,1) 映射到与原点对角的顶点,这只会增加我的困惑。这些向量是什么?图像的来源还是什么?

我无法理解这一点,它阻止了我进一步深入正文,因为之后讨论的所有内容都建立在这个概念之上。如果我能详细解释任何读过这本书的人如何理解这个想法,我会发现它非常有帮助。

4

2 回答 2

10

您对图像的解释是正确的。图像由单位正方形中的线段组成,其中原点 (0, 0) 是左下角, (1, 1) 是右上角。

爱因斯坦在默认框架中绘制

画家使用问题中给出的转换将图像映射到框架中。上面的einsten图像是在默认框架(单位正方形)中绘制的,因此看起来很正常。

您可以通过三个步骤使用SICP 图片语言创建和显示图像:

  • 定义线段列表
  • 从这些线段创建一个线段画家
  • 用新的段画师调用画图

我在博客文章SICP 2.49:定义原始画家中使用了几张简单的图像来做到这一点。这是一个仅使用两条线段的简单示例:

; The painter that draws an 'X' by connecting opposite corners of the frame.
(define x-segments
 (list
  (make-segment
   (make-vect 0.0 0.0)
   (make-vect 0.99 0.99))
  (make-segment
   (make-vect 0.0 0.99)
   (make-vect 0.99 0.0))))

(define x-painter (segments->painter x-segments))

(paint x-painter)

这是我在 DrRacket 中运行最后一个命令时的结果:

简单的画家

您可以通过创建要绘制的新框架来翻转和旋转图像。

一帧由三个向量定义:

  • 起源
  • 底边 (edge1)
  • 左边缘(edge2)

在此处输入图像描述

您可以使用文本中给出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)))))))

例如,如果我想绘制向左旋转 45 度的原始爱因斯坦图像,我只需将einstein分段绘制器连同新的原点、底部边缘和左侧边缘一起传递给transform-painter它,它将返回一个新的分段绘制器。换句话说,我需要告诉transform-painter在哪里绘制图像的左下角、右下角和左上角,它将完成在原始线段绘制器中转换所有线段的工作。

; rotate an image 45 degrees to the left
(define (rotate-45 painter)
  ((transform-painter (make-vect 0.5 0.0)
                      (make-vect 1.0 0.5)
                      (make-vect 0.0 0.5))
   painter))

您可以执行命令(paint (rotate-45 einstein))以查看旋转后的图像。

爱因斯坦旋转了 45 度

于 2013-03-20T15:09:58.063 回答
0

据我记得,帧是用相对于单位正方形的坐标定义的矢量图像,并且可以从那里缩放、映射并通常转换为具有给定原点和大小的坐标系。这一切都在书中的“框架”部分下。

您可以正确地假设所有图像都包含在单位正方形中,就是这样。然而,这根本不是一个限制——单位正方形中有无数个坐标点,你可以想象的任何图像都适合在那里。定义坐标在 [0, 1] 范围内,这只是一个约定问题;如果它们在 [1, 1000] 范围内,则相同,您可以通过移动小数点从一个坐标系映射到另一个坐标系。

于 2013-03-20T13:55:28.377 回答