如何在SICP的图片语言中使用框架?

时间:2013-03-20 11:36:53

标签: scheme image sicp

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

书中陈述

  

我们将使用单位平方中的坐标(0

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

  

地图通过将矢量v =(x,y)映射到矢量和原点(帧)+ x * Edge1(帧)+ y * Edge2(帧)

,将单位正方形转换为帧

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

我无法理解这一点,并且它阻止我进一步深入到文本中,因为之后所讨论的一切都建立在这个概念之上。如果我能够详细解释任何读过这本书的人是如何理解这个想法的话,我会发现它非常有用。

2 个答案:

答案 0 :(得分:9)

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

Einstein drawn in the default frame

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

您可以使用The SICP Picture Language分三步创建和显示图像:

  • 定义线段列表
  • 从这些细分受众群创建细分画家
  • 使用新的段画家调用绘画

我通过博文SICP 2.49: Defining Primitive Painters中的几个简单图片来完成此操作。这是一个仅使用两个线段的简单示例:

; 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中运行最后一个命令时的结果:

simple painter

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

帧由三个向量定义:

  • 原产地
  • 底边(edge1)
  • 左边缘(edge2)

enter image description here

您可以使用transform-painter函数given in the text(在标题为转换和组合画家的部分中)使用新的原点和边缘转换现有的段画家。

(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段画家与新原点,下边缘和左边缘一起传递给{{ 1}}它将返回一个新的段画家。换句话说,我需要告诉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)) 以查看旋转的图像。

Einstein rotated 45 degrees

答案 1 :(得分:0)

据我记忆,帧是用相对于单位平方的坐标定义的矢量图像,从那里它们可以被缩放,映射并且通常转换到具有给定的坐标系中起源和大小。它全部位于“ frames ”部分下的book

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