2012-01-14 11 views
2

私は助けが必要です。 Graphics[]コマンドで使用する多くの変数がありますが、これは1つの変数(私の例ではH)に依存しています。私はグラフィックを操作して、Hグラフィックの値をそれに応じて変化させるようにしたい。しかし、私が思ったほど簡単ではありません。mathematicaで出力を調整する

これをacomplishする方法上の任意のアイデアを持っている場合は、私は感謝されます。

これは私の解決策の1つですが、実際には面倒です。私がやったのは、それらの値を手動で差し込んだだけです。それは常にサイズです変更することなく、私のグラフィックを作る方法を

R = 10; 
n = 1.5; 
Manipulate[ 
Graphics[{(*Incident ray*) 
    Line[{{-2, H}, {H/Tan[ArcSin[H/10]], H}}],(*Prism*) 
    Circle[{0, 0}, R, {0, Pi/2}], 
    Line[{{0, 0}, {0, 10}}],(*Refracted ray*) 
    Line[{{H/Tan[ArcSin[H/10]], 
     H}, {H/Tan[ArcSin[H/10]] + 
     H/Tan[ArcSin[n Sin[ArcSin[H/10]]] - ArcSin[H/10]], 
     0}}],(*Surface*) 
    Line[{{0, 
     0}, {H/Tan[ArcSin[H/10]] + 
     H/Tan[ArcSin[n Sin[ArcSin[H/10]]] - ArcSin[H/10]] + 10, 
     0}}]}], {H, 0.0001, 10, Appearance -> "Labeled"}] 

もこれをacomplishする任意のより適切な方法はあります。私はプリズムがその位置を変えるために固定サイズと入射光線を持つことを望んでいます(上記の私の例でHが> 6.66になると起こります)。

質問は多分混乱されていますが、Mathematicaでそれをしようとした場合、あなたは私が欲しいものを見るでしょう。ご意見ありがとうございます。

答えて

7

あなたのソリューションは一般的に悪くないと思いますが、マークはすでに彼の返事に気づいています。私はMarkのソリューションのシンプルさも好きでした。私は実験のためだけに私のアイデアを共有しています。

1)常にその値が漏れや他の動的コンテンツに干渉しないように、操作する特定のためのあなたの変数を局所化するのは良いことです。ノートブックに追加の計算がある場合は重要です。それらはお互いのリセットを開始することがあります。この特定のケースで

2)あなたは、式のあなたの方程式が複雑になったお互いに1を差し込む余分な変数の読みを取得しようとすると、彼らが何度か失敗する理由を知ることは困難です。関数TrigExpandとFullSimplifyの助けを借りた代数のビットは、あなたの変数Hが屈折率の値n(下記参照)に応じて制限があることを明確にするのに役立ちます。

3)もし私がポイント(2)を知っていれば、変数nもダイナミックにすることができ、コントロール定義の値Hをnにリンクする(Hの上限をリセットする)ので、常にH </n。 [..]が必要な場合は、コントロールが "ピンク"にならないようにしてください。

4)数式がRに依存する場合は、Rを動的にすることもできます。しかし、私はこの情報を持っていないので、私は "ダミー"コントロール(ControlType - > None)の概念を使ってRをローカライズしました。これはManipulateにとって非常に便利な概念です。グラフィック

6の揺れを停止する

5)使用PlotRangeとImageSizeをは)それは美しい、あなたがしたい場合;-)

これらの点は重要であろう、例えば、にデモンストレーションを提出するようにしてくださいWolframデモンストレーションプロジェクトあなたが周りを遊んでいるなら、あなたとMarkのソリューションはとても良いと思います。

おかげで、

Manipulate[If[H >= 10/n, H = 10/n - .0001]; Graphics[{ 
    {Red, Thick, Line[{{-2, H}, {Sqrt[100 - H^2], H}}]}, 
    {Blue, Opacity[.5], Disk[{0, 0}, R, {0, Pi/2}]}, 
    {Red, Thick, Line[{{Sqrt[100 - H^2], H}, 
    {(100 n)/(Sqrt[100 - H^2] n - Sqrt[100 - H^2 n^2]), 0}}]}}, 
    Axes -> True, PlotRange -> {{0, 30}, {0, 10}}, 
    ImageSize -> {600, 200}], {{R, 10}, ControlType -> None}, 
{{n, 1.5, "Refraction"}, 1.001, 2, Appearance -> "Labeled"}, 
{{H, 3, "Length"}, 0.0001, 10/n - .0001, Appearance -> "Labeled"}] 
+0

ところで、あなたのコードからいくつかの固定された行を削除しました - それを元に戻すのは簡単です。 –

+0

私は細かく見ていませんが、小さなバグがあるようです。 「長さ」スライダは「10/n」で停止しません。あなたがそれを過ぎると、それは0.0001に戻されます。同様に、「屈折」スライダを長めにして> 10/nとすると、長さは0に戻りますが、スライダは自由に動くことができます。私はそれの物理学とそれがなぜ起こるか知っていますが、自由にリセット/移動するのではなく、スライダが停止した方が良いかもしれません。いずれにしても、Stack Overflowへようこそ。提案にコミットしてくれてありがとう。 – abcd

+0

これを指摘してくれてありがとう、Yoda、そして暖かい歓迎のおかげです。私はコードを少し調整しました。 –

5

私は、コードのあなたの最初のバッチは正常に見えるとManipulateに配置するのは簡単だと思います。 GraphicsPlotRangeオプションを使用することをおすすめします。

R = 10; 
n = 1.5; 
Manipulate[ 
    \[Alpha] = ArcSin[H/R]; 
    p = H/Tan[\[Alpha]]; 
    \[Beta] = ArcSin[n Sin[\[Alpha]]]; 
    \[Theta] = \[Beta] - \[Alpha]; 
    l = H/Tan[\[Theta]]; 
    Graphics[{ 
    Line[{{-2, H}, {p, H}}],(*Prism*) 
    Circle[{0, 0}, R, {0, Pi/2}], 
    Line[{{0, 0}, {0, 10}}],(*Refracted ray*) 
    Line[{{p, H}, {p + l, 0}}],(*Surface*) 
    Line[{{0, 0}, {p + l + 10, 0}}]}, 
    PlotRange -> {{-1,33},{-1,11}}], 
    {H,0.0001,6,Appearance->"Labeled"}] 
+0

Vitaliyは、あなたが私の問題を解決し、ありがとうございます。操作は本当に強力です。 – balboa

関連する問題