曲面の描画   簡易解説

このツールはz = f(x, y)で定義される関数のグラフ(曲面)を 隠線処理が施されたメッシュ (赤い線は z ≧ 0、青い線は z < 0)で描画します。
f(x, y)が与えられたとき、普通は最大/最小値や極値などを調べて関数の概形を調べることになりますが、 「この関数、どんな形をしているんだろう?」という疑問に対して、 直感的に形状を把握することができれば便利だろうなと思って、作成しました。
3次元の曲面を2次元に投影するので隠線処理を施さないと非常に見づらくなってしまいます (脚注 参照)。

一応、頑張って視点位置から見えている線と見えていない線の判定を行っていますが、 たまに見えないはずの線が透けてしまう場合があります。 この点については今後の課題としたいと思います。

描画ウインドウ右上のセレクトボックスから関数を選択し、[Start] ボタンを押すと曲面が描画されます。 描画ウインドウの右と下のスライダーをマウスで動かすと、視点が移動して曲面が回転します。 右のスライダーは視点の上下の移動に対応し、下のスライダーは視点の左右の移動に対応します。

( 描画ページではLocal Storageを使用しています。脚注 参照)

[Ⅰ]   "画面について" 簡単にまとめます。

[1] 関数の選択

セレクトボックスから描画させたい関数を選択します。 いくつかのセクションに分かれていますが、これについては後で説明します。 関数が選択されると、画面の右側上部に、式が表示されます。 [Start] ボタンを押すことで曲面が描画されます。

[2] "Mesh"の設定

描画に使用するラインの数を設定します。 "Calc."は計算で使用するライン数です。 "Drawing"は実際に描画するライン数です。 ライン数を大きくするとメッシュが密になり曲面がなめらかに表示されますが、 計算量が増えるので、描画された曲面を回転させるときの動きがギクシャクすることがあります。 デフォルトは"Calc.", "Drawing"とも 20 です。※註

"Drawing"は"Calc."で選択されたライン数と同じか、1/2, 1/4などの数を選択することができます。

変更後は[Start] ボタンを押すことで、再描画されます。

SpacingとScalingは表示のみで、入力や選択はできません。 Spacingは描画領域におけるラインの間隔です。 Scalingは3次元で曲面を収める箱(x/y:12、z:6)に対する描画範囲の拡大(縮小)率です。

[3] "Range"の設定

x, y, zごとの描画範囲を設定します。

入力用のボックスはテキストボックなので、変更する場合は直接数値を入力します。 デフォルトはx, y, zとも -2~2 です。※註

変更後は[Start] ボタンを押すことで、再描画されます。

zについては関数の値がレンジを超えた場合は、x-y面と平行な平面が描かれます。 これだと境界が分かりづらいのでz : max, 0, minの3ヶ所で等高線を描くことで、 境界を明確にしています。 次に説明するAngleの設定でgamma(上下の視点位置)を90度にセットすると 陰関数のグラフが描画されます。

[4] "Angle"の設定

"$\alpha$" は視点位置の水平方向(z軸廻り)の角度を設定します。 "$\gamma$" は視点位置の上下方向の角度(俯角[-]/仰角[+])を設定します。 テクストボックスなので直接数値を入力することもできますが、 描画ウインドウ右のスライダーが "$\alpha$" に、下のスライダーが "$\gamma$" に連動しているので、 スライダーを動かすとそのときの角度が表示されます。 デフォルトは"$\alpha$" : 30度、"$\gamma$" :-30度です。※註

変更後は[Start] ボタンを押すことで、再描画されます。

[Reset] ボタン

スライダーを動かすと、[Reset] ボタンが使用できるようになります。 ボタンを押すと、"Angle" がデフォルトの角度に戻ります。 "Mesh", "Range"で変更があった場合は、その変更は保持されます。

※註 :

選択された曲面によっては別の値がセットされている場合があります。

[Ⅱ] "セレクトボックスで選択できる曲面について" 簡単にまとめます。

[01] 関数諸例

