徒然なるままにプログラミング

やる気でないときありますよね。

物理の勉強を始めて早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

こんな感じです。新しい関数の中で新しく変数を定義せずとも良いのがうれしいところです。

最初は何のメリットがあるかわからないかもしれませんが、習うより慣れよです。とりあえず、使ってみましょう

(プログラミングをちゃんとやってる人からしたら少しまずい内容かもしれませんが、備忘録だし許してください)

画像1

ボールはこんな感じです。かわいいね。


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

それらしくボールが動いてきました。次はボールの数を増やしたいですね。


さぁ、土曜だし、寝るか


この記事が参加している募集

おうち時間を工夫で楽しく

最近の学び

この記事が気に入ったらサポートをしてみませんか?