在DrRacket(SICP Picture Language)中使用painter绘制图像时如何传入frame作为参数?
给SICP Painter传入Frame参数的方法(DrRacket环境)
嘿,刚好我对SICP里的这个Picture Language模块挺熟悉的,给你一步步讲清楚怎么操作~
首先得明确:Painter本身就是一个接收Frame作为参数的过程,所以核心是先构造出符合需求的Frame,再把它直接传给Painter就行。下面分两步来:
1. 构造你的Frame
Frame由三个向量定义:
- 原点向量(origin):Frame在画布上的起始位置(通常是左下角点)
- x方向边向量(edge1):Frame水平方向的长度和方向
- y方向边向量(edge2):Frame垂直方向的长度和方向
在DrRacket的SICP Picture Language里,你可以用make-frame函数来创建Frame,而向量则用make-vect构造。举个例子:
; 构造一个标准的全屏Frame:原点在(0,0),水平向右延伸1单位,垂直向上延伸1单位 (define standard-full-frame (make-frame (make-vect 0 0) ; 原点 (make-vect 1 0) ; x方向边(水平向右1单位) (make-vect 0 1))) ; y方向边(垂直向上1单位)
再比如构造一个缩小到画布左上角的小Frame:
(define small-top-left-frame (make-frame (make-vect 0 0.5) ; 原点在(0, 0.5),也就是画布垂直方向的中间偏上 (make-vect 0.5 0) ; x方向延伸0.5单位(一半宽度) (make-vect 0 0.5))) ; y方向延伸0.5单位(一半高度)
2. 把Frame传给Painter
拿到构造好的Frame后,直接把它作为参数传给Painter过程就行。比如用DrRacket自带的einstein画家(爱因斯坦画像)来测试:
; 让爱因斯坦画在标准全屏Frame里 (einstein standard-full-frame) ; 让爱因斯坦画在左上角的小Frame里 (einstein small-top-left-frame)
运行这些代码后,DrRacket的交互窗口就会显示出对应位置和大小的图像啦。
额外小提示
- 如果需要自定义自己的Painter(比如画线段、组合多个Painter),同样的逻辑:当你定义好Painter过程后,直接传入构造好的Frame就能渲染。
- 确保你的DrRacket语言设置为
#lang sicp-pict,这样才能使用make-frame、make-vect这些Picture Language的内置函数。
内容的提问来源于stack exchange,提问作者tchappy ha
相关产品推荐
相关产品推荐

