You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:47:39