pyorickでマウス制御(工事中)
以下の解説は私の
カスタマイズ用ファイルがインストールされたyorick、およびpyorickが使用可能であることを前提とします。
- 使い方は非常にシンプル!(yorickでのidl関数と概ね同じ):
⇒ for文やwhile文の最後に "if(idlp(パラメータ)): (改行)break" と書くだけ.
ダウンロードとデモの実行
・
説明
制御関数の説明
・
idlp
使用例
・
2次元の例
・
3次元の例
・
反応拡散方程式
ダウンロードとデモの実行
githubからダウンロード
$ git clone https://github.com/yorickuser/pyorick-mouse
$ cd pyorick-mouse/
$ python3 -i pyorick_mouse_rd.py
2次元デモ
$ python3 -i pyorick_mouse_2d.py
3次元デモ
$ python3 -i pyorick_mouse_3d.py
反応拡散モデル
$ python3 -i pyorick_mouse_rd.py
idlp:制御関数
def idlp(yo,idl_sleep,t,myexec,control_funcs=0):
- yo: python内で起動したyorickの名前
- idl_sleep: スピード調節のために行う一時停止
- t: 一時停止したときに表示される値
- myexec: コマンド入力のための関数(一時停止中のコマンドプロンプトからも外の変数が見えるようにするための小細工)
- control_funcs: マウスコントロール用の関数(通常は省略。拡張する場合にのみ有用)
基本操作
window,0が描画用、window,1がマウス制御用のウインドウです。window,1は4つの小窓があります。
- スタート/一時停止:左下窓の左クリック
- 終了:一時停止中に左下窓の右クリック
- コマンド入力:右下窓の左クリック
- 各コマを画像として保存:右下窓の右クリック
- パレットの変更:右上窓の右or左クリック
- 回転:左上窓の中での左クリック
- z軸を中心とする回転:左上窓の下側フレームの少し外側を左クリック
- 移動:描画ウィンドウで中ドラッグ or Shift+左ドラッグ
- 拡大:描画ウィンドウで左クリック
- 縮小:描画ウィンドウで右クリック
補足1:コマンド実行(メニューの"command"をクリック)
コマンド入力モードを抜けるには"exit"と入力。
yorickの関数はyo.c."関数名"で実行できる(例えば画像の保存はyo.c.outpng())。
yo()とタイプすればyorickプロンプトになる(抜けるにはpyと入力)。
nlevsの値を変更する例:
2次元の例
- Rotationの小窓を右クリックすると、描画領域のリセットができます(即ちlimits)
from idl_pyorick import *
def myexec(com):
exec(com)
T=2000
dt=-0.02
yo=Yorick()
yo.c.include("~/Yorick/custom.i")
yo.c.win2()
idlp_init(yo,frame_interval=4,flag_animate=1,flag_frame_out=0,flag_auto_start=0,flag_2d=1,pal="br")
col_cont="green"
nlevs=15
x, y = mgrid[-3:3:64j, -3:3:64j]
z= sin(2*sqrt(x*x+y*y))+cos(x+y)
levs=linspace(-1.5,1.5,nlevs)
yo.c.window(0)
start_animation(yo)
for t in range(0,T):
z= sin(2*sqrt(x*x+y*y)+0.02*t)+cos(x+y+0.013*t)
levs=linspace(-1.5,1.5,nlevs)
yo.c.window(0)
yo.c.draw3_trigger()
yo.c.fma;
yo.c.plfc(z,y,x,levs=levs)
yo.c.plc(z,y,x,color=col_cont,levs=levs)
frame_out(yo,t)
if(idlp(yo,0.0,t,myexec)):
break
yo.c.window(0)
end_animation(yo)
3次元の例
- 2次元座標(x,y)上の値zを時間変化させて、plwfで描画しています。
from idl_pyorick import *
def myexec(com):
exec(com)
T=2000
dt=-0.02
yo=Yorick()
yo.c.include("~/Yorick/custom.i")
yo.c.win2()
idlp_init(yo,frame_interval=4,flag_animate=1,flag_frame_out=0,flag_auto_start=0,pal="br")
col_cont="red"
x, y = mgrid[-3:3:32j, -3:3:32j]
z= sin(2*sqrt(x*x+y*y))+cos(x+y)
yo.c.window(0)
yo.c.win3()
yo.c.setz3(20)
yo.c.plwf(z,y,x,shade=1,edges=1,ecolor="green",scale=1.5)
yo.c.orient3()
yo.c.limit3,-3,3,-3,3,-6,6;
yo.c.cage3(1)
yo.c.limits()
yo.c.scale(0.85)
start_animation(yo)
for t in range(0,T):
z= sin(2*sqrt(x*x+y*y)+0.02*4*t)+cos(x+y+0.013*4*t)
yo.c.window(0)
yo.v.z=z
yo.v.y=y
yo.v.x=x
yo("plwf,z,y,x,shade=1,edges=1,ecolor=green,scale=1.5;limit3,-3,3,-3,3,-6,6;")
frame_out(yo,t)
if(idlp(yo,0.0,t,myexec)):
break
yo.c.window(0)
end_animation(yo)
反応拡散方程式の例
- 2次元座標上のgray-scottモデル(熱帯魚の模様とかを説明できるモデル)の2つの成分のうちの片方の濃度をplfcで描画しています。
from idl_pyorick import *
def myexec(com):
exec(com)
yo=Yorick()
size = 100
gridx, gridy = meshgrid(linspace(0,1,size),linspace(0,1,size))
yo.v.size=size
dif_gridx, dif_gridy =meshgrid(linspace(0.3,2.0,size),linspace(0.3,2.0,size))
dt =0.2
ncal=100
count_interval=10
a = 0.023
b = 0.055
dif_rate_x = (8.0e-2)*dif_gridx
dif_rate_y = (4.6e-2)*dif_gridy
x=gridx*0+1.0
y=gridy*0+0.001
y[int(size/2),int(size/3)] = 0.5;
diffuse_mask=hstack((array([0]),array(range(size)),array([size-1])));
T=2000
yo.c.include("~/Yorick/custom.i")
yo.c.win2()
idlp_init(yo,frame_interval=4,flag_animate=1,flag_frame_out=0,flag_auto_start=0,flag_2d=1,pal="cr")
nlevs=20
levs=geomspace(0.05,0.6,nlevs)
yo.c.window(0)
yo.c.fma()
yo.c.plfc(y,gridy,gridx,levs=levs)
yo.c.xyt("Diffusion rate for x", "Diffusion rate for y")
yo.c.limits()
start_animation(yo)
for t in range(0,T):
for k in range (1,ncal):
diffuse_x=yo.v.diffuse_x
diffuse_y=yo.v.diffuse_y
diffuse_x=diff(x[:,diffuse_mask],n=2,axis=1)+diff(x[diffuse_mask,:],n=2,axis=0)
diffuse_y=diff(y[:,diffuse_mask],n=2,axis=1)+diff(y[diffuse_mask,:],n=2,axis=0)
x += dt*(-1.0*x*y*y + a*(1.0-x) +dif_rate_x*diffuse_x);
y += dt*(x*y*y - (a+b)*y+dif_rate_y*diffuse_y);
if t%count_interval==0:
print(t*ncal)
yo.c.window(0)
yo.c.draw3_trigger()
yo.c.plfc(y,gridy,gridx,levs=levs)
yo.c.xyt("Diffusion rate for x", "Diffusion rate for y")
yo.c.redraw()
frame_out(yo,t)
if(idlp(yo,0.0,t,myexec)):
break
yo.c.window(0)
end_animation(yo)