Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme SICP中图片语言中如何使用帧?_Scheme_Image_Sicp - Fatal编程技术网

Scheme SICP中图片语言中如何使用帧?

Scheme SICP中图片语言中如何使用帧?,scheme,image,sicp,Scheme,Image,Sicp,我似乎无法理解SICP中框架的实现 书中说 我们将使用单位平方(0

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

书中说

我们将使用单位平方(0 图像如何表示为坐标?我能得到的唯一解释是,所有的图像,作为线,只能映射到一个框架,其边界不能超过一个单位正方形的边界。但我对此表示怀疑,因为书中的下一行,解释“框架坐标图”,是这样说的

通过将向量v=(x,y)映射到向量和原点(帧)+x*边1(帧)+y*边2(帧),贴图将单位正方形转换为帧

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


我无法理解这一点,这阻碍了我进一步深入文本,因为后面讨论的所有内容都建立在这个概念的基础上。如果我能详细解释一下读过这本书的人是如何理解这个想法的,我会觉得很有帮助。

据我记忆所及,帧是矢量图像,用相对于单位平方的坐标定义,从那里可以缩放,映射并通常转换为具有给定原点和大小的坐标系。都在“框架”部分下面


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

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

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

您可以使用以下三个步骤创建和显示图像:

  • 定义线段列表
  • 从这些线段创建线段绘制器
  • 使用新的分段绘制器调用绘制
我通过博客文章中的几个简单图像来实现这一点。下面是一个仅使用两条线段的简单示例:

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

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

帧由三个向量定义:

  • 起源
  • 底边(边1)
  • 左边缘(边2)

可以使用
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度的原始爱因斯坦图像,我只需要将
爱因斯坦
分段绘制器连同新的原点、下边缘和左边缘传递给
变换绘制器
,它将返回一个新的分段绘制器。换句话说,我需要告诉变换画师在哪里绘制图像的左下角、右下角和左上角,它将完成变换原始线段画师中所有线段的工作

; 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))
您可以执行命令
(绘制(rotate-45))
查看旋转后的图像


这本书说“单位方格(0