计算机辅助设计的几何编程

第一部分 编程和几何

第一章 介绍FL和PLaSM

本书意图描述的设计语言PLaSM是FL的一个子集的面向几何的扩展. FL是一种在函数层次 (Function Level) 上进行编程的高级语言, 由IBM位于Almaden的研究部门的函数式编程组开发.

第1.1节 符号设计编程介绍

FL语言 (可以追溯至Backus的Turing讲座 [译注: 现在有两种Turing讲座, 这个指的是Turing奖获得者给的讲座]) 引入了程序上的代数, 其中函数表达式之间的一集代数等式被建立起来.

第1.1.1小节 计算模型

程序是函数.

程序复合与应用. PLaSM程序的复合表现得恰如数学函数的标准复合. 例如, 复合数学函数f∘g应用于参数x ( f∘g ) ⁡ (x) ≡ f⁡ ( g⁡ (x) ) 的意思是函数g先应用于x, 然后函数f再应用于值g⁡(x). 之前的表达式的PLaSM记号将会是

(f~g):x≡f:(g:x)
其中~代表程序复合, 而g:x代表将函数g应用于参数x.

命名对象. 在PLaSM中, 一个名字通过使用DEF被赋予每个由语言生成的值, 可以带有或不带显式参数.

DEF object = (Fun3 ~ Fun2 ~ Fun1):parameters;

参数化对象.

DEF object (params::IsSeq) = (Fun3 ~ Fun2 ~ Fun1):params;

DEF obj1 = object:<p1,p2,…,pn>;
DEF obj2 = object:<q1,q2,…,qn>;

第1.2节 PLaSM准备

第1.2.1小节 安装语言
软件下载

译者建议: 这部分内容有点年久失修, 建议参考PLaSM主页:

http://www.dia.uniroma3.it/plasm/
  1. 解释器. PLaSM解释器位于
    http://www.plasm.net/download/
    译者建议: 本书所用的PLaSM版本, 是基于PLT Scheme实现的, 也就是现在的Racket. 之前还有Common Lisp实现的版本, 现在还有Python实现的版本. 读者想用哪个版本就用哪个版本, 尽管我觉得每个实现都有点糟糕到离谱, 以至于让我怀疑作者是不是真读了他开头引用的Essentials of Programming Languages第一版.
  2. 编辑器. 译者建议: 官网上也说他实现了一个编辑器, 然而我怎么也没找到下载的地方, 建议不要关心了.
  3. 浏览器插件.译者建议: Flash是已经死了. SVG现在不用插件就能看. VRML格式建议下载专门软件观看.

第1.2.2小节 开始

  1. 打开Xplode编辑器. [译者: 白给, 啥也没有, 只能用交互体验垃圾得要死的REPL了.]
  2. 输入代码:
    DEF mycube = CUBOID:<1,1,1> COLOR RED;
    mycube;
    译者建议: 这东西的REPL其实是一个PLT Scheme的REPL (是不是让人想到了LCF之于ML), 然后有一个解释过程, 接受字符串作为参数, 然后parse运行PLaSM程序. 我真的不是很能理解, 别的语言也就算了, 在Scheme里作者为什么不把PLaSM做成embedded DSL.

与语言进行交互

作者必须明白每个PLaSM源程序是一个字符串 [译者: 不明白的话, 读者都不明白如何运行这逆天语言], 即被(双)引号包裹的字符序列.

(plasm "(SQRT:3 + 10) / (3.5 * COS:(PI/4))")

第1.3节 在函数层次进行编程

第1.3.1小节 FL句法基础

原始FL对象是字符, 数字和真值. 原始对象, 函数, 应用和序列是表达式. [译注: 我又想问一下作者的编程语言到底是怎么学的了.] 序列是由逗号隔开尖括号包裹的表达式:

<5,fun>
应用exp1:exp2对于exp1和exp2求值, 然后将前者的值应用于后者的值. 注意到二元函数既可用前缀形式也可用中缀形式:
1+3≡+:<1,3>≡4
函数应用是向左结合的:
f:g:h≡(f:g):h
应用比复合绑定得更紧密:
f:g~h≡(f:g)~h

第1.3.2小节 组合形式与函数

第1.4节 PLaSM编程基础

第1.5节 几何运算符

第1.6节 例子

第1.7节 带注解的参考 (Anotated references)

第二章 几何编程

第2.1节 基本编程

第2.2节 基本几何编程

第2.3节 组装形状

第三章 线性代数基础

译注: 你会发现这本书的数学都有点奇怪, 因为作者倾向于将具体和抽象杂糅在一起.

第3.1节 向量空间

一个域F上的向量空间V是一个集合, 其带有两种复合规则 (即运算) +: V×V →V , ⋅: F×V →V 满足以下公理 [译注: 这应该都是常识, 我就不翻译了]:

例子3.1.1. 实矩阵的向量空间. 令Mnm⁡(ℝ)表示域ℝ上的m×n矩阵的集合. [译注: 何以成为向量空间的部分应该是常识, 我就不翻译了.] 记号: M1m ⁡ (ℝ) = ℝm , Mn1 ⁡ (ℝ) = ℝn , Mnm ⁡ (ℝ) = ℝnm
定义. 子空间. [译注: 定义没什么好写的了.] V的子空间U的余维数 (codimension) 被定义为dim⁡V−dim⁡U. 显然两个子空间的交仍然是子空间. [译注: 实际上不必限于有限的情况, 无限的情况也可以.]
定义. 线性组合.

第3.2节 仿射空间

一个点的集合A被称为是V上的一个仿射空间, 如果存在一个映射 A×V →A , ( x,v ) ↦ x+v 满足以下性质:

定义. 正组合. [译注: 这里的术语是positive combination, 实际上更多人将其称为conical combination, 锥组合.] 对于v0,…,vd∈ℝn和α0,…,αd≥0, 向量 α0 ⁢ v0 +⋯+ αd ⁢ vd = ∑ i=0 d αi ⁢ vi 被称为这些向量的正组合. {v0,…,vd}的所有正组合构成的集合被称为其正包 (positive hull), 记作pos⁡{v0,…,vd}. 这个集合也被称为由这些元素生成的锥.
定义. 仿射组合. 令p0,…,pd∈𝔼n和α0,…,αd∈ℝ满足α0+⋯+αd=1. 点 ∑ i=0 d αi ⁢ pi = p0 + ∑ i=1 d αi ⁢ ( pi − p0 ) 被称为点p0,…,pd的一个仿射组合. {p0,…,pd}的所有仿射组合构成了一个仿射空间, 记作aff⁡{p0,…,pd}. 很容易验证: aff⁡ { p0 ,…, pd } = p0 + lin⁡ { p1 − p0 ,…, pd − p0 } .
定义. 凸组合. 令p0,…,pd∈𝔼n和α0,…,αd≥0满足α0+⋯+αd=1. 点 α0 ⁢ p0 +⋯+ αd ⁢ pd = ∑ i=0 d αi ⁢ pi 被称为点p0,…,pd的一个凸组合.

第四章 多面体几何基础

第4.1节 基本概念

定义. 拓扑.

第五章 微分几何基础

第5.1节 曲线

第二部分 图形学

第六章 仿射变换

第七章 几何原语

第八章 层次结构

第九章 图形管线

第三部分 建模