我似乎无法理解SICP中帧的实现.
这本书说明
我们将使用单位平方(0 <x,y <1)中的坐标来指定图像
图像如何表示为坐标?我能想到的唯一解释是,所有图像,即线条,只能映射到边界不能超过单位平方的边框.但我对此表示怀疑,因为书中的下一行解释了"框架坐标图"
地图通过将矢量v =(x,y)映射到矢量和Origin(Frame)+ x*Edge1(Frame)+ y*Edge2(Frame),将单位正方形转换为帧
向量(0,0)被映射到帧的原点,(1,1)被映射到与原点对角的顶点,只会增加我的困惑.这些载体是什么?图像的起源还是什么?
我无法理解这一点,它阻止我进一步深入到文本中,因为之后所讨论的一切都建立在这个概念之上.如果我能够详细解释任何读过这本书的人是如何理解这个想法的话,我会觉得非常有帮助.
您对图像的解释是正确的.图像由单位正方形中的线段组成,其中原点(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)
Run Code Online (Sandbox Code Playgroud)
这是我在DrRacket中运行最后一个命令时的结果:
您可以通过创建要绘制的新帧来翻转和旋转图像.
帧由三个向量定义:
您可以使用文本中给出的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)))))))
Run Code Online (Sandbox Code Playgroud)
例如,如果我想绘制向左旋转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))
Run Code Online (Sandbox Code Playgroud)
您可以执行命令(paint (rotate-45 einstein))
以查看旋转的图像.
归档时间: |
|
查看次数: |
513 次 |
最近记录: |