またProcessingで遊んでます。
今度は質点とリンクを増やしてつなげて吊るす。

質点やリンク情報をいくつでも増やせるように、jsonファイルで読み込めるようにしました。つうか、Processingって簡単にjson読めるAPIが実装されてたので、フォーマットだけ考えればよくて、そこは楽でした。

とりあえず実行結果の動画:

Processingでバネマス系シミュレーション(2リンク3質点)

これ、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”でリンク情報を記述しています。

まとめ

質点を増やした場合にプルプルいいますが、シミュレーションが発散することはありませんでした。さすがミッドポイント法ですね!

今回のProcessingプロジェクト

sketch_20210823_2310.zip

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です