« ♪第9の4楽章プレスト3拍子の徹底把握 | トップページ | ◇「対等でない」は説明にならない:双子のパラドクス »

▲裸眼立体視3Dアニメート数式プロッタ

 裸眼立体視3D+時間遷移数式プロッタ

ステレオ図(並行法)による単純な立体数式プロッタを作成しました。
変数x,yから得られるzを表示するものですが、変数として時間t 持ちますので4次元プロッタとも言えます。
式:のエリアにx,yの範囲と、x,yおよび時間変数tからzを得る式を記述し[式反映] をクリックするとグラフ表示されます。
点とベクトルのプロット機能も試験的に仮実装してあります。ベクトルの演算機能 なども追加予定です。
幾つかの例題を用意してあります。

 1. 式の定義法

式の定義は「範囲指定」と「代入式」からなっています。

範囲指定は 名前 = 値 , 値 で行います。

   x = 開始値 , 終了値
   y = 開始値 , 終了値
   z = 床値,    天井値
   // 見やすくするために空白を入れてありますがくっつけてもかまいません
となります。計算結果のzの値が床値、天井値より大きく なる場合は上下にはみ出して表示、または画面から外れ ます。
zの範囲を指定しない場合、自動で領域に収まるように 調整されます。

代入式は

  変数名=式
の形をしています。変数名としてzを指定すると、その値 が画面に反映されます。
計算途中の値を別の名前で設定することもできます。
    z = x*x*exp(-x*x)*y*y*exp(-y*y)*sin(2t)
  と書く代わりに
    x2 = x*x
    y2 = y*y
    z  = x2*exp(-x2)*y2*exp(-y2)*sin(2t)
  と書くことができる

定義されていない変数を参照すると、status行に"E:undefined variable 名前" と表示されます。

範囲指定より前に値が静的に決定されるなら、範囲指定に変数を用いる こともできます。式を使っても構いません。

    range=3
    x=-range,range
    y=-range*2,range/3
    z=-5*range,sqrt(range^2+10)

yレンジ記述を省略するとxレンジと同じとなります。

数値*名前は*を省略できます。

    x = cos(2*x)+sin(1.2*y)
 と書く代わりに
    x = cos(2x)+sin(1.2y)
 と書くことができる

指定は行を分けずに記述できます。

    x=0,2
    y=0,3
    z=0,10
    z=2x+y
  と書く代わりに
    x=0,2 y=0,3 z=0,10 z=2x+y

各要素の間は空白や改行タブなどが複数入ってもかまいません。

    x=0,4
  と書く代わりに
    x=
      0     ,

    4
 と書いても構いません

Cのコメントと同じ形式のコメントが書けます。
/*から*/までがコメントとなります。ネストはできません。
//から改行まではコメントとなります。
2種のコメントは互いに相手をコメントアウトします。

散布図/ベクトル図試験のための仮のデータ記述文法も 入っています。例題も載せています。

式定義にエラーがある場合、図形領域にエラーメッセージがでます。

 1.1 時間変数

時間を現す変数tが用意されています。

tは画面が1回転する間に2πだけ大きくなります。回転を止めてもtは進みます。

 1.2 演算子

2項演算として、四則演算(n+m,n-m,n*m,n/m)とべき乗演算(n^m) および剰余演算(n%m)が使用できます。
単項演算として、符号調整(+n,-n)および階乗(n!)が使用できます。
べき乗および階乗は符号より強く結合することに注意してください。

   -x^2 は (-x)^2ではなく -(x^2)です。
   -x!  は (-x)! ではなく -(x!)です。
剰余算%は被除数、除数とも一旦Math.round()で整数(long)化して計算 されます。このため空間分解能との関連上若干不自然な動きともなります。

 1.3 関数、定数

JavaのMathに用意されている関数が使用できます。

   z = sqrt(pow(x,2)+pow(y,2))
定数EとPIも使用できます。

 2. 操作法

定義を変更した場合[式反映]ボタンをで新しい定義を 反映できます。

[回転]チェックボックスで回転する/しないを選択できます。
回転が止まっている時に、最下のステータス行にr:に続く数値を 入れ、リターンを押すとその角度で表示されます。

   r:数値
  数値は0~360
   例  r:30

[時間]チェックボックスで時間変数tが変化するかどうかを指定できます。

[reset]ボタンで時間変数tと角度をリセットできます。

[↑][↓]で見る角度を変更できます。

[前サンプル][次サンプル]で幾つかのサンプルを表示できます。

座標系はデフォルトでは親指をx,人さし指をy,中指をzとした場合の「右手系」と なっています。[左手系]を押すことにより左手系に変更できます。

回転はデフォルトでは反時計まわりとなっています。[時計回り]を押すことに より時計回りにすることができます。

グラフ領域は[壁][床][軸]で座標の表示をon/off できます。
軸表示がある場合は[軸名][軸値]でレンジ表示をon/off することができます。
[端線]で縁の線(断面線)に色を付ける/付けないを選択できます。
[面]で値部を面表示(隠線処理)にするか網表示にするかを選択できます。
[色]を無効にすると面、軸とも白黒諧調のみになります。。

 2.1 立体視操作ボタン

