また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”でリンク情報を記述しています。
まとめ
質点を増やした場合にプルプルいいますが、シミュレーションが発散することはありませんでした。さすがミッドポイント法ですね!
