第1章 计算机图形学导言 1
1.1 什么是计算机图形 1
目录 1
1.2.1 艺术、娱乐以及出版 3
1.2 计算机生成的图片应用在哪些地方 3
1.2.2 计算机图形和图像处理 4
1.2.3 监视过程 5
1.2.4 显示模拟 6
1.2.6 科学分析和可视化 7
1.2.5 计算机辅助设计 7
1.3.1 折线 10
1.3 在计算机图形中创建的图片元素 10
1.3.2 文本 12
1.3.3 实心区域 13
1.3.4 光栅图像 14
1.3.5 灰度阴影的呈现以及光栅图像中的颜色 18
1.4.1 绘线型显示器 21
1.4 图像显示设备 21
1.4.2 光栅显示器 22
1.4.3 索引颜色和查找表格 26
1.4.4 其他的光栅显示设备 29
1.4.5 硬拷贝光栅设备 30
1.5.1 输入图形原语的类型 31
1.5 图形输入原语和设备 31
1.5.2 物理输入设备的类型 32
1.7 进一步阅读 34
1.6 小结 34
2.1 着手创建图片 36
第2章 绘制图片入门 36
2.1.2 基于窗口的编程 38
2.1.1 设备无关编程和OpenGL 38
2.1.3 打开一个绘图窗口 40
2.2 绘制基本图形原语 41
绘制点丛 44
2.3 绘制线条画 50
2.3.1 绘制折线和多边形 51
2.3.2 使用moveto()和lineto()绘制线条 55
2.3.3 绘制校准长方形 56
2.3.4 校准长方形的高宽比 57
2.3.5 填充多边形 59
2.3.6 OpenGL中的其他图形原语 60
2.4.1 鼠标交互作用 61
2.4 使用鼠标和键盘的简单交互作用 61
2.4.2 键盘交互作用 64
2.5 小结 65
案例分析2.1 伪随机点的集合 66
2.6 案例分析 66
案例分析2.2 迭代函数系统导言 68
案例分析2.3 资金分割率和其他的宝石 71
案例分析2.4 建立并使用折线文件 73
案例分析2.5 线条和多边形的点画法 74
案例分析2.6 折线编辑器 75
案例分析2.7 建立并运行迷阵 76
2.7 进一步阅读 78
第3章 更多绘图工具 79
3.2 世界窗口和视口 80
3.1 简介 80
3.2.1 从窗口到视口的映射 82
3.2.2 自动设定窗口和视口 91
3.3.1 裁剪线段 94
3.3 裁剪线 94
3.3.2 Cohen-Sutherland裁剪算法 95
3.4 开发Canvas类 98
3.4.1 一些有用的支持类 99
3.4.2 类Canvas的声明 100
3.4.3 类Canvas的实现方法 101
3.5 相对绘图例程 103
3.5.1 开发moveRel()和lineRel() 104
3.5.2 龟纹绘图历程 105
3.6.1 规则多边形 109
3.6 基于规则多边形的图形 109
3.6.2 n-Gon的变分(Variation) 111
3.7.2 绘制圆弧 115
3.7.1 绘制圆 115
3.7 绘制圆和圆弧 115
3.8.1 曲线的参数形式 119
3.8 对曲线使用参数形式 119
3.8.2 绘制以参数表示的曲线 122
3.8.3 超椭圆(Superellipses) 124
3.8.4 极坐标形状 125
3.8.5 3D曲线 127
3.9 小结 128
案例分析3.1 学习数理逻辑图形和混沌模拟 129
3.10 案例分析 129
案例分析3.2 在C或者C++中实现Cohen-Suther-land裁剪器 131
案例分析3.3 在Turbo C++中实现Canvas 133
案例分析3.4 绘制圆弧 135
案例分析3.5 一些用于物理和工程中的图形 136
案例分析3.6 平铺图案 138
案例分析3.7 主旋律的有趣改变 139
案例分析3.8 圆围绕着圆滚动 141
案例分析3.9 超椭圆 142
3.11 进一步阅读 143
第4章 图形向量工具 144
4.1 简介 145
4.2 向量 147
4.2.1 向量操作 148
4.2.2 向量线性组合 149
4.2.3 向量的大小;单位向量 151
4.3 点积 152
4.3.1 点积的性质 153
4.3.3 b·c的符号和正交性 154
4.3.2 两个向量的夹角 154
4.3.4 2D“正交”向量 156
4.3.5 正交投影和点到线的距离 158
4.3.6 投影的应用:反射 160
4.4 两个向量的叉积 161
4.4.1 叉积的几何解释 162
4.4.2 求平面的法向量 163
4.5 主要几何对象的表示 164
4.5.1 坐标系和坐标框架 165
4.5.2 点的仿射组合 168
4.5.3 两个点的线性插值 170
4.5.4 艺术和动画的“插值” 171
4.5.5 概述:二次插值、立方插值和贝济埃曲线 173
4.5.6 表示线和平面 174
4.6 求两条线段的交点 182
直线相交的应用:过三点的圆 184
4.7 直线和平面的交点;裁剪 186
4.8 多边形相交问题 188
4.8.1 处理凸多边形和多面体 189
4.8.2 射线与凸多边形的交点和裁剪问题 190
4.8.3 Cyrus-Beck裁剪算法 194
4.8.4 任意多边形的裁剪 196
4.9 小结 198
4.8.5 更高级的裁剪问题 198
案例分析4.1 插值动画 199
4.10 案例分析 199
案例分析4.2 大量的圆 200
案例分析4.3 点Q是否在凸多边形P内部 201
案例分析4.4 密室反射(2D射线跟踪) 202
案例分析4.6 用凸多边形裁剪多边形:Sutherland-Hodgman裁剪 203
案例分析4.5 Cyrus-Beck裁剪 203
案例分析4.7 用多边形裁剪多边形:Weiler-Atherton裁剪 206
案例分析4.8 多边形的布尔操作 208
4.11 进一步阅读 210
第5章 对象的变换 211
5.2 变换导论 212
5.1 简介 212
5.2.1 变换点和对象 215
5.2.2 仿射变换 217
5.2.3 初等2D仿射变换的几何效果 218
5.2.4 仿射变换的逆转 223
5.2.5 组合仿射变换 224
5.2.6 组合2D变换的例子 226
5.2.7 仿射变换的一些有用特征 230
5.3 3D仿射变换 235
5.3.1 初等3D变换 236
5.3.3 组合旋转 240
5.3.2 组合3D仿射变换 240
5.3.4 3D仿射变换特征小结 245
5.4 改变坐标系 246
5.5 在程序中使用仿射变换 249
保存CT以备用 256
5.6 使用OpenGL绘制3D场景 260
5.6.1 观察过程和图形流水线综述 261
5.6.2 一些OpenGL建模和视角工具 264
5.6.3 用OpenGL绘制基本形状 267
5.6.4 从文件中读取场景 275
5.7 小结 279
案例分析5.3 分解2D仿射变换 280
案例分析5.2 使用多个旋转绘制图5.39中的星星 280
5.8 案例分析 280
案例分析5.1 用Canvas中的CT进行自行变换 280
案例分析5.4 通用3D错切 284
案例分析5.5 绕某条轴旋转:构造方法 286
案例分析5.6 分解3D仿射变换 287
5.9 进一步阅读 289
案例分析5.7 用SDL绘制3D场景 289
6.1 简介 290
第6章 使用多边形网格为各种形状建模 290
6.2 使用多边形网格实体建模简介 291
6.2.1 定义多边形网格 292
6.2.2 计算法向量 294
6.2.3 网格的性质 296
6.2.5 在程序中使用网格 298
6.2.4 为非实体物体建立网格模型 298
6.3 多面体 301
6.3.1 棱柱和对角柱 303
6.3.2 柏拉图立体 304
6.3.3 其余常见的多面体 309
6.4.1 生成棱柱 312
6.4 推挤型形状 312
6.4.2 推挤棱柱数组:“堆砌工作” 313
6.4.3 有“扭曲”的推挤 315
6.4.4 建立分段推挤形状:管状物体和蛇形物体 316
6.4.5 “离散地”延伸旋转面 321
6.5.1 表面的表示方法 323
6.5 平滑物体的网格近似 323
6.5.2 表面的法向量 325
6.5.3 仿射变换的作用 326
6.5.4 三种“标准”形状:球面、圆柱面和圆锥面 327
6.5.5 为曲面建立多边形网格 331
6.5.6 直纹面 333
6.5.7 旋转面 338
6.5.8 二次曲面 340
6.5.9 超二次曲面 344
6.5.11 基于双变量显式函数的表面 346
6.5.10 基于三维曲线的管状物体 346
6.6 小结 347
案例分析6.1 存储在文件中的网格 348
6.7 案例分析 348
案例分析6.2 Newell方法的推导 349
案例分析6.3 棱柱 351
案例分析6.4 棱柱组和推挤四边形带 352
案例分析6.5 基于参数曲线的管状物体和蛇形物体 353
案例分析6.8 拱形屋顶 354
案例分析6.7 关于边列表和线框模型 354
案例分析6.6 建立离散旋转面 354
案例分析6.11 二次曲面的代数表达式 355
案例分析6.10 关于阿基米德立体 355
案例分析6.9 关于柏拉图立体 355
案例分析6.13 绘制平滑参数表面 357
案例分析6.12 超二次曲面 357
案例分析6.14 锥化、扭曲、弯曲和挤压 358
6.8 进一步阅读 359
7.1 简介 360
第7章 三维视图 360
7.2 再次研究照相机 361
7.2.2 照相机的定位和定向 362
7.2.1 设置视角范围 362
7.3 在程序中建立照相机 368
移动照相机 370
7.4 三维物体的透视投影 373
7.4.1 点的透视投影 374
7.4.2 直线的透视投影 377
7.4.3 把透视法结合到图形管道中 380
7.4.4 对视角范围进行面裁剪 387
7.5 生成立体视图 393
7.6 投影的分类 395
7.6.1 一点透视,两点透视和三点透视 396
7.6.2 平行投影 400
7.7 小结 406
案例分析7.1 在场景中移动照相机 407
7.8 案例分析 407
案例分析7.5 去掉背面以提高效率 408
案例分析7.4 自己产生视图(假定没有OpenGL可以使用) 408
案例分析7.2 立体视图 408
案例分析7.3 生成平行投影 408
7.9 进一步阅读 410
8.1 简介 411
第8章 渲染表面获得视觉真实感 411
8.2 明暗处理模型介绍 415
8.2.2 计算漫反射分量 416
8.2.1 计算反射光的几何要素 416
8.2.3 镜面反射 418
8.2.4 环境光的作用 421
8.2.5 光分量的结合 422
8.2.6 添加颜色 423
8.2.7 明暗处理和图形管道 425
8.2.8 在OpenGL中使用光源 426
8.2.9 在OpenGL中使用材质属性 431
8.3 平面明暗处理方式和平滑明暗处理方式 432
8.2.10 对SDL指定的场景进行明暗处理 432
8.3.1 平面明暗处理 433
8.3.2 平滑明暗处理 434
深度缓冲区方法 438
8.4 去除隐藏面 438
8.5 给面添加纹理 441
8.5.1 把纹理映射到平表面上 444
8.5.2 渲染纹理 446
8.5.3 纹理改变了什么 453
8.5.4 使用OpenGL获得的纹理示例 455
8.5.5 向曲面上环绕纹理 460
8.5.6 反射映射 464
8.6 为物体添加阴影 467
8.6.1 作为纹理的阴影 468
8.6.2 利用阴影缓冲区生成阴影 469
8.7 小结 471
案例分析8.2 自己实现图形管道 472
案例分析8.1 使用OpenGL生成有阴影的物体 472
8.8 案例分析 472
案例分析8.5 应用可编程3D纹理 473
案例分析8.4 渲染纹理 473
案例分析8.3 添加多边形填充和深度缓冲区去除隐藏面 473
8.9 进一步阅读 474
案例分析8.7 扩展SDL使其包括纹理生成 474
案例分析8.6 绘制阴影 474
第9章 通向无限之路 475
9.2 分形与自相似性 476
9.1 简介 476
9.2.1 曲线的连续细化 477
9.2.2 绘制Koch曲线和Koch雪花 478
9.2.3 分形维数 480
9.3 字符串产生式和PEANO曲线 481
9.3.1 在程序中递归生成字符串并绘图 483
9.3.2 添加分支 486
9.4 拼接平面 489
9.4.1 单面拼接 490
9.4.2 双面拼接 492
9.4.4 “爬虫” 494
9.4.3 绘制拼接 494
9.5.1 拷贝器试验 497
9.5 通过迭代函数系统生成图像 497
9.5.2 拷贝过程的一些基本理论 499
9.5.3 绘制第k次迭代结果 500
9.5.4 混沌游戏 501
9.5.5 计算IFS;分形图像压缩 504
9.6 MANDELBROT集 507
9.6.1 Mandelbrot集和迭代函数系统 508
9.6.2 定义Mandelbrot集 511
9.6.3 计算点c是否在Mandelbrot集内 513
9.6.4 绘制Mandelbrot集 514
9.6.5 Mandelbrot集的几点性质 515
9.7.2 绘制充满Julia集 516
9.7.1 充满Julia集Kc 516
9.7 JULIA集 516
9.7.3 固定点和吸引盆的几点性质 517
9.7.4 Julia集Jc 519
9.8 随机分形 521
9.8.1 线段的分形化 522
9.8.2 控制分形曲线的频谱密度 523
9.9 小结 525
案例分析9.1 绘制字符串产生式 526
9.10 案例分析 526
案例分析9.2 绘制雪花和爬虫 527
案例分析9.4 绘制Mandelbrot集中的轨道 529
案例分析9.3 混沌游戏 529
案例分析9.7 非周期性拼接;Penrose拼板 530
案例分析9.6 生成Julia集的图像 530
案例分析9.5 生成Mandelbrot集的图像 530
案例分析9.8 分形化曲线 532
9.11 进一步阅读 533
案例分析9.9 为分形山建模 533
10.1 简介 534
第10章 光栅显示工具 534
10.2.1 对像素映射的操作 536
10.2 处理像素映射 536
10.2.2 像素映射的有用数据类型 537
10.2.3 图像的缩放和旋转 543
10.3 合并像素映射 546
10.3.1 读-修改-写循环 547
10.3.2 Alpha通道和图像融合 548
10.3.3 像素的逻辑合并 552
10.3.4 BitBLT操作 556
10.4 自己实现直线绘制:Bresenham算法 557
Bresenham直线绘制算法 558
10.5 定义和填充像素区域 563
10.5.2 像素定义的区域 564
10.5.1 定义区域范围 564
10.5.3 一种递归洪水填充算法 565
10.5.4 用图案填充区域 566
10.5.5 利用一致性:基于像素串的区域填充 568
10.6 处理符号定义的区域 569
10.6.1 矩形定义的区域 570
10.6.2 路径定义的区域 571
10.7 填充多边形定义的区域 573
10.7.1 边缘上的哪些像素属于多边形 574
10.7.2 改进算法性能 576
10.8 失真;反失真技术 580
10.8.1 反失真技术 581
10.8.2 纹理的反失真 586
10.8.3 使用OpenGL反失真 588
10.9 生成更多的明暗效果和色彩 590
10.9.1 顺序抖动 591
10.9.2 误差扩散 595
10.10 小结 597
案例分析10.3 基于像素串的区域填充 598
案例分析10.2 用OpenGL融合两幅图像 598
10.11 案例分析 598
案例分析10.1 读取和显示BMP图像文件 598
案例分析10.6 填充“水平凸”多边形 599
案例分析10.5 shape的链码 599
案例分析10.4 处理shape数据结构 599
10.12 进一步阅读 600
案例分析10.8 误差扩散 600
案例分析10.7 一般多边形填充 600
第11章 曲线与曲面设计 601
11.1.1 轨迹参数曲线 602
11.1 简介 602
11.1.2 运动的平滑度 603
11.2 用多项式表示曲线 606
11.3 关于交互式曲线设计 611
de Casteljau算法 613
11.4 用贝济埃曲线进行曲线设计 613
11.5 贝济埃曲线的性质 618
11.6.1 局部控制问题 623
11.6 寻找更好的混合函数 623
11.6.2 混合函数集的期望性质表 624
11.6.3 分段多项式曲线和样条 626
11.6.4 根据g(t)建立一组混合函数 627
11.6.5 样条曲线和基函数 630
11.7 B样条基函数 631
11.7.1 B样条函数定义 632
11.7.2 在结点向量中使用多重结点 636
11.7.3 开放B样条曲线:标准结点向量 637
11.8 B样条曲线设计的有用性质 640
使用多重控制点 641
11.9 有理样条和NURBS曲线 642
11.10 插值简述 646
11.10.1 用分段三次多项式插值 647
11.10.2 Hermite插值 648
11.10.3 自然三次样条 651
11.10.4 三次插值中计算斜率 653
11.10.5 交互指定切向量 656
11.11.2 基于B样条的旋转面 657
11.11.1 基于B样条的直纹面 657
11.11 曲面建模 657
11.11.3 贝济埃表面碎片 659
11.11.4 贝济埃碎片的拼接 660
11.11.5 B样条碎片 662
11.11.6 NURBS曲面 663
11.12 小结 664
案例分析11.1 几种有趣的参数曲线 666
11.13 案例分析 666
案例分析11.2 “椭圆台球桌” 667
案例分析11.5 建立样条曲线编辑器 669
案例分析11.4 一种二次样条曲线生成法 669
案例分析11.3 贝济埃曲线 669
案例分析11.6 用B样条插值控制点 670
案例分析11.8 古老的茶壶 671
案例分析11.7 用三次多项式插值 671
案例分析11.10 绘制NURBS碎片 673
案例分析11.9 投影变换不变性 673
11.14 进一步阅读 675
12.1 简介 676
第12章 色彩理论 676
12.2.1 主导波长 679
12.2 描述颜色 679
12.2.2 色匹配 680
12.3 国际照明协会标准 682
12.3.1 构造CIE表 684
12.3.2 使用CIE色度表 685
12.3.3 色域 686
12.4.1 RGB和CMY颜色空间 687
12.4 颜色空间 687
12.4.2 加色和减色系统 688
12.4.3 HLS颜色模型 689
12.5 颜色量化 692
12.5.1 均衡量化 693
12.5.3 中线切割算法 695
12.5.2 流行算法 695
12.5.4 八叉树量化 696
12.6 小结 698
案例分析12.6 中线切割颜色量化 699
案例分析12.5 流行颜色量化 699
12.7 案例分析 699
案例分析12.1 画CIE图 699
案例分析12.2 画RGB空间 699
案例分析12.3 HSV到RGB的转变 699
案例分析12.4 均匀颜色量化 699
案例分析12.7 八叉树颜色量化 700
12.8 进一步阅读 701
第13章 隐面的消除 702
13.1 简介 703
13.1.1 对象精度与图像精度方法的比较 704
13.1.2 多边形网格的数据描述 705
13.2 再次研究深度缓存算法 707
13.3 列表优先HSR算法 708
13.3.1 粗心画家算法 709
13.3.2 使用二叉空间分割(BSP)树的HSR 710
13.3.3 深度排序算法 714
13.4 扫描线HSR方法 716
13.5.1 象限细分 719
13.5 区域的细分方法 719
13.5.2 简单区域的其他定义 722
13.6 关于隐线消除法 724
edgeTest()中的几何测试 726
13.7 曲面的HSR方法 728
13.8 小结 730
案例分析13.1 画家算法测试 731
13.9 案例分析 731
案例分析13.3 使用BSP树消除隐面 732
案例分析13.2 测试和分割 732
案例分析13.4 使用深度排序法解决HSR问题 733
案例分析13.7 HLR的边堆栈算法 734
案例分析13.6 使用WARNOCK算法绘制 734
案例分析13.5 采用扫描线HSR方法 734
13.10 进一步阅读 735
第14章 光线追踪法的介绍 736
14.1 简介 737
14.2 建立光线跟踪法的几何学 738
14.3 光线跟踪法过程概述 740
14.4 光线与对象的交点 741
14.4.2 光线与通用球体相交 743
14.4.1 光线与通用平面的相交 743
14.4.3 光线与变换后的对象相交 744
14.5 编制光线跟踪器的应用程序 746
14.5.1 计算光线—球体相交的例程 752
14.5.2 用于发光球体场景的完整的光线跟踪器 754
14.6.1 与正方形相交 755
14.6 光线与其他几种基本形状的相交 755
14.6.2 与锥形柱体相交 756
14.6.3 与立方体(或任何凸多面体)相交 759
14.6.4 考虑更多的基本形状 766
14.7 绘制场景的明暗图 767
14.7.1 确定命中点处的法向量 768
14.7.2 根据对象的表面材料为其着色 768
14.7.3 基于物理原理的明暗处理模型:Cook-Torrance明暗处理 770
14.8 加入表面纹理 776
14.8.1 实体纹理 777
14.8.2 在表面上粘贴图像 786
14.8.3 反失真光线追踪 788
14.9 范围的使用 789
14.9.1 框形范围和球形范围 790
14.9.2 投影范围的使用 795
14.10 加阴影以增加真实感 798
14.11 反射与透明 801
14.11.1 光的折射 803
14.11.2 处理shade()中的折射问题 807
14.12 复合对象:关于对象的布尔运算 810
14.12.1 对CSG对象的光线追踪 811
14.12.2 布尔对象的数据结构 813
14.12.3 光线与布尔对象相交 816
14.12.4 构造和使用CSG对象的范围 820
14.13 小结 822
14.14 案例分析 823
案例分析14.1 放射型光线跟踪器 823
案例分析14.4 使用范围加速光线跟踪过程 824
案例分析14.3 在光线跟踪器中实现阴影处理 824
案例分析14.5 对3D纹理的光线跟踪 824
案例分析14.2 一种新型的光线跟踪器 824
案例分析14.9 反射光和折射光 825
案例分析14.8 一个用于研究折射效应的2D光线跟踪器 825
案例分析14.10 对对象的布尔组合进行光线跟踪 825
案例分析14.7 对其他基本形状的光线跟踪 825
案例分析14.6 反失真 825
14.15 进一步阅读 826
附录1 图形工具:获得OpenGL 827
A1.1 OpenGL的获取和安装 827
附录2 计算机图形学的数学研究 829
A2.1 一些关于矩阵及其运算的主要定义 829
A2.1.1 矩阵的运算 830
A2.1.2 两个矩阵相乘 831
A2.1.3 矩阵的分块 833
A2.1.4 矩阵的行列式 834
A2.1.5 矩阵的逆矩阵 835
A2.2.1 向量的正交;正交点积 837
A2.2.2 标量三重积 837
A2.2 向量及其运算的一些性质 837
A2.2.3 三重向量积以及4个向量的积 839
A2.3 复数的运算 839
A2.4 球坐标和方向余弦 842
附录3 一些有用的类以及实用例程 845
附录4 PostScript?简介 877
A4.1 关于PostScript语言 878
A4.1.1 准备事项 878
A4.1.2 PostScript是“基于堆栈的” 879
A4.1.3 一些有关堆栈的操作符:pop、dup、exch和clear 880
A4.1.4 更高级的堆栈操作符 880
A4.1.5 一些算术操作符 881
A4.2 PostScript中的图形操作符 884
A4.2.1 坐标系及其变换 884
A4.2.2 路径构造动词 885
A4.2.3 圆弧 886
A4.2.4 用作绘图动词 887
A4.2.5 坐标变换 888
A4.2.6 图形状态操作符 892
A4.3 在PostScript中绘制文本 893
A4.4 定义新的变量和过程 894
A4.4.1 定义变量 894
A4.4.2 定义过程 895
A4.4.3 使用repeat实现一种简单的迭代形式 899
A4.5 决策和迭代 901
A4.5.1 把布尔值作为参数的动词 901
A4.5.2 判断 902
A4.5.3 迭代 904
A4.6 打印值 908
A4.7 绘制灰度图 909
附录5 SDL简介 912
A5.1 SDL文法 913
A5.2 SDL中的宏 917
A5.3 扩展SDL 917