diff --git a/ch3/ch3-02.md b/ch3/ch3-02.md index db68bfd..0ef28ef 100644 --- a/ch3/ch3-02.md +++ b/ch3/ch3-02.md @@ -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文件可能输出无效的多边形元素(虽然许多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