此为 Mathematica 4 文档,内容基于更早版本的 Wolfram 语言
查看最新文档(版本11.2)

2.9.11 画三维曲面

给出适当的图形基元列表后,基本上就可以用 Graphics3D 来表示任何三维对象. 通过明确给出边界相连的多边形集合就可用 Graphics3D 表示三维曲面.
如果要表示能折叠和自相交的任意曲面时,只有 Graphics3D 用一组多边形才能 实现, 这与 ParametricPlot3D 所做的相同.
但在很多情况下仅涉及到简单曲面,例如,Plot3DListPlot3D 产生无折叠, 且在每个  处高度有限的曲面. Mathematica 中这类简单曲面的表示不需要 给出多边形集合,而需要给出在每个 网格处  高度的集合. 图形对象SurfaceGraphics[array] 表示用这种方式构造的曲面.

三维图形对象

这里是一个 4x4 数值阵列

用这个阵列去给出曲面上每个点的高度

Plot3DListPlot3D 都通过产生 SurfaceGraphics 对象来工作.

曲面表示的转换

Graphics3D 用到一个 SurfaceGraphics 对象时,Mathematica 就产生一个 Graphics3D 对象,它明显含有一组用SurfaceGraphics 对象表示曲面的多边形. 当 Mathematica 将两个 SurfaceGraphics 对象结合在一起时,就自动把它们俩转换 为 Graphics3D 对象.

这是由 SurfaceGraphics 对象表示的一个曲面

这里是另一个曲面

通过把这两者转换为含有一组多边形的 Graphics3D 对象,Mathematica 将这两个曲面显示在一起

曲面图中的网格选项

SurfaceGraphics 产生曲面时,默认情况是曲面上画出矩形网格,该网格使曲面的 形状清楚易见. 可以用选项设置Mesh -> False 消除网格,也可以在图形指令集合中用选项 MeshStyle 去指定网格线的宽度, 颜色和其它特性.
SurfaceGraphics 对象含有确定 网格点处曲面高度值的 一个阵列. 选项 MeshRange 确定网格中原始  坐标的范围. Plot3D[f,  x, xmin, xmax ,  y, ymin, ymax ] 产生一个 SurfaceGraphics 对象,而设置 是自动产生的. MeshRange 在曲面图的  坐标轴标记中使用,它也 在将 SurfaceGraphics 对象转化为 Graphics3D 对象的多边形集合的过程中 产生多边形的坐标.

ClipFill 选项设置

选项 PlotRangeSurfaceGraphics 的应用与在 Mathematica 其它图形对象中的 应用相同. 曲面位于 PlotRange 定义的坐标范围之外的部分都会被擦掉. ClipFill 选项指出怎样处理被擦掉部分的曲面.

这是顶部和底部曲面被擦掉的三维图形. 用 ClipFill 的默认设置,被擦掉的部分好像在曲面上一样被显示出来

使用 ClipFill->None 后,曲面上擦掉的部分被除去,所以能从曲面看过去. 当作图的函数值不是实际数值时,Mathematica 就略去对应部分的曲面

将底部擦去的部分定义为白色,顶部擦去部分定义为黑色

Mathematica 画一个曲面时,不仅要知道各点的高度,而且也要知道各点的颜色. 在默认设置Lighting->True下,Mathematica 用模拟亮度模型给曲面着色,而在设置 Lighting->False 时,Mathematica 用一个 "颜色函数" 给曲面着色.
默认的颜色函数将曲面的高度函数标准化为 0 和 1 内变化的值,并按对应于 高度的灰度值给曲面的每一部分着色. 有两种方式去改变这一默认情况.
第一种是设置 ColorFunction -> cMathematica 就把函数 作用于 每点的高度去确定该点的颜色. 例如用ColorFunction->Hue 时, Mathematica 就用一个范围的色彩给曲面着色.

指定曲面着色函数

Lighting->False 时,默认用由高度确定的灰度值给曲面着色

这里定义了一个函数,它将值的变化范围映射为黑和白

用黑白条显示曲面

改变曲面默认着色的第二个途径是与高度阵列一起再用第二个阵列. ColorFunction 就会作用于这第二个阵列去找出所要使用的颜色指令. 在第二个阵列中,可以对曲面上每个点指定另一个坐标值.这个坐标值 将颜色画出,而不是用位置画出.
使用 Plot3D[ f, s , ... ] 能自动产生颜色值阵列,在 ListPlot3DSurfaceGraphics 中明确给出阵列时,要注意 nCrossn  ( n-1)Cross (n-1) 的颜色阵列. 其原因是高度是在网格点上 指定,而颜色是在网格块上指定.
当对 Plot3D, ListPlot3D 等使用第二个函数或阵列时, ColorFunction 的默认设置是 Automatic. 这意味着该函数或阵列必须明确 包含 GrayLevel RBGColor 等颜色指令. 而给出别的设置时,如 ColorFunction -> Hue , 该函数或阵列就产生数或其它数据,当由 ColorFunction 指定的函数被调用时,这些数或数据就转化为颜色指令.

指定曲面的颜色阵列

这里画出了灰度由 坐标确定的曲面

这里对每个网格块使用了随机灰度. 注意网格块阵列是 9x9,而网格点阵列是 10x10