Skip to content

一次元バネ

##仕様指示書

バネの運動のシミューレーションを P5jsを使って可視化するためのソースコードを出力する

  • 質量を持つ球がバネで繋がれている1次元の環境を想定する
  • その環境に重力はない
  • 運動をシミュレーションするための時間粒度を定義し運動を定義する
  • 球がバネでつながっている、この系をI系と呼ぶ
  • 複数のI系を含む系をII系と呼ぶ
  • II系の内部のI系を示すためのインデックスをiとする
  • I系内部の、バネ、球はインデックスjを使って指し示すことができる
  • i番目のI系には、バネがN[i]-1個存在している。それぞれをiとする
  • i番目のI系のj番目のバネそれぞれをspring[i][j]で表す
  • i番目のI系のj番目のバネの長さの半分をlength[i][j]とする
  • i番目のI系のj番目のバネのバネ定数はk[i][j]とする
  • i番目のI系のj番目のバネは、相対x座標上0座標を中心に置かれている。
  • すべてのバネに質量はない
  • i番目のI系には、N[i]個の球がある
  • それぞれをmass[i][j]と呼ぶ
  • 球の質量はm[i]とする
  • i番目のI系のj番目のバネspring[i][j]の両端にはmass[i][j]とmass[i][j+1]が取り付けられている
  • i番目のI系のj番目の球mass[i][j]のx座標をmass[i][j].xとする
  • i番目のI系のj番目の球mass[i][j]のx座標方向の速度をmass[i][j].vxとする
  • i番目のI系のj番目の球mass[i][j]のx座標方向の加速度をmass[i][j].axとする
Fx[i][j]=k[i][j](x[i][j+1]x[i][j]2length[i][j])k[i][j](x[i][j]x[i][j1]2length[i][j]) Fx[i][j] = k[i][j]*(x[i][j+1]-x[i][j]-2*length[i][j])-k[i][j]*(x[i][j]-x[i][j-1]-2*length[i][j]) Fx[i][j]=m[i][j]ax[i][j] Fx[i][j] = m[i][j]*ax[i][j]
  • これによりバネが伸びたときには縮む力、バネが縮んだ時には伸びる力が働く
  • I系、II系ともに同じ時間経過を共有し描画間隔となる時間の進みをDTとする
  • すべてのI系はキャンバスで左側にLEFT_GAPを空けた位置がmass[i][j]のmass[i][j]=0の時の値である
  • すべてのI系はキャンバス縦方向に等間隔でキャンバスいっぱいにM個並んでいる
  • 系に色を付けるかつけないかのCOLOREDというスイッチで制御する
  • COLOREDがTRUEの時に使う色を以下のように定義する
  • spring[i][j]の長さが最小のときにspring[i][j].colorになる
  • spring[i][j]が長さが最大のときにWHITE_COLORになる
  • spring[i][j]がその中間の長さの時にはspring[i][j].colorとWHITE_COLORの間のグラデーション色とする
  • spring[i][j]を描く時のstrokeはspring[i][j].weightとする
  • COLOREDがTRUEの時に使う色を以下のように定義する
  • mass[i][j]の速度の絶対値が最大のときにmass[i][j].colorになる
  • mass[i][j]の速度が0の時にWHITE_COLORになる
  • mass[i][j]がその中間の速度の時にはmass[i][j].colorとWHITE_COLORの間のグラデーション色とする
  • mass[i][j]の球の半径はradius[i][j]とする
  • 球を描くときのstrokeは0とする
  • 初期状態は最初にすべて同じ値を与える関数と乱数により差分を与える関数を分けて定義する
  • mass[i][j].m
    • 球の、質量の初期状態をWと設定する
  • mass[i][j].radius
    • 球の、半径の初期状態をRADIUSと設定する
  • mass[i][j].color
    • 球の、色の初期状態をMASS_COLORと設定する
  • mass[i][j].dx
    • 球のx軸方向位置の安定位置からの差分の初期状態をDXと設定する
  • mass[i][j].vx
    • 球の、x軸方向の速度の初期状態をVXと設定する
  • mass[i][j].ax
    • 球の、x軸方向の加速度の初期状態をAXと設定する
  • spring[i][j].k
    • バネspring[i][j]定数の初期状態をKと設定する
  • spring[i][j].length
    • バネのlength[i][j] の初期状態をLと設定する
  • spring[i][j].color
    • バネの色の初期状態をSPRING_COLORと設定する
  • spring[i][j].weight
    • バネの spring_color[i][j]の初期状態をSPRING_WEIGHTと設定する
  • 各変数に初期状態を与えた後は。乱数により。さらに初期状態を変更する
  • 各球mass[i][j]の任意の複数の要素を指定し、乱数を加算することが可能な関数を作成する。
  • その関数は一つのglobal変数を参照して加算すべき値を決定する
  • そのglobal変数は「要素、乱数の最大値、乱数の最小値」の要素を持つ配列とする
  • そのglobal変数をjsonのデータを以下の要領で作成すること
  • 各球のdxの初期値に対して-10から+10の間の値を別々に発生させた乱数を個別に加算
  • 各球のradiusの初期値に対して -1から +3の間の値を別々に発生させた乱数を個別に加算
  • 各バネspring[i][j]の任意の複数の要素を指定し、乱数を加算することが可能な関数を作成する。
  • その関数は一つのglobal変数を参照して加算すべき値を決定する
  • そのglobal変数は「要素、乱数の最大値、乱数の最小値」の要素を持つ配列とする
  • そのglobal変数をjsonのデータを以下の要領で作成すること
  • 各バネのweightの初期値に対して -1から +1の間の値を別々に発生させた乱数を個別に加算
  • 以下を定数として定義する
const N = 31; // I系の球の数
const M = 29; // II系内のI系の数
const K = 1.1; // ばね定数
const L = 20; // ばねの半分の長さ
const SPRING_WEIGHT = 2; // バネ描画時の線の太さ
const RADIUS = 10; // 球の重さ
const DX=20; // 球の初期位置の変位
const VX=0; // 球の初期速度
const AX=0; // 球の初期加速度
const DT = 0.1; // シミュレーションの時間の粒度
  • MASS_COLOR をRGB値の値を255,0,0とする
  • WHITE_COLORというRGB値を255,255,255とする
  • LEFT_GAPの値を RADIUS*0.5とする
  • COLOREDの値はfalseとして定義し、シミュレーションを実行してください。
  • マウスを左クリックするたび新しい初期の状態に戻ってシミュレーションを開始する
  • 人類が手動編集でミスを犯してバグを混入する可能性を最小にする方法でファイルを出力すること
  • 関数内部の部分部分に変更が加わる場合は、関数単位でソースコードの出力を省略なしに行う
  • 複数の関数の変更が加わる場合は、ファイルすべてのソースコードの出力を省略なしに行う
  • 仕様変更によってソースコードに変更が加わるときは、変更点と理由をコメントとして書き込む
  • ソースコードを削除する場合はコードはコメントアウトし、理由をコメントとして含める