What if a new GURAFU
About
GURAFU 是我之前做的一个简单的绘图库, 但是现在看来里面的一些绘图 API 设计得不是那么好用. (虽然也不是不能用就是了).
假如我有时间重新构建 GURAFU 的 API 的话, 我的想法是这样的:
Lowlevel gurafu.uv
底层的 API 应当建立在不同的 backend 上, 然后提供一些基础的适当抽象:
*bounding-box*
看作是一个抽象的
stream
, 带有cursor-position
当前绘制的cursor
位置 (相对位置)transform
变换规则 (#'indentity
)parent
父元素u
,v
之类的相对 “父元素” 的坐标信息u-min
,u-max
,v-min
,v-max
之类的大小信息
*color*
*font*
*font-size*
(gurafu.uv:pixel stream uv)
(gurafu.uv:point stream uv)
(gurafu.uv:line stream uv1 uv2)
(gurafu.uv:spline stream list-of-uv)
(gurafu.uv:trig stream uv1 uv2 uv3)
(gurafu.uv:rect stream uv1 uv2)
(gurafu.uv:poly stream list-of-uv)
(gurafu.uv:circ stream uv r)
(gurafu.uv:arc stream uv r theta1 theta2)
(gurafu.uv:text stream text uv)
MidLevel
Coordinates
这部分将做坐标的计算与变换, 比如做各种坐标系的变换:
(define-transform name coordinate-list lambda-list &body return transformed-coordinate)
比如:
(define-transform linear (x y) (matrix base) (let-bind* ((matrix ((a11 a12) (a21 a22))) (base (b1 b2))) (list (+ (* a11 x) (* a12 y) b1) (+ (* a21 x) (* a22 y) b2))))
对应为定义一个返回变换函数的函数.
(with-translation (trans &rest trans-arguments) &body body)
translation
或者说transform
通过compose
的方式在原有的变换基础上进行应用.比如:
(with-translation (gurafu:linear '((1 0) (0 1)) '(0 1)) (gurafu:point '(2 3)))
对应为在当前
*bouding-box*
上的translation
的基础上:(let ((*translation* (compose (linear ...) *translation*))) ...)
(define-coordinate (name &rest coordinate-list) lambda-list &body return-uv-list)
比如:
(define-coordinate (:xy x y) (umin umax vmin vmax xmin xmax ymin ymax) (progn ... (return (list u v))))
如是会定义一个
gurafu.coord.xy
为名称的 package, 然后将所有的gurafu.uv:pixel
之类的函数做一个中层封装. 其中umin
之类的值由*bounding-box*
给出.或者感觉这个完全可以用
with-translation
的方式进行实现.
Present Object
(defdraw name lambda-list &body body)
(defpresent object-class super-class slots &rest options)
Color System
- 自动配色系统 (感觉可以参考 Material 的 Dynamic Color System)
HighLevel
- 应当可以自动计算
x-min
之类的坐标信息 - 如果能够实现绘图添加 cache 并复用 cache 就好了
(gurafu:histogram (do-collect (i 10) (random 10.0)))
(gurafu:scatter (do-collect (i 10) (list (random 10.0) (random 10.0))))
Ends
简化后的系统感觉实现起来应该会更加容易一些, 这段时间有空的话会考虑从
gurafu.uv
开始重构. 争取先实现更多的 backend
吧.