立体視でも操作できるボタンを用意しました。左右に同じボタンがあり どちらをクリックしても動作します。

  A-  : 回転中、回転を止めます。停止中、時計周りの回転を始めます
  A+  : 回転中、回転を止めます。停止中、反時計周りの回転を始めます
 T-  : 時間進行中、時間を止めます。停止中、-方向に時間を動かします
 T+  : 時間進行中、時間を止めます。停止中、+方向に時間を動かします
 ▲  : 傾きを変えます
  ▼  : 傾きを変えます
 ←  : 前の例題を出します
 →  : 次の例題を出します
 rst : 角度と時間を初期化します
  □  : 面⇔線を切り替えます

 3. 補助指定

分解能の関係上極限に近い値(n/0付近など)では正確な描写は望めませんが、 幾つかの補助指定、補助関数を用意してあります。

式の値の上限下限を定めるlimit指定もあります。式にmin,max を書くことも可能ですが、min,maxを入れると式の本質が見づらくなります。

    limit = -4 , 5
    z = sin(sqrt(x^2+y^2))/x
  は
    z = max( -4, min( 5,sin(sqrt(x^2+y^2)) )/x )
  と同じです。

limit(min,max,val)関数を用いればvalをminからmaxの間に限定できます。

gap(min,max,val)関数を用いればminからmaxの間をminまたはmaxの近い値 にします。

 仮実装項目

数式だけでなく、ベクトルや散布図も仮実装しました。
これらは2次元の図面では認識困難なものです。

plotオペレーションと、vector関数、および配列値表記{x,x,x}が数式機能 に追加されています。
3値の配列は空間の点を現します。vector関数に2つの位置を示すことに より矢印の付いた線(ベクトル)となります。
点およびベクトルは変数とすることができます。またそれらの配列(集合)を とることも可能です。
点とベクトルはplotオペレーションで表示できます。

   point1 = { 1,1,5 }                  // 点1
   points = { {3,4,2},point1,{5,2,4} } // 点の集合
   vect1  = vector({1,0,1},{2,2,4})    // ベクトル
   point0 = { 0,0,0 }
   pointX = { 4,1,5 }
   vect2  = vector(point0,pointX)      // 点定義から作るベクトル
   vects  = {vect1,vect2}              // ベクトルの集合 
   plot(points,vects,{3,3,3})          // プロット
値には時間変数tを用いて時間変化を与えることができます。
   plot(vector(2+sin(3t),2+sin(5t),2+sin(7t)))

ここでのベクトルは原点からに限っておらず有向直線といった意味合いです。

ベクトル演算なども追加予定ですが、現時点では実装されていません。

数式プロットとの同時表示は考えられていません。

 構文

式入力の構文定義を示します。

//#omit expression term
@           ::= ?"[ \t\n\f\r\u3000]+" // 空白
@           ::= ?"//.*$"              // C形式行端コメント
@           ::= ?"/\*" -> com         // C形式ブロックコメントの開始
@com:       ::= ?"\*/" -> 0           //                        終了
@com:       ::= ?"."                  //                        無視する文字
@VALNAME    ::= ?"[0-9]+\.[0-9]+[a-zA-Z][a-zA-Z_0-9]*" // 4.0x 2t など
               |?"[0-9]+[a-zA-Z_][a-zA-Z_0-9]*"
@VALUE      ::= ?"[0-9]+\.[0-9]+" | ?"[0-9]*" 
@NAME       ::= ?"[a-zA-Z_][a-zA-Z_0-9]*"
actions     ::= { assignment | range | operation }
assignment  ::= NAME "=" expression [";"]
range       ::= NAME "=" expression "," expression [";"]
expression  ::= term | minus | plus | fract | mul | div | add | sub |pow|mod
              | vector
term        ::= VALUE | NAME | VALNAME | function | "(" expression ")"
function    ::= NAME func_args
func_args   ::= "(" [{ expression &","}] ")"
minus/p:10/ ::= "-" expression
plus/p:10/  ::= "+" expression
fract/p:11/ ::= expression "!"             // 後置演算、階乗 n! -n!は-(n!)
mul/p:5/    ::= expression "*"  expression
div/p:5/    ::= expression "/" expression
add/p:2/    ::= expression "+" expression
sub/p:2/    ::= expression "-" expression
mod/p:5/    ::= expression "%" expression
pow/p:12/   ::= expression "^" expression // -x^2 は -(x^2)
vector      ::= "{" [{ expression &","}] "}"
operation   ::= NAME func_args 
これは実際にプログラムで参照している定義記述、いわばプログラムの一部です。

 使用ライブラリ

本ツールはJavaで作成されています。

数式の構文解析にはオツアンドサンズで公開されている Java用の構文解析ツールSymphonieを使用しています。

Symphonieの仕様はこちらをご覧ください。
http://www.otsu.co.jp/OtsuLibrary/index.htm

 ###

2012/06/20
iPad対策として、Appletの動かない貧弱なブラウザでは 静止画を出すようにした。

|

« ♪第9の4楽章プレスト3拍子の徹底把握 | トップページ | ◇「対等でない」は説明にならない:双子のパラドクス »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: ▲裸眼立体視3Dアニメート数式プロッタ:

« ♪第9の4楽章プレスト3拍子の徹底把握 | トップページ | ◇「対等でない」は説明にならない:双子のパラドクス »