程序设计技术和方法
裘宗燕,2009-2010 -9-
图形语言:框架
假设已有框架的构造函数 make-frame,选择函数 original-frame,
edge1-frame 和 edge2-frame
需要一个映射由给定 frame 生成一个过程,它由向量参数生成所需向量:
(define (frame-coord-map frame)
(lambda (v)
(add-vect
(origin-frame frame)
(add-vect (scale-vect (xcor-vect v)
(edge1-frame frame))
(scale-vect (ycor-vect v)
(edge2-frame frame))))))
现在考虑 painter 本身及其技术基础
图像的显示框架可以用3个向量表示:
基准向量描述框架基准点的位置
两个角向量分别描述两个相邻角的相对位置
平面向量 v 有两个分量
生成的过程用 frame 变换给定向
量(移基点/两方向比例变换)
程序设计技术和方法
裘宗燕,2009-2010 -10-
图形语言:painter
每个 painter 都是一个过程,它以一个框架为参数,通过适当的位移和
放大缩小,将它要画的图形嵌入由参数给定的框架里
基本 painter 的实现依赖于具体图形系统和被画图像的种类。例如,假
定有画直线的基本过程 draw-line,用线段表的方式表示折线图形中的
折线,就可以用下面过程画出各种折线图:
(define (segments->painter segment-list)
(lambda (frame)
(for-each
(lambda (segment)
(draw-line
((frame-coord-map frame) (start-segment segment))
((frame-coord-map frame) (end-segment segment))))
segment-list)))
实现适当的线段表表示(也是一种数据抽象),给出 wave 图形的线
段表,就可以用 segments->painter 定义出 wave
程序设计技术和方法
裘宗燕,2009-2010 -11-
图形语言:painter,变换和组合
用过程表示 painter,在图形语言里建立了一种很好的抽象屏障
容易创建基本 painter,容易通过组合构造复杂的 painter
任何以框架为参数,基于它画图的过程都可作为 painter
对 painter 的操作都是创建新 painter,如 flip-vert 和 beside,其中用
到作为参数的 painter,还涉及框架变换
对 painter 的操作都基于 transform-painter 定义。它以一个 painter
和变换框架的信息为参数,基于变换后的框架调用原 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)))))))
程序设计技术和方法
裘宗燕,2009-2010 -12-
图形语言:变换和组合
各种 painter 变换都可以基于过程 transform-painter 定义
如纵向反转 flip-vert :
(define (flip-vert painter)
(transform-painter painter
(make-vect 0.0 1.0) ;neworigin
(make-vect 1.0 1.0) ; new end of edge1
(make-vect 0.0 0.0))) ; new end of edge2
将框架收缩到原区域的右上四分之一区域:
(define (shrink-to-upper-right painter)
(transform-painter painter (make-vect 0.5 0.5)
(make-vect 1.0 0.5) (make-vect 0.5 1.0)))
将图形逆时针旋转 90 度:
(define (rotate90 painter)
(transform-painter painter (make-vect 1.0 0.0)
(make-vect 1.0 1.0) (make-vect 0.0 0.0)))
- 1
- 2
前往页