2.9.11 画三维曲面给出适当的图形基元列表后,基本上就可以用 Graphics3D 来表示任何三维对象. 通过明确给出边界相连的多边形集合就可用 Graphics3D 表示三维曲面. 如果要表示能折叠和自相交的任意曲面时,只有 Graphics3D 用一组多边形才能 实现, 这与 ParametricPlot3D 所做的相同. 但在很多情况下仅涉及到简单曲面,例如,Plot3D 和 ListPlot3D 产生无折叠, 且在每个 处高度有限的曲面. Mathematica 中这类简单曲面的表示不需要 给出多边形集合,而需要给出在每个 网格处 高度的集合. 图形对象SurfaceGraphics[array] 表示用这种方式构造的曲面. 三维图形对象 这里是一个 4x4 数值阵列
Out[1]= |  |
用这个阵列去给出曲面上每个点的高度
Out[2]= |  |
Plot3D 和 ListPlot3D 都通过产生 SurfaceGraphics 对象来工作. 曲面表示的转换 将 Graphics3D 用到一个 SurfaceGraphics 对象时,Mathematica 就产生一个 Graphics3D 对象,它明显含有一组用SurfaceGraphics 对象表示曲面的多边形. 当 Mathematica 将两个 SurfaceGraphics 对象结合在一起时,就自动把它们俩转换 为 Graphics3D 对象. 这是由 SurfaceGraphics 对象表示的一个曲面
Out[3]= |  |
这里是另一个曲面
Out[4]= |  |
通过把这两者转换为含有一组多边形的 Graphics3D 对象,Mathematica 将这两个曲面显示在一起
Out[5]= |  |
曲面图中的网格选项 用 SurfaceGraphics 产生曲面时,默认情况是曲面上画出矩形网格,该网格使曲面的 形状清楚易见. 可以用选项设置Mesh -> False 消除网格,也可以在图形指令集合中用选项 MeshStyle 去指定网格线的宽度, 颜色和其它特性. SurfaceGraphics 对象含有确定 网格点处曲面高度值的 一个阵列. 选项 MeshRange 确定网格中原始 坐标的范围. Plot3D[f, x, xmin, xmax , y, ymin, ymax ] 产生一个 SurfaceGraphics 对象,而设置 是自动产生的. MeshRange 在曲面图的 坐标轴标记中使用,它也 在将 SurfaceGraphics 对象转化为 Graphics3D 对象的多边形集合的过程中 产生多边形的坐标. ClipFill 选项设置 选项 PlotRange 在 SurfaceGraphics 的应用与在 Mathematica 其它图形对象中的 应用相同. 曲面位于 PlotRange 定义的坐标范围之外的部分都会被擦掉. ClipFill 选项指出怎样处理被擦掉部分的曲面. 这是顶部和底部曲面被擦掉的三维图形. 用 ClipFill 的默认设置,被擦掉的部分好像在曲面上一样被显示出来
Out[6]= |  |
使用 ClipFill->None 后,曲面上擦掉的部分被除去,所以能从曲面看过去. 当作图的函数值不是实际数值时,Mathematica 就略去对应部分的曲面
Out[7]= |  |
将底部擦去的部分定义为白色,顶部擦去部分定义为黑色
Out[8]= |  |
Mathematica 画一个曲面时,不仅要知道各点的高度,而且也要知道各点的颜色. 在默认设置Lighting->True下,Mathematica 用模拟亮度模型给曲面着色,而在设置 Lighting->False 时,Mathematica 用一个 "颜色函数" 给曲面着色. 默认的颜色函数将曲面的高度函数标准化为 0 和 1 内变化的值,并按对应于 高度的灰度值给曲面的每一部分着色. 有两种方式去改变这一默认情况. 第一种是设置 ColorFunction -> c,Mathematica 就把函数 作用于 每点的高度去确定该点的颜色. 例如用ColorFunction->Hue 时, Mathematica 就用一个范围的色彩给曲面着色. 指定曲面着色函数 用 Lighting->False 时,默认用由高度确定的灰度值给曲面着色
Out[9]= |  |
这里定义了一个函数,它将值的变化范围映射为黑和白 用黑白条显示曲面
Out[11]= |  |
改变曲面默认着色的第二个途径是与高度阵列一起再用第二个阵列. ColorFunction 就会作用于这第二个阵列去找出所要使用的颜色指令. 在第二个阵列中,可以对曲面上每个点指定另一个坐标值.这个坐标值 将颜色画出,而不是用位置画出. 使用 Plot3D[ f, s , ... ] 能自动产生颜色值阵列,在 ListPlot3D 或 SurfaceGraphics 中明确给出阵列时,要注意 n n ( n-1) (n-1) 的颜色阵列. 其原因是高度是在网格点上 指定,而颜色是在网格块上指定. 当对 Plot3D, ListPlot3D 等使用第二个函数或阵列时, ColorFunction 的默认设置是 Automatic. 这意味着该函数或阵列必须明确 包含 GrayLevel 或 RBGColor 等颜色指令. 而给出别的设置时,如 ColorFunction -> Hue , 该函数或阵列就产生数或其它数据,当由 ColorFunction 指定的函数被调用时,这些数或数据就转化为颜色指令. 指定曲面的颜色阵列 这里画出了灰度由 坐标确定的曲面
Out[12]= |  |
这里对每个网格块使用了随机灰度. 注意网格块阵列是 9x9,而网格点阵列是 10x10
Out[13]= |  |
|