Slider談義

Mathematicaのお話。

Sliderと言うコマンドがMathematicaにはありまして。
これはまあ、値をほぼリアルタイムで反映できるスライダーを表示できるものなのですが(音量調整とかでよくあるアレ)。
今回の目的としてはそのSliderを3つ同時に制御しようとしています。

具体的に言うと、3つのSliderにそれぞれx,y,zという3つの値を割り振りまして、{x,y,z}のベクトルを描画したいのです……

ここまでなら、3つのSliderをそれぞれ設置するだけでいいのですが、今回は色々と事情がありまして、ベクトルの長さを1に固定したいんです。

そのため、各Slider間には常にx^2+y^2+z^2=1が成り立ち、かつどれかの要素が増減したときに他の二つの要素が両方とも減増する必要がありました。

ちなみに、この設定はSlider2つであれば簡単にできます。
こんな感じ↓
Slider[Dynamic[x]]
Slider[Dynamic[y=Sqrt[1-x^2],(x=Sqrt[1-#^2])&]]
(*Dynamic:値を常に監視して変化に対応し続ける。動的関数みたいなもの
Sqrt:ルートを取るだけ
#:Sliderとかで動的に動いている値(この場合y)を代入する
&:おそらく定形的な儀式記号。これがないとうまく動かない*)

Dynamicにより、yは常に√(1-x^2)になると同時に、yが変化した場合にはxを√(1-y^2)に変化させることができます。


しかし、これを3つのSliderにそのまま反映させるとまともに動いちゃあくれません。
ひとつのSliderを動かしても、それに同期して動くのは残った2つの内のひとつだけでした。

正直なところ貧弱プログラマーのアルミンにはこの原因が分からず、色々と試しては見たのですが、うまくいきませんでした。
具体的に何をやったのかというと、
(x=Sqrt[1-#^2])&を(x=Sqrt[1-#^2])&(z=Sqrt[1-#^2])&みたいにして2つ動かないかなとやってみたり、
(x=Sqrt[1-#^2])&をx,y,z全部のSliderに組み込んでみたり(ちなみにこれをやると∞ループが発生してMathematicaが停止します。要注意)とかやってみたのですがダメでした。

最終的に3つ同時は半ば諦める形で、今はSliderの横にボタンをつけることで、x,y同期↔y,z同期↔z,x同期が切り替わるようにして擬似的に3連同期させようとしています。


ちなみに、うまくいっていません;;
なぜか動かそうとしたSliderは動かずに、それ以外の二つが一緒に動いたりしますwwww

でもこっちの方が3連よりかは望みがあるのでとりあえず明日も頑張ってみます。
成果がでたら報告したい(´・ω・`)


だれかSliderを3連同期する方法知ってたら教えてー゚(゚´Д`゚)゚