python写的动画,用的是Vpython库,需要从VTK官网下载,目前3.x的python只有3.3有这个库,3.4还没有。依旧用的是欧拉折线法绘制电场线的轨迹,和上一篇的Fortran是一样的算法。
Python |copy code |?
01 #!/usr/bin/python
02 from visual import *03 import cmath as cm04 import numpy
05 06 ball1=sphere(pos=(1.0,1.0,0.0),radius=0.3,color=color.red)07 ball2=sphere(pos=(-1.0,1.0,0.0),radius=0.3,color=color.blue)08 ball3=sphere(pos=(-1.0,-1.0,0.0),radius=0.3,color=color.red)09 ball4=sphere(pos=(1.0,-1.0,0.0),radius=0.3,color=color.blue)10 ball=[ball1,ball2,ball3,ball4]11 q=numpy.array([1.0,-1.0,1.0,-1.0])12 ground=box(pos=(0.0,0.0,0.0),size=(12.0,12.0,0.1),opacity=0.2)13 dt=0.00214 N=3015 rate(5)16 17 for i in range(len(q)):18 for j in range(N):19 p=0.32*cm.exp(j*cm.pi*(0.0+1.0j)*2./real(N))20 line=sphere(pos=(ball[i].x+p.real,ball[i].y+p.imag,0.0),21 radius=0.02,color=color.red)22 line.trail=curve(color=line.color)23 line.trail.append( pos = line.pos, color = (1, 0, 0))24 while not(abs(line.pos)>15.0 or abs(line.pos-ball[1].pos)<0.3225 or abs(line.pos-ball[2].pos)<0.32 or abs(line.pos-ball[3].pos)<0.3226 or abs(line.pos-ball[0].pos)<0.32):27 E=line.pos*0.028 if i in [0,2]:29 for k in range(len(ball)):30 E+=q[k]*(line.pos-ball[k].pos)/abs(line.pos-ball[k].pos)**3.031 else:
32 for k in range(len(ball)):33 E-=q[k]*(line.pos-ball[k].pos)/abs(line.pos-ball[k].pos)**3.034 35 line.pos+=dt*E/abs(E)36 line.trail.append( pos = line.pos, color = (1, 0, 0))37
效果如图:
0