つれづれなるままに増やしていった関数がストックされています。 なめらかな曲面は特に問題ないと思いますが、 不連続な曲面(分数で定義される関数の分母が0になる場合など)ではいわゆる0割が発生する可能性がありますが、 Javascriptの仕様に従って、以下のように対処しています。

正の実数 / 0.0 -> Infinity(仕様) -> 9999.0
負の実数 / 0.0 -> -Infinity(仕様) -> -9999.0
0.0 / 0.0 -> Nan(仕様) -> 0.0
[02] 複素関数(絶対値)

  1. $ f(x, y) = |\sin(\omega)|,   \omega = x + iy $

    $ \omega = x + iy $ とすると

    $ \sin(\omega) = \sin x \cosh y + i \cos x \sinh y $ より

    $ |\sin(\omega)| = \sqrt{\sin^2 x \cosh^2 y + \cos^2 x \sinh^2 y} $

    実際の計算は$ |\sin(\omega)| $ の右辺の式を使っています。 x軸が実部、y軸が虚部に相当します。 後述する「ユーザー定義」で複素関数の絶対値を描画する場合は、 $ |\sin(\omega)| $ の右辺のように虚数$i$が消去された式を定義する必要があります。 あと、グラブの概形を示すサムネイルの背景が白くなっていますが、 これについては後ほど、説明します。

  2. $ f(x, y) = |\cos(\omega)|,   \omega = x + iy $

    $ \omega = x + iy $ とすると

    $ \cos(\omega) = \cos x \cosh y + i \sin x \sinh y $ より

    $ |\cos(\omega)| = \sqrt{\cos^2 x \cosh^2 y + \sin^2 x \sinh^2 y} $

    $\sin$ が出たついでです。$\cos$ も実際の計算は$ |\cos(\omega)| $ の右辺の式を使っています。 x軸が実部、y軸が虚部に相当します。

  3. $ f(x, y) = |Γ(\omega)|,   \omega = x + iy $

    gamma関数です。

    $ |\Gamma(x + iy)| = |\Gamma(x)| / \prod \sqrt{1 + (y / (n + x))^2}, \quad n:0~∞ $

    実際の計算は$ |\Gamma(x + iy)| $ の右辺の式を使って、 $ n $ 15まで近似しています。 x軸が実部、y軸が虚部に相当します。 $n$ を15としたのは途中で式を書くのが面倒くさくなり、 とりあえず描画させてみたら、それっぽいグラフが描けたので、 まぁ、良しとした次第です。一度、gamma関数のグラフを描いて見たかったのです。

[03]  微分方程式 解曲線の描画 で取り上げた関数

ここで紹介する関数は「 微分方程式 解曲線の描画 」で解軌道が陰関数となるものを扱っています。 「Cassini(カシニ)の燈形」は関数の係数に $a$ と $b$ のパラメータが含まれています。 式の下にパラメータの値を示す入力ボックスが表示されます。 パラメータは、欲張って $a$ から $f$ まで全部で6個用意しましたが、 今回紹介する関数で使用されているのは $a$ と $b$ の2つで、 残りのパラメータは使えないようになっています。 今後、面白い関数を見つけて3つ以上のパラメータが使用できる機会に備えての予備ということにしておきます。

Cassini(カシニ)の燈形

