曲面除了可以用参数方程的形式表示之外,还可以用隐函数的形式表达,即表示为 F(x, y, z) = 0 的解。这种曲面又称之为等值曲面,因为曲面上的每个点都满足 F(x, y, z) = 0 这一条件。Mathematica 提供了绘制等值曲面的函数 ContourPlot3D。不过在这篇文章里,我们并不用它来绘制各种婀娜多姿的曲面,而是尝试用它探索、绘制一些"多面体"。
- Z0 _: t, |! m, n6 Z( U从最简单的开始7 C2 |0 B/ \0 w" Z# Z. z: _( x
让我们从最简单的,大家耳熟能详的球面方程开始:
6 V- K. L1 H: R
. R+ j0 n5 y! a' `+ e+ {; N7 e
方程 x^2+y^2+z^2==1 的意义非常简单:每个点到原点的距离都是 1,这就形成了一个球面。相比较之下,球面的参数方程就不是这么简单了:
B- }3 E! G, r! b9 S" P8 u" h多面体
3 m7 r X& a/ \& R# h$ `& v从球面方程出发,我们可以看一下更一般的形式,比如 x^n+y^n+z^n==1 的图形是什么样子的: ( k- S. j$ }$ Q* G/ Y+ p) s
5 a- H! u. D8 x* R可以看到随着 n 的值不断增大,方程表示的曲面越来越接近一个立方体。这是为什么呢?我并不能完全解释,只能提出这么一个猜测。考虑如下表达式:
, U/ f) b+ c& R
# P( I" a3 \* [2 O这是 Lp 范数的定义,当 p 趋向于正无穷时,上述表达式的极限是: M7 W# c/ u/ G" O _+ w
$ N% Y5 ]# f/ j! d5 B也就是 n 个绝对值中的最大值。把这个结论放到我们的方程 x^n+y^n+z^n==1 上,当 n 不断变大时,在不同方向上就不断接近 | x | == 1、| y | == 1、| z | == 1 三个方程,而这三个方程恰恰是立方体的六个面:x = ±1、y= ±1、z= ±1。根据这个猜测,我们只要能知道多面体各个面的平面方程,就能类比的求得类似上述立方体的“多面体渐近方程”。更进一步的,多面体各个面的平面方程,只要知道面法向量就可以确定平面方程了,如果面法向量是 (a, b, c),则成对的平面方程就是 a x+b y+ c z = ±1。 利用 PolyhedronData 可定义求各种多面体法向量的函数如下: " n. i# j( N+ E% h/ i
$ W6 a6 v. s- e9 [/ i; K
接下来就让我们用实际计算来验证一下这个猜测吧:. K( O) q) n/ |6 ?& Y% w
正八面体 : q& z/ p) z$ b7 B
求正八面体的法向量:
6 v; f4 q; J3 D, @* A
化简并去除方向刚好相反的法向量,因为之前方程的常数项 ±1 可以由一个法向量得到两个相对的面的方程:
/ c2 a* I* f( [
8 ` G' L# Y: l2 l
然后就可以根据这个求八面体渐近方程了:
8 Q+ s( K/ c2 X0 y0 Y1 c
: D! X% q. @6 z+ J& ^
& M& N) K2 H- W! a
正十二面体
3 o8 n$ p$ G( P% N8 W4 Y' ~正十二面体的法向量:
: v) F+ J$ Z( c7 I. D
$ C$ v6 w& c4 w化简并去除方向刚好相反的:2 T- h; f/ x! f$ B5 q
, k+ i# g6 m) O; Y1 j隐函数表达式:
' D Q4 I8 k+ v" N3 c
) ~- j* a1 E1 Z7 [3 _! f6 M" n' \9 x5 }, P* {5 b1 a
为了计算方便,我们用数值近似取代根号形式:
绘制图形,可以看到,随着次数 n 的不断升高,图形越来越接近正十二面体:
+ f/ C9 {$ y: r1 Y$ u
$ [& |. c4 J5 _$ n3 O/ Y
十二面体 , B# H" t# w; O) g
计算各个面的法向量:
* |1 ]# T+ E0 N
& C ]$ r: V$ }, o$ a/ B5 j5 n
化简并去除方向相反的:
( I% Z5 W+ G2 h6 [
% G) t; h& G9 U2 }/ l" {得到方程左侧表达式:
- \' J8 f5 @* L. Z8 w; O为了计算方便,取近似值:) \/ Y, N/ g- F9 V' ^9 P6 f
; G" @. x; f+ p6 O' a$ e& w绘制正二十面体的曲面方程:
6 M( ?$ U# I9 a+ y/ @- \4 n8 ^% k
绘制正二十面体的曲面方程:
; C. J; Y- Y& _3 s9 {* f9 H. ~! ~复合多面体 从上面的计算可以看到,根据猜测做的推论基本上是对的:确实据此得到了各种正多面体的渐近方程并成功绘制了出来。但同时也可以看到,这种方法有很多局限性。首先,所生成的多面体必须有平行的相对的面,这样采用的法向量才能一个顶俩,发挥应有的作用得到对应的多面体。五种正多面体里,只有四种满足这个条件,还剩下一个正四面体不能用这种方法表示。其次,用这种方法只能表示凸多面体,所谓凸多面体,就是内部任意两点的连线仍然落在内部的多面体。这两个问题都是可以解决的,解决方法是引入指数函数。
. L/ j# X5 F! L: {$ [0 Z正四面体 ! E k8 s; n& [, ?& N
计算正四面体的法向量:
b7 m: C2 _3 T# {/ }! v
化简:
如果用之前的高次方程的方法,那么只能得到一个朝向比较特别的正八面体,因为每个法向量都生成了两个平面:
( }( t z9 \3 I3 ~ j, @
+ X9 N; [& v% ~3 t. _. |
而改用指数,则可得到如下表达式:8 }% J0 ]& O5 S- O) w
. Q" t0 d6 q' B' E以此作为隐函数果然可以画出正四面体:4 A1 f% p" |& S5 d
0 k) O* h" ? i! b, I
为什么这样可行?我也只能给个近似的猜测:对 E^(a x + by + c z)==C 这样的方程,两边取对数就是 a x+ b y+ c z==log C 这就是一个平面的方程,把几个这样的平面方程加起来,就"围成"了一个多面体。而指数的增长保证了每个方向上不会受其它项的影响,保持大体是个平面。 . e+ v: K) g( k2 }% ?# E. R
另外还值得指出的是,可以在指数上再加次数,让这样生成的多面体的边缘更加"锐利":
# z' Y$ Z6 \& n1 r3 V
6 d- R( P' M4 w星形八面体 在各种各样的多面体中,有一类多面体可以看作是若干基本的多面体彼此叠合组成,我们称之为复合多面体。比如下图所示的星形八面体,就可以看作两个正四面体彼此叠合而成。9 m( b8 O4 R Z1 b _" a0 X( c; Q
' ?4 v' q( f' H0 [观察这个复合多面体的面的组成指标可以发现,前四组只包含顶点 2、4、5、8,后四组只包含顶点 1、3、6、7。这恰好是各自组成两个正四面体。我们可以照样算出这八个面的法向量,然后分组各自生成两个正四面体曲面:' P2 m! f& x, x+ @; |4 X
( Z3 B* U6 j) h8 x) v, N求法向量,化简并分组:
) y+ ]8 G" a8 X, ]/ |' D: E6 R6 j
G) M& \+ d$ j( `/ W: L! z; W
得到两个指数和的表达式:
% l% u+ A% R+ R+ D
& t4 y0 ~: }3 Z/ Y' w* w分别绘制可以看到两个正四面体:1 D; ~3 X% O+ J
1 C9 K1 m( u/ w0 U& g% ?+ G
如何从这两个四面体得到想要的星形八面体呢?直接相加肯定是不行的,那样得到的就是正八面体了。这里我们采用 The Nature of Mathematics and the Mathematics of Nature 一书中提到的一个小技巧:把两个方程表达式再次放到指数上。这个技巧称为 Exponential Scale:
( F0 y( y( M7 n' @' l
0 _7 a3 t( h3 e- G8 N, Q# h
可以看到,这个方程确实可以绘制出星形八面体:
) v, M z6 L0 p3 ^7 D0 o
* H( G7 ]' r" K! ~/ L/ `可以把旋转观察这个星形八面体曲面的过程输出为动画:
: \$ H8 r! z- Y. ~2 {
5 M- P5 G/ ?9 H$ o4 ]' o
5 M8 R6 G8 `8 S7 h3 y! U
e5 Z9 B& A' v! B5 F* o
五复合正四面体 7 P: l i% S) `% G; d# L p
我们可以再举一个例子,五复合正四面体,这是由五个正四面体内接于一个正十二面体形成的复合多面体:
4 y3 e3 S0 C" S+ M4 Y- m2 b/ D; c- J照例求面法向量,化简并分组:
/ `% {, D+ c5 n c! `
( f! @7 c% y1 Q0 ?2 _得到方程:+ R! k# A3 D) P0 n
. P! G! l2 Y1 L绘制可以得到五复合正四面体的近似曲面(警告:由于项数太多,运行绘制速度很慢,运行时请耐心等待):
8 D6 x. q/ N( q/ j. M- f$ h* v$ O4 K6 b% n
我们也用它生成一个旋转观察的动图:
* m* Z2 t, v2 d& W: Q! Z2 ?6 m1 V8 }% Y6 T5 \; N
0 E$ u8 s, d: U5 K
更多的复合多面体 ! M: H6 ?5 Q7 o/ A6 ]" t' \
只要是由凸多面体组成的复合多面体,理论上都可以用上面的方法,先求得各个多面体的方程,然后“抬升”到指数位置,得到复合多面体的方程。Mathematica 提供的PolyhedronData 函数里有许多复合多面体,我全部列在下面,感兴趣的读者可以自己实验生成想要的复合多面体曲面。; t+ ~0 q& i6 K) u7 Z' q
. A, L3 _9 ^8 b3 @% C6 H
' C; i: O7 v5 z9 C对此有兴趣的,欢迎联系我们共同探讨。, s' b8 A8 `. r* `
market@asdoptics.com 8 ~) F6 H* S7 F% S+ u, ^7 A
www.asdoptics.com
! i* k) G" i- ]5 k: \$ U# c: l, S# ?% L
|