徒然なるままにプログラミング
やる気でないときありますよね。
物理の勉強を始めて早10年、モチベーションの維持に事欠くことはなかった物理系の院生が対処法をお伝えします。
寝ましょう。
今日はボールを多段反射できるようにしました。前回の実装の仕方があまりに陳腐でしたね。構造体も導入して見やすくしてみました。
構造体とは:変数を一括で管理する場所
みたいなものです。コードが長くなってくると、
「どこで変数定義したっけ~」 「変数追加したいんだけど~」
みたいになるでしょう。構造体があれば、そこで定義したものはどこでも使えます。便利ですね。
使い方を書いておきましょう。
Structure 構造体名
変数型 変数名1
変数型 変数名2
・・・
endStructure
Function 変数初期化()
STRUCT 構造体名 st //今後この関数内では構造体名のことをstと呼びます
st.変数名1 = 変数 //stにおける変数名1に変数を代入しました
st.変数名2 = 変数 //stにおける変数名2に変数を代入しました
変数実行(st) //変数実行という関数にstを代入します
end
Function 変数実行(st)
STRUCT 構造体名 &st //stと呼ばれる構造体名の中身を&stとして取り出します
print st.変数名,st.変数名 //この関数内で新たに変数を定義する必要はありません
end
こんな感じです。新しい関数の中で新しく変数を定義せずとも良いのがうれしいところです。
最初は何のメリットがあるかわからないかもしれませんが、習うより慣れよです。とりあえず、使ってみましょう
(プログラミングをちゃんとやってる人からしたら少しまずい内容かもしれませんが、備忘録だし許してください)
ボールはこんな感じです。かわいいね。
Function Main()
Newmovie/O/F=60 //動画の保存
Setup()
Initialize_Variables(1,200)
closemovie
end
Structure myVariable //構造体
double MovieTime
double vector_x,vector_y
Wave w_x,w_y
endstructure
Function Initialize_Variables(variable velocity,variable MovieTime)
STRUCT myVariable mv //構造体の導入
//___変数代入
mv.MovieTime = MovieTime
mv.vector_x = enoise(velocity)
mv.vector_y = enoise(velocity)
//___ボールの追加
make/O/N=1 Pos_X = enoise(1),Pos_Y = enoise(1)
AppendtoGraph/W=PosDisplay/C=(65535,0,0) Pos_Y[0,0] vs Pos_X[0,0]
ModifyGraph mode=3,marker=19,msize=10
//___move()へ構造体を代入
move(mv)
end
Function Setup()
//____画面の作成
make/O/N=1 dummy
dowindow/K PosDisplay
dowindow/F PosDisplay
Display/W=(30,30,430,430)/N=PosDisplay dummy
ModifyGraph hideTrace(dummy)=1,tick=3,mirror=1,noLabel=1,margin=28
Setaxis Left -11,11
Setaxis bottom -11,11
End
Function move(mv)
STRUCT myVariable &mv //構造体の開放
variable n
Wave Pos_X,Pos_Y
for(n=0;n<mv.MovieTime;n++)
//____ボールの座標
Pos_X += mv.vector_x
Pos_Y += mv.vector_y
//___端で反転
if(Pos_X[0] > 10 || Pos_X[0] < -10)
mv.vector_x = mv.vector_x*-1
elseif(Pos_Y[0] > 10 || Pos_Y[0] < -10)
mv.vector_y = mv.vector_y*-1
endif
//____画面の更新
doupdate/W=PosDisplay/E=1
//____動画の保存
AddMovieframe
endfor
end
それらしくボールが動いてきました。次はボールの数を増やしたいですね。
さぁ、土曜だし、寝るか