東京へ帰る新幹線にて
頂点に力をかけるのが出来るようになりました。 新しいMouseOperationを追加する予定だったのですが、 ほとんどMO_MoveVertexと同じだと気がついたのでMO_MoveVertexに追加してみました。 頂点をドラッグすると移動して、普通に離すとその場に固定されます。 そしてShiftを押しながら離すと、固定されません。 新しく追加した機能は「Ctrlを押しながら離したら直前の移動量分の力がかかり続ける」と「Ctrl+Shiftを押しながら離せば力が消える」というものです。(大きなネットワークを投げたときに自然じゃないので修正される予定)
入れ子に出来る頂点作成ログ
- BoxVertex.javaをコピーしてNestableVertex.javaを作る。
- しばらく眺める
- コピーじゃなくて継承でよかったと気づく
- NestableVertexにBoxVertexを継承させて、フィールドを削ってみる
- privateなフィールドをprotectedに変更
- コンストラクタの中身をsuper()にする
- renderメソッドだけ残してすべてのメソッドを消す。priveteなメソッドの一部をprotectedに変更
- Jythonコンソールから頂点を作成してみて、この時点で動くことを確認しておく。
- (修正済み)CommonGatewayインスタンスは組み込み名前空間に入っていない?「cg = med.getCommonGateway()」などとやって取得しないと行けないのは面倒。
- (修正済み)Jythonから「cg.addVertex("NestableVertex", {})」とやると「TypeError: addVertex(): 2nd arg can't be coerced to java.util.Hashtable」になる。「import java」して「cg.addVertex("NestableVertex", java.util.Hashtable())」ならOK。これも面倒。
- いちいちJythonコンソールを起動してこういうことをするのは(コンソールの起動待ちが特に)面倒なのでnestableVertexTest.pyを作成。実行時に起動するように設定。
- 今のテスト用のスクリプトがちょっと微妙だからPyUnitを使えるか試してみよう
- 起動すると頂点が出ることを確認。
- NestableVertexにList
childrenというフィールドを追加。 - List
か。 - 「public void addChild(NestableVertex v)」を作る。テスト用スクリプトからそれを呼ぶ。
- 子のサイズを見て自分のサイズを適切に調整。
- 自分をレンダリングする際に子もレンダリング、ただし同じ位置に。
- さてと、もう新横浜だ。後は子供が自分で自分を描画しないようにする必要があり、親に対して適切な位置にとどまる必要がある。これは制約で実装する。NestableVertex自体が制約で、コンストラクタで自分自身を制約リストに登録するとか。あ、ダメだ、Javaは多重継承が出来ないから頂点が制約にはなれないや。
- 子供が自分自身を描画せず、親が全部描画するようにした。しかし子の位置を動かして親の付近に固定すると、おそらくそれに反発して親の頂点が動いてしまうだろう。今は位置をいじらずに外見だけ親の中に入れている。親と子は反発して欲しくないが、子から他の頂点への辺は子の中心から出て欲しいし、その辺ももちろん引力を保って欲しいので「中に入れられた頂点は物理演算の対象から外す」という方法では解決できない。さてどうするか。
- 子も親からの反発力で動くようにした上で、重心の位置と傾きを保持する制約で形を保たせる。これが物理的には一番正しそう。これならば子供につながっている辺が及ぼす引力で親も動くし、子と親の間にどんな力が働いているかわからなくても作用反作用の法則で全部打ち消されてくれるはず。
GRINEdit用語集
MouseOperation:各種マウス操作を受け持つクラス、またはそのオブジェクト。MouseOperationクラスの子クラスである。
todo
- (修正済み)Jythonから「cg.addVertex("NestableVertex", {})」とやるとエラーになる件。addVertexなどのメソッドがHashtableではなくObjectを受け取り、リフレクションするとか。(これではXML-RPCでリフレクションでメソッドを探すときに失敗するのでダメ)
- JavaがHaskellみたいに複数の型をまとめて新しい型に出来ればいいのにねー。
- Hashtableを受け取るメソッドと、PyDictを受け取るメソッドの二つを作ればリフレクションするまでもないか。
- PyUnitを試す
- 選択部分のバネの自然長を縮めるコンソールでの作業が出来るかチェック。いくつかのデモの要素をテストできるようにしておく。