質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

654閲覧

python3で偏光の様子のアニメーションを描きたい

uc200

総合スコア32

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/06/26 08:32

###前提・実現したいこと
python3で偏光の様子のアニメーションを作りたいです。下の画像のように、紫の波を赤、青の二つの方向の波の合成波で表します。ここで、赤か青の波のどちらか一方の速度を遅くすると、合成波は円偏光や楕円偏光を示すようになります。その様子をアニメーションで表したいです。
合成波

###発生している問題
下の図で、波が直方体の中を通るときだけ、青い波の速度が遅くなるようにしたいです。しかし、そのやり方が分かりません。どなたか分かる方ご教授ください。
よろしくお願いします。

イメージ説明

###該当のソースコード
ここまで書いたコードを載せておきます。

python3

1fig = plt.figure() 2ax = fig.gca(projection='3d') 3f=np.pi/6 4d=np.pi/2 5t=[] 6 7 8def solid(x,y,z,lx,ly,lz,depth,iro): 9 u1=[x,x+lx] 10 v1=[z,z+lz] 11 X1,Y1=np.meshgrid(u1,v1) 12 ax.plot_surface(X1,y,Y1,alpha=depth,color=iro) 13 ax.plot_surface(X1,y+ly,Y1,alpha=depth,color=iro) 14 15 u2=[x,x+lx] 16 v2=[y,y+ly] 17 X2,Y2=np.meshgrid(u2,v2) 18 ax.plot_surface(X2,Y2,z,alpha=depth,color=iro) 19 ax.plot_surface(X2,Y2,z+lz,alpha=depth,color=iro) 20 21 u3=[y,y+ly] 22 v3=[z,z+lz] 23 X3,Y3=np.meshgrid(u3,v3) 24 ax.plot_surface(x,X3,Y3,alpha=depth,color=iro) 25 ax.plot_surface(x+lx,X3,Y3,alpha=depth,color=iro) 26 27 plt.show() 28 29 30def update(i): 31 32 if i==0: 33 del t[:] 34 else: 35 pass 36 37 if i !=0: 38 plt.cla() 39 40 X1=0 41 Y1=0 42 Z1=0 43 U1=-np.cos(i/10)*np.sin(f)*np.cos(f) 44 V1=np.cos(i/10)*np.sin(f)*np.sin(f) 45 W1=0 46 47 X2=0 48 Y2=0 49 Z2=0 50 U2=np.cos(i/10)*np.sin(f)*np.cos(f) 51 V2=np.cos(i/10)*np.cos(f)*np.cos(f) 52 W2=0 53 54 X3=0 55 Y3=0 56 Z3=0 57 U3=U1+U2 58 V3=V1+V2 59 W3=0 60 61 X4=[X1,U1] 62 Y4=[Y1,V1] 63 Z4=[Z1,W1] 64 X5=[X2,U2] 65 Y5=[Y2,V2] 66 Z5=[Z2,W2] 67 X6=[X3,U3] 68 Y6=[Y3,V3] 69 Z6=[Z3,W3] 70 71 ax.set_xlim(-1.5,1.5) 72 ax.set_ylim(-1.5,1.5) 73 ax.set_zlim(0,3) 74 ax.axis("off") 75 ax.plot(X4,Y4,Z4,"-",c="r",lw=2) 76 ax.plot(X5,Y5,Z5,"-",c="b",lw=2) 77 ax.plot(X6,Y6,Z6,"-",c="m",lw=2) 78 79 t.append(i) 80 t1=np.array(t) 81 82 x1=-np.cos((i-t1)/10)*np.sin(f)*np.cos(f) 83 y1=np.cos((i-t1)/10)*np.sin(f)*np.sin(f) 84 z1=t1/100 85 86 87 x2=np.cos((i-t1)/10)*np.sin(f)*np.cos(f) 88 y2=np.cos((i-t1)/10)*np.cos(f)*np.cos(f) 89 z2=t1/100 90 91 x3=x1+x2 92 y3=y1+y2 93 z3=z1 94 95 ax.plot(x1, y1, z1,"-", c="r") 96 ax.plot(x2, y2, z2,"-", c="b") 97 ax.plot(x3, y3, z3,"-", c="m") 98 solid(-1,-1,2,2,2,0.5,0.4,"black") 99 100 101 102 103ani = anm.FuncAnimation(fig, update, \ 104 interval = 15, frames = 500) 105 106plt.show() 107 108 109

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

上下方向に対する位置を媒介変数tで表すとして、波形を正弦波で表現するなら

v = sin(f(t))

のような形になるかと思います。f(t)は最も単純な場合、定数Cを用いて

f(t) = C * t

でよいでしょう。さてある特定の区間上(0 < T1 <= t < T2)だけf(t)の傾きをC2にし、それ以外ではC1としておきたいという場合、

区間f(t)
0 <= t < T1C1 * t
T1 <= t < T2C1 * T1 + C2 * (t - T1)
T2 <= tC1 * (t + T1 - T2) + C2 * (T2 - T1)

のような考え方でよいのではないでしょうか?

投稿2017/06/26 09:40

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uc200

2017/07/03 04:06

ありがとうございます! 早速試してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問