ch3-02 done

Fixes #52
pull/1/head
chai2010 2015-12-20 23:12:16 +08:00
parent 3bc4ffe270
commit 86e81d891c
1 changed files with 26 additions and 1 deletions

View File

@ -137,5 +137,30 @@ func f(x, y float64) float64 {
要注意的是 corner 返回了两个结果, 对应 corner 的坐标参数.
要解释程序是如何工作的需要了解基本的几何知识, 但是我们可以跳过几何原理, 因为程序的重点是演示浮点运算. 程序的本质是三个不同的坐标系中映射关系, 如图3.2所示. 第一个是 100x100 的二维网格, 对应整数整数坐标(i,j), 从远处的 (0, 0) 位置开始. 我们从远处像前面绘制, 因此远处先绘制的多边形有可能被前面后绘制的多边形覆盖.
第二个坐标系是一个三维的网格浮点坐标(x,y,z), 其中x和y是i和j的线性函数, 通过平移转换位center的中心, 然后用xyrange系数缩放. 高度z是函数f(x,y)的值.
第三个坐标系是一个二维的画布, 起点(0,0)在左上角. 画布中点的坐标用(sx, sy)表示. 我们使用等角投影将三维点
![](../images/ch3-02.png)
(x,y,z) 投影到二维的画布中. 画布中从远处到右边的点对应较大的x值和较大的y值. 并且画布中x和y值越大, 则对应的z值越小. x和y的垂直和水平缩放系数来自30度角的正弦和余弦值. z的缩放系数0.4, 是一个任意选择的参数.
对于二维网格中的每一个单位, main函数计算单元的四个顶点在画布中对应多边形ABCD的顶点, 其中B对应(i,j)顶点位置, A, C, 和 D是相邻的顶点, 然后输出SVG的绘制指令.
**练习3.1:** 如果 f 函数返回的是无限制的 float64 值, 那么SVG文件可能输出无效的<polygon>多边形元素(虽然许多SVG渲染器会妥善处理这类问题). 修改程序跳过无效的多边形.
**练习3.2:** 试验math包中其他函数的渲染图形. 你是否能输出一个egg box, moguls, 或 a saddle 图案?
**练习3.3:**根据高度给每个多边形上色, 那样峰值部将是红色(#ff0000), 谷部将是蓝色(#0000ff).
**3.4:** 参考1.7节Lissajous例子的函数, 构造一个web服务器, 用于计算函数曲面然后返回SVG数据给客户端. 服务器必须设置 Content-Type 头部:
```Go
w.Header().Set("Content-Type", "image/svg+xml")
```
(这一步在Lissajous例子中不是必须的, 因为服务器使用标准的PNG图像格式, 可以根据前面的512个字节自动输出对应的头部.) 允许客户端通过HTTP请求参数设置高度, 宽度, 和颜色等参数.
TODO