またProcessingで遊んでます。
今度は質点とリンクを増やしてつなげて吊るす。
質点やリンク情報をいくつでも増やせるように、jsonファイルで読み込めるようにしました。つうか、Processingって簡単にjson読めるAPIが実装されてたので、フォーマットだけ考えればよくて、そこは楽でした。
とりあえず実行結果の動画:
これ、30秒あたりからプルプル言いはじめる。バネは入れてますがダンパを入れてないので振動してくるみたい。でも発散しないのはミッドポイント法えらい。
ちなみに、json読込部はこんな感じです:
void loadGeometry() { JSONObject json = loadJSONObject("data.json"); println(json); JSONArray jsonPoints = json.getJSONArray("points"); points = new Point[jsonPoints.size()]; for(int i = 0; i < jsonPoints.size(); i++) { try { JSONObject jsonPoint = jsonPoints.getJSONObject(i); points[i] = new Point(); points[i].p.x = jsonPoint.getFloat("x"); points[i].p.y = jsonPoint.getFloat("y"); points[i].m = jsonPoint.getFloat("m"); points[i].fixed = jsonPoint.getBoolean("fixed"); } catch(Exception e) { println("Exception while read points."); e.printStackTrace(); } } JSONArray jsonLinks = json.getJSONArray("links"); links = new Link[jsonLinks.size()]; for(int i = 0; i < jsonLinks.size(); i++) { try { JSONObject jsonLink = jsonLinks.getJSONObject(i); links[i] = new Link(); links[i].p0 = jsonLink.getInt("p0"); links[i].p1 = jsonLink.getInt("p1"); links[i].k = jsonLink.getFloat("k"); links[i].l = PVector.sub(points[links[i].p0].p, points[links[i].p1].p).mag(); } catch(Exception e) { println("Exception while read links."); e.printStackTrace(); } } }
そして今回作ったデータファイルはこんな感じ。
data.json
{ "points": [ { "x": 300, "y": 50, "m": 1, "fixed": true }, { "x": 250, "y": 50, "m": 1, "fixed": false }, { "x": 200, "y": 50, "m": 1, "fixed": false } ], "links": [ { "p0": 0, "p1": 1, "k": 1000 }, { "p0": 1, "p1": 2, "k": 1000 } ] }
見ればそのまんまの形式です。
“points”で質点情報を記述し、”links”でリンク情報を記述しています。
まとめ
質点を増やした場合にプルプルいいますが、シミュレーションが発散することはありませんでした。さすがミッドポイント法ですね!