pyorickでマウス制御(工事中)

以下の解説は私のカスタマイズ用ファイルがインストールされたyorick、およびpyorickが使用可能であることを前提とします。



ダウンロードとデモの実行

説明

制御関数の説明

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):

基本操作

window,0が描画用、window,1がマウス制御用のウインドウです。window,1は4つの小窓があります。

補足1:コマンド実行(メニューの"command"をクリック)

コマンド入力モードを抜けるには"exit"と入力。
yorickの関数はyo.c."関数名"で実行できる(例えば画像の保存はyo.c.outpng())。
yo()とタイプすればyorickプロンプトになる(抜けるにはpyと入力)。
nlevsの値を変更する例:
global nlevs; nlevs=5;




2次元の例

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次元の例

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)



反応拡散方程式の例

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)