Scheme SICP中图片语言中如何使用帧?
我似乎无法理解SICP中框架的实现 书中说 我们将使用单位平方(0Scheme SICP中图片语言中如何使用帧?,scheme,image,sicp,Scheme,Image,Sicp,我似乎无法理解SICP中框架的实现 书中说 我们将使用单位平方(0
我无法理解这一点,这阻碍了我进一步深入文本,因为后面讨论的所有内容都建立在这个概念的基础上。如果我能详细解释一下读过这本书的人是如何理解这个想法的,我会觉得很有帮助。据我记忆所及,帧是矢量图像,用相对于单位平方的坐标定义,从那里可以缩放,映射并通常转换为具有给定原点和大小的坐标系。都在“框架”部分下面
您可以正确地假设所有图像都包含在单位正方形中,这就是它的原理。然而,这根本不是一个限制——单位正方形中有无限多个坐标点,任何你梦寐以求的图像都可以放在那里。定义坐标在[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