$a$ と$b$ の値をいろいろと変更することができます。

  1. Cassini(カシニ)の燈形

    $ f(x, y) = (x^2 + y^2 + a^2)^2 - 4a^2x^2 - b^4 $

    パラメータ  (デフォルト) : $ a = 0.6,   b =0.4 $

    陰関数は $ (x^2 + y^2 + a^2)^2 - 4a^2x^2 - b^4 = 0$ です。

    パラメータ $a$ は0.6で固定して、$b$ を0.4, 0.6, 0.8 と変化させて曲面を描画させたとき、
    $ z = 0 $ (x-y平面) の位置に示される等高線が、陰関数のグラフと一致します。

    係数の入力ボックスにマウスカーソルを近づけるとスピンボタンのような上下矢印が現れますが、 使いづらいので、直接 "0.6" などと入力する方が楽だと思います。

    立体図は分かりづらいので、"$\gamma$" の角度が $ \pm 90$ になるまで スライダーを移動させてみて下さい。 目的の曲線が描画されていると思います。

    $a$    $b$    曲線の特徴 グラフの概形
    0.6 0.4 原点対称の2つの閉曲線
    0.6 0.6 原点を通る曲線
    0.6 0.8 楕円っぽい曲線

    $ a = b $ のとき、Lemniscate(レムニスケート)と呼ばれる曲線になります。
    この場合、$ a = 0.6, \quad b = 0.6 $ のときの曲線がLemniccateです。

  2. 三角関数の周期性が反映された曲面の例

    $ f(x,y) = \cos(y) - \cos(x) $

    この曲面を見て、私は台所で使う波形のスポンジを連想しました。 この曲面を $z = \alpha $ の位置で切り取ったときに示される等高線が 「 微分方程式 解曲線の描画 4-12 」で描かれる 解軌道と一致します。

    この例では、カシニの橙形とは異なり、変更可能なパラメータはありませんが、 描画範囲 z値のMax, Minを変更することで陰関数のグラフを再現することができます。 右側のサムネイルは $ z = \pm 1$ のときのグラフを真上から見た場合です。

[99] ユーザー定義

[描画へ] (或いはその上の図) をクリックすると、以下の画面が表示されます。 任意の関数を入力して、その曲面を確認することができます。 STARTボタンを押すと入力ボックスの下に入力した式がTeX形式で表示され、描画が開始されます。 入力された式の評価には Math.js を利用しています。 エラーメッセージが表示された場合は、入力した式を確認して、適宜修正して下さい。

※ 入力する式には $a, b$ などのパラメータを含めることはできません。 係数には"2"、"-3"などの直値を入力して下さい。

※ 不連続な曲面(分数で定義される関数の分母が0になる可能性がある場合など)については、 Javascriptの仕様に従って $z$値を調整していますので、特に場合分けを行う必要はありません。

以下に、入力例を示します。

$ f(x, y) = x^3 -3xy + y^3 \quad ( z = 0 のときの等高線はデカルトの葉線) $

$ f(x, y) = $ と表示されている右の入力ボックスに描かせたい関数を入力します。

where, $r = $ と表示されている右の入力ボックスについては後で説明しますが、 ここでは何も入力する必要はありません。

式の書き方には幾つかのルールがあるので、ここで簡単にまとめておきます。

  1. 加減乗除

    式の中では +, -, *, / を使用します。 注意が必要なのは * です。 例の式場合、つい "x^3 - 3xy + y^3" と書きたくなってしまいますが、 "3xy" が数式として評価されずにエラーとなってしまいます。 "x^3 - 3*x*y + y^3" と入力してください。

  2. べき乗

    べき乗は様々な入力が可能ですが、単純なものであれば、"x^2" で十分です。 勿論、"x*x" でもかまいません。 2乗くらいなら "x*x" で問題ないですが、 4乗、5乗となってくると "x^4、x^5" などの方が入力も確認も楽です。

    pow()も使えます。 "pow(x^2 + y^2, 2)" などはTeXで表示したとき、 $(x^2 + y^2)^2$ と表示されるので違和感がありませんが、 "pow(x, 5)" と入力すると、表示は $(y)^5$ となります。 計算自体は正しく実行されるので問題はないのですが、 違和感を感じられる場合は、単純に "y^5" と入力して下さい。

  3. 数学関数

    入力された数式の解析はmath.jsを利用しているため、 pow()も含めて、sin(), cos(), log() そして abs() などの数学関数はそのまま入力できます。

    指数については、"e^x" は $e^x$ として評価されます。 "exp(x)" と入力した場合も、TeXの表示は $\exp(x)$ になりますが、同じように評価されます。 指数部が複雑な場合は "e^(x + 1)" 或いは "exp(x + 1)" のように括弧をつけて下さい。

  4. 長い式の入力 1

    式が長くなる場合は、以下のように折り返して入力できます 評価された数式も折り返されて表示される場合もあります。 (折り返しの処理があまり良いできではなく、 長い式なのに折り返されずに表示されてしまうことがあります。 この場合は画面のレイアウトが崩れます。 崩れても計算に影響はありませんが、非常に見づらくなります)。 まぁ、ちょこちょこっと関数を入力してグラフを確認するのが目的なので、 無理に長い式は入力しない方が無難です(時間がある時に見直すつもり...ではあります)。

  5. 長い式の入力 2

    式の一部が繰り返されるときは、where, $r = $ の入力ボックスに式を入力して、 繰り返される部分をrで置換することで、入力の手間を省くことができます。 必要ない場合は、何も入力する必要はありません。

