制約と力
「この種類の頂点は壁にへばりつく」とか「頂点は画面外には出ない」などは、力として実装すると他の力の影響を受けて満たされないケースが出てくる。他の力の計算が終わり、頂点の位置を更新した後で、そういう「制約」だけ計算してやればよいが、この場合、複数の制約があるとやっぱりお互いに影響を与えあって両方満たされなくなる。いままでは「物理法則」に「優先度」をもうけて、優先度の高いものほど後から計算されるようにしようかと思っていたけども、それはいまいち宣言的じゃない。「物理法則」の特殊なバージョンとして「終了条件」を持った「制約」を作って、その終了条件が満たされるまで演算を繰り返すほうが「物理演算の適用される順番」なんていう些末なことに悩む必要がなくなるのでいいのかも知れない。
物理演算整形ライブラリの目指しているところは「物理演算でのレイアウトを宣言的に記述できる」という所です。「辺は引力を持つ」「頂点間に斥力が働く」「画面外には出ない」「壁は吸着力を持つ」などと書くだけで、動的レイアウトが可能になるのを目指しています。部分的には実現しています。課題は今述べたような「足を引っ張り合う制約」などです。
ハングアップを防ぐために最大繰り替えし数を決めて、規定回数の演算で制約が満たされなかった場合はレイアウトを一時停止する、というのもツールとしては悪くない落としどころかも知れませんね。
「宣言的」という言葉の説明をすべきかなぁ、とググったら制約プログラミングの説明のページがあったので参考までに貼っておきます。constraint.org/INTRODUCTION