图形和声音的结构
图形结构 | 三维图形的坐标系 |
二维图形元素 | 亮度和曲面特性 |
图形指令和选项 | 三维图形的标记 |
二维图形的坐标系 | 多重基元的高效表示 |
二维图形的标记 | 图形中的文本格式 |
在图形中插入对象 | 文本中的图形基元 |
密度图和等高图 | 声音的表示 |
三维图形基元 | 导出图形和声音 |
三维图形指令 | 导入图形和声音 |
基本思想是 Wolfram 语言用图形基元的集合表示所有图形. 图形基元包括代表图像基本元素的 Point (点),Line (线) 和 Polygon (多边形),以及 RGBColor 和 Thickness 等指令.
Graphics[list] | 生成二维图形 |
Graphics3D[list] | 生成三维图形 |
图形对象在输出时被 Wolfram 语言前端自动格式化成图形形式. 图形也可以用 Print 命令以副产品形式输出.
对象 Graphics 被 Wolfram 语言计算,但分号阻止了其输出:
Show[g,opts] | 显示由新的选项 opts 指定的一个图形对象 |
Show[g1,g2,…] | 显示由选项 g1 等指定的多个图形对象的组合 |
Show[g1,g2,…,opts] | 显示由新的选项 opts 指定的多个图形对象 |
Show 可用于改变已生成图形的选项,也可用于合并多幅图形.
给定一个图形基元列表后,Wolfram 语言提供了两种方式去修改最终的图形. 首先,可以在图形基元列表中插入一些图形指令,例如 RGBColor,以修改随后列表中的图形基元. 用这种方式,用户可以指定如何修改一个给定的图形基元列表.
创建一个包含 Polygon 图形基元的二维图形对象:
InputForm 完整地显示了图形对象:
通过增加图形选项 Frame 用户可以修改图形的整体外观:
在 Show 中可以指定图形选项. 因此,一个直截了当的方式是取一个图形对象,然后选择不同的图形选项将其显示.
然而应注意到 Show 总是返回已显示的图形对象. 如果在 Show 中指定图形选项,这些选项就会自动的插入在 Show 返回的图形对象中. 于是,除非明确指定其他的图形选项,对相同的对象再次使用 Show 显示的图形将是相同的. 在任何情况下,新指定的选项会覆盖既有的选项.
一些图形选项可以用作产生图形的可视化函数的选项. 对于取 Automatic 的选项有时会被可视化函数赋以特定值.
Wolfram 语言使用内部算法为输出图形的 PlotRange 计算出一个特定值:
FullGraphics[g] | 将图形选项指定的对象转化为明确的图形基元列表 |
对 Axes 等图形选项,Wolfram 语言的前端会自动画出用户需要的坐标轴等对象. 这些对象由选项值表示,而非被确定的图形基元列表表示. 然而,用户会需要要找到代表这些对象的图形基元列表. 函数 FullGraphics 给出不使用任何选项的情况下,生成图形的完整的图形基元列表.
FullGraphics 生成了包括代表坐标轴等的图形基元的一个图形对象:
Point[{x,y}] | 在位置 x,y 的一个点 |
Line[{{x1,y1},{x2,y2},…}] | 通过 {x1,y1},{x2,y2},… 的线段 |
Rectangle[{xmin,ymin},{xmax,ymax}] | 填充的矩形 |
Polygon[{{x1,y1},{x2,y2},…}] | 具有指定角列表的填充多边形 |
Circle[{x,y},r] | 圆心在 x,y,半径为 r 的圆 |
Disk[{x,y},r] | 圆心在 x,y,半径为 r 的填充圆盘 |
Raster[{{a11,a12,…},{a21,…},…}] | 灰度在 0 和 1 之间的矩形阵列 |
Text[expr,{x,y}] |
可以将用图形基元产生的图形对象和用 Plot 等函数产生的图形对象叠合在一起.
两个蓝色的 Rectangle (矩形) 图形元素:
Polygon (多边形) 图形基元选取一个 , 坐标列表,其对应于多边形的顶点. Wolfram 系统将第一个和最后一个顶点连在一起,并填充这个多变形.
Point[{pt1,pt2,…}] | 由 pt1,pt2,… 组成的一个复点 |
Line[{line1,line2,…}] | 由线段 line1,line2,… 组成的一个复线 |
Polygon[{poly1,poly2,…}] | 由 poly1,poly2,… 组成的一个复多变形 |
类似的,通过将一个坐标列表置于一个单一 Point (点)基元内部的方法可以表示大量的点. 这种表示方法非常高效,并且可以被 Wolfram 系统的前端更快速地显示. RGBColor 等图形指令会一致地应用于整个基元集合.
Circle[{x,y},r] | 中心在 {x,y},半径为 r 的圆 |
Circle[{x,y},{rx,ry}] | 具有长短半轴 rx 和 ry 的椭圆 |
Circle[{x,y},r,{theta1,theta2}] | 圆弧 |
Circle[{x,y},{rx,ry},{theta1,theta2}] | 椭圆弧 |
Disk[{x,y},r] ,etc. | 填充的圆盘 |
Raster[{{a11,a12,…},{a21,…},…}] | 值在0和1之间的灰度阵列 |
Raster[{{{a11,o11},…},…}] | 阻光度在0和1之间的灰度阵列 |
Raster[{{{r11,g11,b11},…},…}] | 值在0和1之间的RGB值阵列 |
Raster[{{{r11,g11,b11,o11},…},…}] | 阻光度在0和1之间的RGB值阵列 |
Raster[array,{{xmin,ymin},{xmax,ymax}},{zmin,zmax}] | 灰度在 zmin 和 zmax 之间的由 {xmin,ymin} 和 {xmax,ymax} 定义的矩形阵列 |
第一个子集合包含图形指令 GrayLevel:
只有第一个子集合中的矩形受 GrayLevel 指令的影响:
GrayLevel[i] | 0(黑)和1(白)之间的灰度 |
RGBColor[r,g,b] | 用0和1指定红、绿、蓝分量的颜色 |
Hue[h] | 色度值 h 在0和1之间的颜色 |
Hue[h,s,b] | 色度、饱和度和亮度值均在0和1之间的颜色 |
Wolfram 语言直接接收许多指定颜色所用的颜色名. 例如 Red,Gray,LightGreen 和 Purple 这些颜色名是作为衡量 RGBColor 的变量来执行的. 这些颜色名可与颜色指令互换.
第一幅图用一个颜色名来上色,第二幅图则用精确调制的 RGBColor 指示上色:
函数 Hue[h] 可以很方便地只用一个参数来指定颜色的范围. h 从0 到1变化,Hue[h] 由红、黄、绿、青、蓝、洋红、黑再变到红. Hue[h,s,b] 不仅可以指定颜色的 “色调”,还可以指定 “饱和度” 和 “亮度”. 饱和度等于1给出最深的颜色,饱和度降到零的过程中,颜色越来越浅.
用户在给指一个图形指令如 RGBColor 时,将影响到一个特定列表中的所有后继图形元素. Wolfram 语言也支持仅影响特定类型的图形元素的各种图形指令.
PointSize[d] | 按整个图形宽度的比例给出所有点的直径 d |
AbsolutePointSize[d] | 用绝对单位给出所有点的直径 d |
Thickness[w] | 按整个图形宽度的比例给出所有线的宽度 w |
AbsoluteThickness[w] | 用绝对单位给出所有线的宽度 w |
Dashing[{w1,w2,…}] | 将所有的线显示为长度依次为 w1,w2,… 的虚线段 |
AbsoluteDashing[{w1,w2,…}] | 用绝对单位去度量虚线段 |
CapForm[type] | 给出所有线的端点形状 |
JoinForm[type] | 给出所有线的接点形状 |
图形指令 Dashing 可产生各种虚线. 其基本思想是把线分解为交替绘出和省去的小段. 通过改变这些小段的长度,可以得到不同风格的线. Dashing 允许用户指定一系列小段的长度. 在画出整条线的过程中,这些小段的长度序列可以根据需要多次重复.
显示CapForm 可以选择的不同形状:
使用 JoinForm 指令可以指定线段之间接点的形状.
JoinForm 可以选择的不同形状:
JoinForm[{"Miter",d}] | 使接点最长可延伸至线宽的 d 倍 |
当相邻线段的夹角很小时,交点处的点会变得很长. 在缺省情况下,过长的点会被削平. 其斜面连接的极限长度缺省设置使得五点连成的星型交点尖锐,但更尖锐的接点会被削成斜面. 可以使用 JoinForm 设定斜角极限来精确控制尖锐的交角被削平的程度. 斜角极限指的是被削成斜面前交角处的点被允许的可以超过顶点的线宽数量.
RoundingRadius->r | 指定圆角使用的半径 r |
使用 Wolfram 语言图形指令的一种方法是将其直接插入图形对象使用的图形基元列表中. 然而有时需要图形指令全局地使用,例如确定一类图形元素显示的总体风格. 可以用一些图形选项的的设置按图形指令去指定这样的风格.
PlotStyle->style | 指定在 Plot 中所有曲线的风格 |
PlotStyle->{{style1},{style2},…} | 指定在 Plot 的曲线序列中循环使用的风格 |
MeshStyle->style | 指定密度图和曲面图中的网格使用的风格 |
BoxStyle->style | 指定三维图形中边界单元所使用的风格 |
可以使用不同的 PlotStyle 表达式指定每条曲线的风格:
Background->color | 指定图形的背景颜色 |
BaseStyle->color | 指定图形的基本风格,相关元素不受 PlotStyle 的影响 |
Prolog->g | 在画图前给出图形 |
Epilog->g | 在画图后给出图形 |
在 Wolfram 语言中产生图形对象时,用户给出所出现的各种图形元素的坐标. 当 Wolfram 语言绘制图形对象时,必须把原始坐标转换为 “显示坐标”,“显示坐标”指明每个图形元素应该放置在最终显示区域的哪一个地方.
PlotRange->{{xmin,xmax},{ymin,ymax}} | 包含在图形中的原始坐标的范围 |
选项 PlotRange 指明了要包含的原始坐标范围. 正如在 "图形选项" 所讨论的,缺省设置是PlotRange->Automatic,这使得 Wolfram 语言选择的范围能在去掉“异常值"的同时,尽量包括图形中所有“令人感兴趣"的部分. 通过设置 PlotRange->All,可以使 Wolfram 语言包括所有点. 用户也可以指明要包括的坐标范围.
给出一个明确的 PlotRange,可以使用户将图形的某一部分放大:
AspectRatio->r | 定义显示区域图形的高宽比为 r |
AspectRatio->Automatic | 按原始坐标系确定显示区域的形状 |
大多数计算机系统有确定的屏幕或纸张输出区域,Wolfram 语言的显示区域必须与之匹配. 如何填充这些区域由形状和纵横比确定. 通常,选项 AspectRatio 定义最终显示区域的纵横比.
在二维图形中, AspectRatio 的缺省设置是 Automatic. 这样图形所用的纵横比由原始坐标系决定,而非一个固定值. 原始坐标系中的 方向的一个单位与最终显示区域中 方向的一个单位的距离相同. 这样,用户在原始坐标系中定义的对象按其“自然形状”显示.
有些时候直接给定图形元素的显示坐标会更方便. 要做到这一点,可以使用尺度坐标 Scaled[{sx,sy}] 而非 {x,y}. 尺度坐标在 和 方向上的变化范围均是从 0 到 1,原点选在图形范围的左下角.
{x,y} | 原始坐标 |
Scaled[{sx,sy}] | 图形范围上的尺度坐标 |
ImageScaled[{sx,sy}] | 显示区域上的尺度坐标 |
使用 Scaled 尺度坐标,矩形中心在原点,也在指定画图范围的中心:
使用 ImageScaled 坐标,矩形恰好在图形的中心,但不与绘图范围的中心重合:
使用 {x,y}、Scaled[{sx,sy}] 或者 ImageScaled[{sx,sy}],用户或者完全用原始坐标或者完全适用尺度坐标来定位. 然而有时会需要混合使用这些坐标系. 例如,用户想要在某一点处画一条线,而线段长度与图形宽度成一定比例,这就需要使用原始坐标指定线的基本位置,而用尺度坐标来指定其长度.
Circle[{x,y},Scaled[sx]] | 半径以图形范围的宽度加刻度的圆环 |
Disk[{x,y},Scaled[sx]] | 半径以图形范围的宽度加刻度的圆盘 |
FontSize->Scaled[sx] | 字体大小以图形范围的宽度加刻度 |
Scaled 可用于单一自变量的一些场合.
圆环的半径和字体的大小都在 Scaled 中给出值:
Scaled[{sdx,sdy},{x,y}] | 从原始坐标的尺度偏距 |
ImageScaled[{sdx,sdy},{x,y}] | 从原始坐标的图像尺度偏距 |
Offset[{adx,ady},{x,y}] | 从原始坐标的绝对偏距 |
Offset[{adx,ady},Scaled[{sx,sy}]] | 从尺度坐标的绝对偏距 |
Offset[{adx,ady},ImageScaled[{sx,sy}]] | 从图像尺度坐标的绝对偏距 |
对于大部分的图形,用户通常希望不同对象间的绝对位置能随着改变所画图形的坐标或整体尺寸的改变而自动调整. 然而在某些时候又希望对象间的偏距能保持固定不变. 例如当用户在画一个图形集合时,尽管不同的图形有不同的形式,但用户又希望某些特征能够保持一致.
Offset[{adx,ady},position] 允许用户通过给出用原始坐标或尺度坐标定义的绝对偏距来指定对象的位置. 偏距的单位以打印机的点表示,等于 英寸.
使用尺度坐标,用户可以用显示区域的尺寸来定义图形元素的大小. 然而,用户不能告诉 Wolfram 语言某一特定图形元素的实际物理尺寸. 当然,尺寸最终取决于用户的图形输出设备,而不能由 Wolfram 语言来决定. 尽管如此,在 "图形指令和选项" 中所讨论的 AbsoluteThickness 等图形指令能够用于给出某一特定图形元素的 “绝对尺寸”. 这种方式下定义的尺寸会被大部分、但不是全部输出设备所采用. (例如,对图形进行光学投影时,不可能也不需要保持其中图形基元的绝对尺寸.)
Axes->False | 不画坐标轴 |
Axes->True | 同时画出 和 轴 |
Axes->{False,True} | 画出 轴,不画 轴 |
AxesOrigin->Automatic | 自动选择坐标轴的交点 |
AxesOrigin->{x,y} | 指定交点 |
AxesStyle->style | 同时指定坐标轴的风格 |
AxesStyle->{xstyle,ystyle} | 分别指定各坐标轴的风格 |
AxesLabel->None | 不给坐标轴标记 |
AxesLabel->ylabel | 给 坐标轴标记 |
AxesLabel->{xlabel,ylabel} | 对 和 坐标轴同时标记 |
设置刻度选项 Ticks.
使用缺省设置 Ticks->Automatic,Wolfram 语言生成一定量的主次刻度,将其放在坐标轴上产生最小十进制数的刻度上. 有时需要明确指定刻度的位置和性质. 例如,当使用 倍的刻度或非线性刻度使用明确指定.
None | 无刻度 |
Automatic | 自动标刻度 |
{x1,x2,…} | 在指定位置标刻度 |
{{x1,label1},{x2,label2},…} | 用指定标记标刻度 |
{{x1,label1,len1},…} | 用指定长度标刻度 |
{{x1,label1,{plen1,mlen1}},…} | 在正负方向用指定长度标刻度 |
{{x1,label1,len1,style1},…} | 用指定风格标刻度 |
func | 作用于 xmin, xmax 以得到刻度选项的函数 |
Frame->False | 无框架 |
Frame->True | 画出围绕图形的框架 |
FrameStyle->style | 指定框架的风格 |
FrameStyle->{{left,right},{bottom,top}} | 指定框架中每条边的风格 |
FrameLabel->None | 框架无标记 |
FrameLabel->{{left,right},{bottom,top}} | 在框架边缘给出标记 |
RotateLabel->False | 不转动标记中的文本 |
FrameTicks->None | 在框架边缘画刻度 |
FrameTicks->Automatic | 自动给出刻度位置 |
FrameTicks->{{left,right},{bottom,top}} | 给框架边缘指定刻度 |
Inset[obj,pos] | 指定在图形中的 pos 位置插入 |
Inset[obj,pos,opos,size] | 按给定尺寸画出对象,使 obj 上的点 opos 在图形的点 pos 处. |
Inset[obj,pos,opos,size,dirs] | 指定插入单元的轴要延 dirs 方向 |
DensityPlot[f,{x,xmin,xmax},{y,ymin,ymax}] | |
画出 f 的密度图 | |
ContourPlot[f,{x,xmin,xmax},{y,ymin,ymax}] | |
画出 x 和 y 的函数 f 的等高图 |
选项名称
|
默认值
| |
ColorFunction | Automatic | 使用什么颜色给阴影上色; Hue 使用一系列色彩 |
Mesh | None | 是否画出网格 |
PlotPoints | Automatic | 在各个方向上初始采样点的个数 |
MaxRecursion | Automatic | 递推分割步骤的最大次数 |
DensityPlot 的一些选项.
密度图中各个点的颜色对应着所画函数在各点的值. 按照默认值,随着函数值的增加,图形颜色由黑到白变化,中间过渡色为蓝色. 然而通常需要为点值和颜色的关系指定其他的“颜色映射”. 选项 ColorFunction 允许用户指定一个函数从而确定各点的函数值与颜色的对应关系. 颜色函数可能返回 Wolfram 语言的任何颜色指令, 例如 GrayLevel、 Hue 或者 RGBColor. 一个经常使用的设置是 ColorFunction->Hue.
可以通过使用 ColorData 调用的一个颜色梯度列表:
等高图实际上给定的是函数的“地形图”. 等高线将曲面上相同高度的点连接起来. 默认设置下,等高线对应着一系列间隔相等的 z 值. Wolfram 语言画出的等高图默认设置是有阴影的,z 越大颜色越浅.
选项名称
|
默认值
| |
ColorFunction | Automatic | 使用什么颜色给阴影上色; Hue 使用一系列色彩 |
Contours | Automatic | 等高线的个数,或者是等高线的 z 值列表 |
PlotRange | {Full,Full,Automatic} | |
ContourShading | Automatic | 如何给各个区域上阴影; None 使各个区域空白,或者提供一个颜色列表 |
PlotPoints | Automatic | 在各个方向上初始采样点的个数 |
MaxRecursion | Automatic | 递推分割步骤的最大次数 |
ContourPlot 的一些选项.
DensityPlot 和 ContourPlot 使用适应性的算法,把绘图区域分成小块,以便得到更多的采样点,从而画出更平滑的函数图形. 由于采样点数总是有限的,所以有时可能造成函数特征的丢失. 在必要时可以通过增大 PlotPoints 和 MaxRecursion 选项的值来增加采样点数.
需要注意的一点是,函数值在某一区域变化过快会可能造成Plot 生成的曲线不准确,然而函数值在某一区域变化过慢则会造成 ContourPlot 生成的等高线的形状错误. 一个快速变化的函数给定等高线的常规形式,但函数如果过于平缓则会给出不规则的等高线. 通常可以通过增大 PlotPoints 或 MaxRecursion来解决这一问题.
Point[{x,y,z}] | 坐标为 x、y、z 的点 |
Line[{{x1,y1,z1},{x2,y2,z2},…}] | 通过点 {x1,y1,z1}、{x2,y2,z2}、… 的折线 |
Polygon[{{x1,y1,z1},{x2,y2,z2},…}] | |
有给定顶点列表的填充的多边形 | |
Cuboid[{xmin,ymin,zmin},{xmax,ymax,zmax}] | |
立方体 | |
Arrow[{pt1,pt2}] | 由 pt1 指向 pt2 的箭头 |
Text[expr,{x,y,z}] | 在位置 {x,y,z} 处的文本 (参见 "文本中的图形基元") |
如果给出的是二维图形基元列表,Wolfram 系统就依次画出各个元素,后面的元素遮蔽前面的元素. 而在三维的情况下Wolfram 系统将所给的图形元素综合在一起,将其显示为三维的图形对象,位置在前面的遮蔽位置在后面的元素.
通过创建一个适当的多边形列表,可以在 Wolfram 系统中构造任何三维图形. 例如由 ParametricPlot3D 产生的所有曲面实际上就是用多边形列表来表示的.
Point[{pt1,pt2,…}] | 由 pt1、pt2 … 等点组成的复点 |
Line[{line1,line2,…}] | 由 line1、line2 … 等线组成的复线 |
Polygon[{poly1,poly2,…}] | 由 poly1、poly2 … 等多面体组成的复多边形 |
使用 Polygon 复合坐标系,高效地表示出大量的三角形:
Wolfram 系统允许三维的多边形有任意数目的顶点并以任何形式排放. 根据顶点位置不同,产生的多边形可能会不共面或不是突多边形. 当画这些不共面的多边形时,Wolfram 系统会在画图前把多变形分成一个个平面三角形.
不共面多变形被分成三角形. 三角形间的交线不像 Polygon 基元的外侧边线那样画出:
Cone[{{x1,y1,z1},{x2,y2,z2}}] | 底部以 {x1,y1,z1} 为圆心,半径为1,顶点在 {x2,y2,z2} 的圆锥体 |
Cone[{{x1,y1,z1},{x2,y2,z2}},r] | 半径为 r 的圆锥 |
Cuboid[{x,y,z}] | 对角坐标为 {x,y,z} 和 {x+1,y+1,z+1} 的单元立方体 |
Cuboid[{xmin,ymin,zmin},{xmax,ymax,zmax}] | 对角具有指定坐标的立方体 (长方体) |
Cylinder[{{x1,y1,z1},{x2,y2,z2}}] | 端点坐标为 {x1,y1,z1} 和 {x2,y2,z2},半径为 1 的圆柱体 |
Cylinder[{{x1,y1,z1},{x2,y2,z2}},r] | 半径为 r 的圆柱体 |
Sphere[{x,y,z}] | 圆心为 {x,y,z} 的单位圆 |
Sphere[{x,y,z},r] | 半径为 r 的球面 |
Tube[{{x1,y1,z1},{x2,y2,z2},…}] | 连接指定点的管 |
Tube[{{x1,y1,z1},{x2,y2,z2},…},r] | 半径为 r 的管 |
尽管 Cone、Cylinder、Sphere 和 Tube 能画出高质量的图形, 其用途却是可以调整的. 一幅图像可以包含成千的基元. 在画这些图形基元时,可以通过一些特殊选项,改变默认设置下 Cone、Cylinder、Sphere 和 Tube 的点数, 从而提高画图效率. Graphics3D 中的 "ConePoints" Method 选项用于降低每个圆锥的图像质量. 相似地,圆柱体、球体和管体的图像质量也可以分别通过 "CylinderPoints"、"SpherePoints" 和 "TubePoints" 来调整.
与二维相同,可以使用 PointSize、Thickness 和 Dashing 令 Wolfram 系统去产生 Point (点)和 Line (线)元素. 要注意在三维情形下, 出现在这些指令中的长度按图形显示区域的总宽度比例来度量.
在二维图形中,多边形总有一个由 RGBColor 和 Opacity 等图形指令直接指定的内在色彩. 而在三维图形中,Wolfram 系统是在模拟亮度基础上更加物理化的方式来生成多边形的色彩. 多面体仍有一个由色彩指令指定的内在色彩,但绘制这些图形时所观察到的最终色彩可能会根据各多边形上光度值的不同而不同. 默认设置下,各多边形的内在色彩是白色.
在 Wolfram 系统中产生三维图形对象时,有两种类型的线. 第一种是包含在图形对象中的 Line (线)基元. 第二种是由多边形的边界产生的线.
在 EdgeForm 中给出一组图形指令就可以让 Wolfram 系统生成第二种线.
FaceForm[gfront,gback] | 对每个多边形的前面使用 gfront 图形指令, 对其后面使用 gback 图形指令 |
Wolfram 语言画三维图形时,总要在外边加一个立方盒. 在默认设置 Boxed->True 下,Wolfram 语言会画出盒子的边缘. 但一般情况下,Wolfram 语言会自动擦去该立方盒之外的任何部分.
选项 PlotRange 指定 Wolfram 语言应该包括在盒内 , 和 坐标的范围. 与二维时相同,默认设置是 PlotRange->Automatic,令 Wolfram 语言用内部算法尽量包含图形中 “令人感兴趣” 的部分,而擦掉外围部分. 使用 PlotRange->All,令 Wolfram 语言包含所有部分.
通过设置 PlotRange,星状20面体的许多部分由于位于立方盒之外而被擦去:
与二维情况类似,可以使用 “原始” 或 “尺度” 坐标在三维对象中确定元素的位置. 由 Scaled[{sx,sy,sz}] 确定的尺度坐标,在每一个方向上的取值范围是从 0 到 1. 坐标系在盒子上为右手系.
{x,y,z} | 原始坐标 |
Scaled[{sx,sy,sz}] | 尺度坐标,各维变化范围为 0 到 1 |
在指出各种图形基元应放在盒子内的什么位置后,必须告诉 Wolfram 语言如何画出盒子. 第一步是确定盒子的形状. 这一步与确定二维图形的纵横比类似. 在三维情形中,可以使用 BoxRatios 指定盒子边长的比例. 对于 Graphics3D 对象,默认设置是 BoxRatios->Automatic,其使得盒子的形状根据盒子内元素的具体坐标范围来确定.
BoxRatios->{xr,yr,zr} | 指定盒子的边长比 |
BoxRatios->Automatic | 从实际坐标范围确定边长比(Graphics3D 的默认值) |
产生三维图像时,必须告诉 Wolfram 语言是从哪一个方位来观察对象,这需要可以使用 ViewPoint 选项.
在 "三维曲面绘图" 一节中已经给出了这个选项的常用设置. 然而通常可以让 Wolfram 语言取任意视点.
视点用 ViewPoint->{sx,sy,sz} 指定. si 的值用一个特殊的坐标系给出,该坐标系的原点在盒子的中心 {0,0,0},而将盒子最长的一个边作为一个单位来度量,盒子的其他边长由选项 BoxRatios 的设置确定. 对一个正立方盒子而言,每个边的坐标都是从 到 变化. 要注意视点总在盒子之外.
选项名称
|
默认值
| |
ViewPoint | {1.3,-2.4,2} | 尺度坐标系中的观察点 |
ViewCenter | Automatic | 尺度坐标系中出现在最终图形中心的点 |
ViewVertical | {0,0,1} | 尺度坐标系中出现在最终图形中的竖直方向 |
ViewAngle | Automatic | 模拟相机用于观察图形的开放半角 |
ViewVector | Automatic | 模拟相机在图形常规坐标系中的位置和方向 |
ViewCenter 允许用户告诉 Wolfram 语言对象的哪一点应该在最终图形的中心. 这一点由尺度坐标给出,各方向盒子的边从0到1变化. 用 ViewCenter->{1/2,1/2,1/2},盒子的中心将出现在最终图形的中心. 由于不同视点的选择,盒子不一定对称,盒子的中心不一定在最终图形的中心. 可以用 ViewCenter->Automatic 使盒子中心在最终图形区域的中心.
ViewVertical 指定对象的哪一个方位应该在最终图形中指向上方. ViewVertical 用尺度坐标指出那一个方向应该在最终图形上竖直向上. 默认设置 ViewVertical->{0,0,1},使得原始坐标的 方向在最终图形中总是竖直向上.
Wolfram 语言利用模拟相机的性能来对最终图像制造视觉影象. 对象的位置,观察的取向,以及相机的朝向由选项 ViewCenter、ViewVertical 和 ViewPoint 来确定. 选项 ViewAngle 指定相机镜头的开放宽度. 选项ViewAngle 用弧度指定相机观测到的从 ViewPoint 到 ViewCenter 的线的最大角度的两倍. 有效视角是 ViewAngle 值的两倍. 这表明 ViewAngle 可以有效地对图像某一部分进行放大. ViewAngle 的默认值是35°,这是人眼的通常视角.
ViewVertical 的这种设置使盒子的 轴方向在图形上竖直向上:
使用 ViewAngle 有效地对图像中心进行放大:
设置选项 ViewPoint、ViewCenter 和 ViewVertical,也就是确定怎样观察一个物理对象. ViewPoint 确定头相对于对象的位置. ViewCenter 确定观察位置. ViewVertical 确定头向上的方式.
ViewVector->Automatic | 使用 ViewPoint 和 ViewCenter 选项的值确定模拟相机的位置和朝向 |
ViewVector->{x,y,z} | 对象所用相机在坐标系中的位置; 相机的朝向由 ViewCenter 选项决定 |
ViewVector->{{x,y,z},{tx,ty,tz}} | 对象所用相机在坐标系中的位置及相机的焦点 |
选项 ViewVector 的可能值.
相机的位置和朝向可完全由选项 ViewPoint 和 ViewCenter 确定,但选项 ViewVector 提供了一个有用的推广. 不是用尺度坐标给出相机的位置和朝向,ViewVector 使用与定位图形内部对象相同的坐标系对相机进行定位.
相机位置相同但指向不同方向. 与 ViewAngle 配合使用,这里对图形某一部分进行放大:
当获得了三维对象的二维映像后,还存在如何生成图像的问题,这与二维图形中的问题相同. 例如,可以通过改变纵横比AspectRatio 来修改图形的最终形状,通过设置选项 PlotRegion 来指定图形的整个显示区域.
交互性的修改图形时,Wolfram 语言对这些观察选项做出改变. 如果用户用 ViewPoint指定了相机的位置,旋转图形会使 Wolfram 语言改变选项 ViewPoint 的值. 如果相机的位置由 ViewVector 指定,旋转图形则会改变这个选项的值. 两种情况下,图形的旋转都会影响选项 ViewVertical 的值. 交互性的对图形放大和收缩则会直接影响到选项 ViewAngle. 交互性的平移图形改变的是选项 ViewCenter 的值.
Wolfram 语言通常缩放三维对象的图形,使其在给定的显示区域中尽可能大. 尽管在大部分情况下这正是用户所需要的,但会产生一个所画出的三维对象的尺寸会随着定位不同而变化的结果. 可以通过设置选项SphericalRegion->True 来避免出现这种变化. 在这种设置下,Wolfram 语言在三维边界盒子外侧放一个球面,并调整最后的图形使得整个球面在所指定的显示区域之内. 这个球面的中心与边界盒子的中心重合,并且恰好把边界盒子放在球面内.
使用 SphericalRegion->True,调整最后的图像使得边界盒外的球面整个落在显示区域内:
通过设置 SphericalRegion->True 可以使一个对象的调整和这个对象的所有定位相一致,这对产生同一对象不同定位的动态序列是很有用的.
SphericalRegion->False | 调整三维图像使其尽可能大 |
SphericalRegion->True | 调整图像,使边界盒外面的球面能全部位于最终显示区域内 |
Wolfram 语言允许给一个对象的亮度指定若干个分量. 其中一个是环境光线,产生对象的统一阴影. 其他分量是方向性的,在对象的不同部分产生不同的阴影. “点光源” 在空间中从一点向各个方向射出模拟光线. “聚光灯” 与点光源相似,但是朝一定方向发射锥形光线. “定向光” 朝着给定方向发射均一的光线. Wolfram 语言将这些光源的光线加在一起决定一个多变形的亮度.
{"Ambient",color} | 均一环境光线 |
{"Directional",color,{pos1,pos2}} | 与从 pos1 指向 pos2 的向量平行的定向光线 |
{"Point",color,pos} | 在位置 pos 的球形点光源 |
{"Spot",color,{pos,tar},α} | 在位置 pos,指向目标位置 tar ,开放为半角 α 的点光源 |
Lighting->{light1,light2,…} | 一定数量的光线 |
增加环境光,并去掉所有的点光源. 注意 Lighting 选项取一列光源:
当 Lighting 作为 Graphics3D 或 Show 的一个选项使用时, 其控制着同一场景下所有对象的光照. Lighting 也可以用作图形指令来指定特定对象的光照. 指令Lighting 取代固有的光照设定.
这个例子使用列表使得 Lighting 指令仅作用于中间的球体:
在漫反射中, 射到一个表面的光线被均匀向各个方向反射. 这类反射发生时,曲面显得有些暗淡. 漫反射服从 Lambert 光反射定律:反射光的强度是入射光强度的 倍,其 是入射光线和曲面法线的夹角. 注意当 时无反射光.
在镜面反射中,曲面像镜子一样反射光线. 此时曲面有明亮的外表. 对理想的镜面,光线的入射角和反射角相等. 然而大部分材料都有一定程度的散射,导致反射光线分布在一定范围的角度内. Wolfram 语言通过指定一个镜面反射指数给出反射光线的分布范围,该反射指数按 Phong 光学模型来确定. 镜面反射指数为 ,从反射角偏离 角度处光线的强度为 . 因此,随着 ,曲面就完全像镜子一样. 当 减少时,曲面的光泽就减小,当 时,曲面就完全变成了漫反射面. 实际材料的 的变化范围一般是从一到几百.
大部分材料的反射是漫反射和镜面反射的结合,还有一些材料不仅反射光,其自身还发光. 对于每一种光射,对象会有一种内在颜色. 对于漫反射,入射光为白光时,反射光的颜色就是材料的内在颜色. 当入射光不是白光时,反射光的颜色就是入射光线颜色和材料内在颜色的组合. 相似地,对象可以有不同于漫反射颜色的内在的镜面反射颜色,并且镜面反射光是入射光和内在镜面反射光的组合. 对于发光,发射光的颜色由内在特性决定,与入射光线无关.
在 Wolfram 语言中,可以任意组合使用漫反射、镜面反射和发光指令. 想要去除某一种反射,相应地给出内在颜色为 Black 或者 GrayLevel[0]. 对于相当白的材料,可以指定内在颜色为 GrayLevel[a],其中 a 是这个曲面的反射能力或反射率.
GrayLevel[a] | 反射率为 a 的暗淡表面 |
RGBColor[r,g,b] | 有内在颜色的暗淡表面 |
Specularity[spec,n] | |
Glow[col] | 采用发光颜色 col 的发光表面 |
Wolfram 语言提供了各种标记三维图形的选项. 其中一些选项与 "二维图形的标记" 一节中所讨论的二维图形的选项相同,另一些则不同.
Boxed->True | 图形外面画一个立方盒(默认) |
Axes->True | 在盒子边缘画 、 和 坐标轴 |
Axes->{False,False,True} | 仅画 坐标轴 |
FaceGrids->All | 在盒子表面画网格线 |
PlotLabel->text | 给图形一个总标记 |
Graphics3D 的默认值是画出盒子,但没有其他标记:
AxesEdge->Automatic | 用内部算法定坐标轴的位置 |
AxesEdge->{xspec,yspec,zspec} | 对坐标轴 、 和 分别指定位置 |
None | 不画出这个坐标轴 |
Automatic | 自动确定这个坐标轴的位置 |
{diri,dirj} | 指出在四条可能边的哪一个上画这个坐标轴 |
可以用 AxesLabel 来标记盒子的边,而不必在其上画刻度:
刻度选项 Ticks 的设置.
用户可以使用与 "二维图形的标记" 一节中所描述的给二维图形标刻度符号的相同方式给三维图形标刻度符号.
FaceGrids->None | 表面无网格线 |
FaceGrids->All | 在所有表面画网格线 |
FaceGrids->{face1,face2,…} | 在 facei 表面上画网格线 |
FaceGrids->{{face1,{xgrid1,ygrid1}},…} | 用 xgridi 和 ygridi 确定在各表面画网格线的位置和方式 |
Wolfram 语言允许用户在围绕三维对象的盒子表面画网格线. 设置 FaceGrids->All 时,每个面上都用灰色画出网格线. 设置 FaceGrids->{face1,face2,…} 可令 Wolfram 语言仅在指定面画出网格线. 每个面由一个列表 指定,其中前两个 必须为 0, 而第三个值为 +1 或 -1. 对于每个面,可用与二维图形选项GridLines 相同的指定方式明确告诉 Wolfram 语言画网格线的位置和方式.
Point[{pt1,pt2,…}] | 由点 pt1、 pt2、… 组成的复点 |
Line[{line1,line2,…}] | 由线 line1、 line2、… 组成的复线 |
Polygon[{poly1,poly2,…}] | 由多边形poly1、 poly2、… 组成的复多边形 |
一些基元存在复元素形式,与相同情况下分立的基元相比,能被 Wolfram 语言的前端更快速地处理和绘制图形. 对于大数量的基元, 使用复元素形式还能够显著减小笔记本文件的大小. 和不使用复元素形式相比,使用复元素形式的笔记本可以达到前者尺寸的一半或更小,而其绘图速度能达到前者的十倍.
GraphicsComplex[{pt1,pt2,…},data] | 复合图形,在 data 中的图形基元的整数坐标 i 被视为 pti |
当多个基元共享同一坐标数据时,例如在网格或图形中,使用 GraphicsComplex 可去除重复坐标数据而使效率进一步提高. Wolfram 语言的曲面和图形绘制函数通常采用这种表示形式.
GraphicsComplex 不仅可以提高效率,而且在与用户交互方面也很有用. 拥有共用坐标的基元,在其中一个被拖动时始终保持连在一起.
任何基元都可以在 GraphicsComplex 内使用,而 GraphicsComplex 可以用于 2D 或 3D 图形. 在GraphicsComplex 内,基元的坐标位置被 GraphicsComplex 中坐标数据的指标所取代.
GraphicsComplex 复合了多种形式的基元:
BaseStyle->value | 图形文本风格选项 |
FormatType->value | 图形文本格式选项 |
"style" | 当前样式表中一种命名风格 |
FontSize->n | 用打印机点数表示的字体尺寸 |
FontSlant->"Italic" | 用斜体 |
FontWeight->"Bold" | 用粗体 |
FontFamily->"name" | 指定字体族名称 (如 "Times", "Courier", "Helvetica") |
在 BaseStyle 设置中的典型元素.
在标准的 Wolfram 语言笔记本前端,可以将 BaseStyle 设置成当前笔记本样式表中所定义的风格名称. 也可以用选项 FontSize 和 FontFamily 来明确指定文本格式. FontSize 给出的是字体的绝对尺寸, 单位为打印点,1点等于 英寸. 在改变图形的尺寸时, 如果字体尺寸是用数字表示的,那么图形中的文本不会自动改变尺寸,要得到不同大小的文本,必须给选项 FontSize 明确指定一个新值. 如果字体尺寸是以比例量度给出的,那么随着图形尺寸的改变,字体也会按比例缩放. 使用 FontSize->Scaled[s],实际字体尺寸将是图形中 s 个比例单位.
Style[expr,"style"] | 用指定的风格输出 expr |
Style[expr,options] | 用指定的字体和风格选项输出 expr |
StandardForm[expr] | 按 StandardForm 输出 expr |
用12号字体产生了 StandardForm 输出:
应当意识到指定 "Section" 等风格的能力与使用标准 Wolfram 语言笔记本前端有关. 即使正在使用 Wolfram 语言的文本界面,也仍可用 FontSize 等选项指定图形中的文本格式. 可以使用的所有选项集合在 "文本和字体选项" 节给出.
Text[expr,{x,y}] | 中心在点 {x,y} 的文本 |
Text[expr,{x,y},{-1,0}] | 左端在 {x,y} 处的文本 |
Text[expr,{x,y},{1,0}] | 右端在 {x,y} 处的文本 |
Text[expr,{x,y},{0,-1}] | 中心上端在 {x,y} 处 |
Text[expr,{x,y},{0,1}] | 中心下端在 {x,y} 处 |
Text[expr,{x,y},{dx,dy}] | 文本放置在文本框内使得 {x,y} 在相对坐标 {dx,dy} 处 |
Text[expr,{x,y},{dx,dy},{0,1}] | 由下到上阅读的竖直文本 |
Text[expr,{x,y},{dx,dy},{0,-1}] | 由上到下阅读的文本 |
Text[expr,{x,y},{dx,dy},{-1,0}] | 倒置的文本 |
选项名称
|
默认值
| |
Background | None | 背景色 |
BaseStyle | {} | 风格或字体的指定 |
FormatType | StandardForm | 格式类型 |
Text 选项.
"声音" 一节介绍了如何用函数和数据列表产生声音. 这里讨论的是如何在 Wolfram 系统中表示声音.
与图形类似,在 Wolfram 系统中声音用符号声音对象表示. 声音对象以 Sound 为头部,包含一列声音基元,依次代表着被演奏的声音.
Sound[{s1,s2,…}] | 包含一列声音基元的声音对象 |
声音基元
SampledSoundList[{a1,a2,…},r] | 具有一系列振幅级,采样率为 r 的声音 |
SampledSoundFunction[f,n,r] | 采样率为 r,振幅级由函数 f 作用于 n 个连续整数得到的声音 |
SoundNote[n,t,"style"] | 具有指定风格,音符为 n,持续时间为 t 的类似于音符的声音 |
在最底层,Wolfram 系统中的所有声音是由一系列振幅样本值或 MIDI 事件确定的. 在 SampledSoundList 中,这些振幅样本是在一个列表中明确给出的. 而在 SampledSoundFunction 中,振幅样本则是在输出声音时将指定的函数作用于一列整数变量而得到的. 在这两种情况下,所得到的振幅值必须在 和 之间. 在 SoundNote 中,一个音符样的声音是由代表着音频、持续时间、振幅和音符风格的一系列 MIDI 事件表示的.
根据数值列表,创建 SampledSoundList,其中采样率为 8000:
根据函数创建 SampledSoundFunction,其中采样率为 8000:
创建一个 SoundNote:
ListPlay 生成基元 SampledSoundList,而 Play 生成 SampledSoundFunction 基元. 使用默认选项设置 Compiled->True,Play 将生成包含一个 CompiledFunction 的对象 SampledSoundFunction.
一旦生成了包含各种声音基元的 Sound 对象,必须将其作为声音输出. 与图形很像,基本途径是把根据 Wolfram 系统对声音的表示,将其转换成 Wolfram 系统前端等外部程序能够处理的更低级形式.
Wolfram 系统使用的声音样本的低级形式是一系列表示振幅级的十六进制数字. 在 Wolfram 系统中,振幅级是由在 和 之间变化的近似实数表示. 在生成低级形式时,这些振幅级被 “量化”. 可以使用选项 SampleDepth 来指定每个样本所使用的位数,默认值是 SampleDepth->8,其产生256种不同的振幅级,这对大多数情况是够用了. 基于音符的声音的低级形式是一个 MIDI 事件的时间量化的字节流,以此指定音符对象的各种参数. 时间的量化是在回放时自动决定的.
导入/导出
使用 Export 把声音写入磁盘.
把导入的 Sound 写入磁盘:
Export["name.ext",graphics] | 按从文件名得出的格式输出图形 |
Export["file",graphics,"format"] | 按指定格式输出声音 |
Export["!command",graphics,"format"] | 把图形输出到一个外部命令 |
Export["file",{g1,g2,…},…] | 为动画输出一系列图形 |
ExportString[graphics,"format"] | 产生一个所输出图形的字符串表达式 |
"EPS" | Encapsulated PostScript (.eps) |
"PDF" | Adobe Acrobat 袖珍文档格式 (.pdf) |
"SVG" | 可扩展向量图形 (.svg) |
"PICT" | Macintosh PICT |
"WMF" | Windows metafile 文件格式 (.wmf) |
"TIFF" | TIFF (.tif,.tiff) |
"GIF" | GIF 及动画 GIF (.gif) |
"JPEG" | JPEG (.jpg,.jpeg) |
"PNG" | PNG 格式 (.png) |
"BMP" | Microsoft 位图格式 (.bmp) |
"PCX" | PCX 格式 (.pcx) |
"XBM" | X window 系统位图 (.xbm) |
"PBM" | 袖珍位图格式 (.pbm) |
"PPM" | 袖珍像元映射格式 (.ppm) |
"PGM" | 袖珍灰度映射格式 (.pgm) |
"PNM" | 袖珍任意映射格式 (.pnm) |
"DICOM" | DICOM 医学图像格式 (.dcm,.dic) |
"AVI" | 音频视频交错格式 (.avi) |
ImageSize->x 使得图形的宽度为 x 个打印点,而 ImageSize->72xi 使宽度为 xi 英寸. 默认设置产生的图宽为4英寸. ImageSize->{x,y} 调节图形尺寸使其能放在 x×y 的区域内.
ImageSize | Automatic | 用打印点度量的图形绝对尺寸 |
"ImageTopOrientation" | Top | 是否旋转图形 |
ImageResolution | Automatic | 用 dpi 度量的图形分辨率 |
Export 选项.
许多程序和设备接收 Encapsulated PostScript (EPS)等与分辨率无关的格式的图形. 但一些需要将图形在指定的分辨率内转换为光栅或二进制映射. Export 的选项 ImageResolution 可以决定使用多少 dpi 分辨率. 这个值设置得越小,图形的质量就越差,所需的内存就越小. 屏幕显示时,典型的设置是72dpi 或更大,打印时设置 300dpi 或更大.
Wolfram 语言不仅可以导出图形和声音,还可以将它们导入. 使用 Import 可以将各种格式的图形和声音以 Wolfram 语言表达式的形式读入 Wolfram 语言.
Import["name.ext"] | 从文件 name.ext 中导入图形, 格式由文件名确定 |
Import["file","format"] | 按指定格式导入图形 |
ImportString["string","format"] | 从字符串导入图形 |
Import 根据读入数据的类型产生不同结构的表达式. 如果需要对返回的数据进行处理, 通常需要知道这个结构.
Graphics[primitives,opts] | 与分辨率无关的图形 |
Image[data,opts] | 依赖分辨率的位图图像 |
{graphics1,graphics2,…} | 动画图 |
Audio[data] | 音频信号 |
Import 返回的表达式的结构.