以下に、入力のサンプルを示します。

  1. 入力例で示した関数

    $ x^3 - 3*x*y + y^3 $

  2. 長い式の入力例で示した関数

    $ x * (1 - 2 * r) - y * (1 + 2 * r) * (r^2 - (x^2 - y^2)) \quad $ where, $ \; r= x^2 + y^2 $

== 脚注 ==

[1.]

陰線処理の有無で2Dに投影された曲面の見え方の違い

  1. 隠線処理有りの場合

  2. 隠線処理無しの場合

    戻る

[2.]

このページでは、Local Storageを利用して以下の2点についてデータを保持する機能を持ちます。

  1. セレクトボックスで選択されたリストの位置

  2. 描画ウインドウの背景色

1 については選択項目の数が相当な量のため、ブラウザの更新ボタンが押された場合や、ページを閉じた後に再度ページを開いたとき、 いちいち先頭のリストから目的のリストまで辿るのは大変です。 そこで、以下に示すように選択されたリストの位置を保持するためのチェックボックスを設置しました。

チェックを入れてから特定の項目を選択すると、 Local StorageにチェックボックスのONと選択されたリストの番号が保存されます。 ブラウザの更新ボタンの押下やページを閉じてもデータが保存されるため、 目的の項目が選択された状態でページが開くようになります。

ただし、チェックを外すとLocal Storageに保存されていたデータは、keyと共に削除されるため、 ブラウザの更新ボタンが押された場合や、ページを閉じた後に再度ページを開いたとき、リストの先頭が選択された状態に戻ります。

Local Storageに保存されるデータ ( key, vakue ) は次の2点です。

keyvalue
kzPers_StorageFlgtrue
kzPers_SelectedType"09&09" などの5文字の文字列

2 についてはこのページで使われているサムネイル(描画された曲面)の背景が 黒だったり、白だったりすることに関係しています。

個人的には、背景が黒の方が見やすいと思うのですが、画面が小さいとラインが黒の背景に埋もれてしまい、 かなり見にくいことが分かりました。 そこで、以下に示すように背景を黒か白か切り換えるためのチェックボックスを設置しました。 デフォルトはチェックが入っていない状態で、背景は黒です。 チェックを入れると、背景が白になります。

チェックを入れたら、ブラウザの更新ボタンをクリックして下さい。 Local Storageに背景色の設定が保存され、描画ウインドウの背景が白色に切り替わります。

以後、ブラウザの更新ボタンの押下やページを閉じてもデータが保存されるため、 ページが表示されると同時に描画ウインドウの背景色が白になります。

ただし、チェックを外すとLocal Storageに保存されていたデータは、keyと共に削除されるため、 ブラウザの更新ボタンが押された場合や、ページを閉じた後に再度ページを開いたとき、 描画ウインドウの背景色は黒になります。

Local Storageに保存されるデータ ( key, vakue ) は次の2点です。

keyvalue
kzPers_Storage2Flgtrue
kzPers_BackColor'rgb(255,255,255)' の文字列

Local Storageに保存されているデータは、ブラウザの設定画面から確認することができます。 戻る