log
西尾泰和のブログ: 日記から移動。
JSON形式での保存と読み込みのテスト。 頂点と辺はきちんと復元されることを確認。 たしか追加で入れた物理法則が再現されない状態だったはず。 頂点のアンカーは外れてしまうことを確認。
使い勝手の悪い、コンソールでコマンドを入力するタイプだけども、一応マインドマップを作って保存/読み込みできる。
「ゆるいバネ」を作ろうかな。自然長以上に引っ張ったときは引力を発生させるけど、逆に圧縮されたときは反発しない。あと一定以上に強く引っ張られたらへたって引力が弱くなる。あー、でも一度へたってしまっても、しばらく近づけておいておくとだんだん元に戻って欲しいなぁ。その方が気持ちいいはず。
InvocationTargetExceptionはタイミングの問題で発生するようだ。 InvocationTargetException (Java 2 プラットフォーム SE v1.4.0) ラップされた例外だそうなので、中身を表示させる。
ああ、boundか…。 現状では頂点を作成したときにboundはnullになっていて、 renderが呼ばれた場合にboundがnullなら再計算する仕組みになっています。 これはboundの計算にグラフィックコンテキストが必要だからです。で、タイミングの問題で、普段は十分に描画が早いためにaddVertexとgetParamsの間にrenderの呼び出しが入るためにboundがnullではなくなるのですが、早いプログラムで一気に頂点を足した場合に稀にrenderが呼ばれる前にgetParamsが呼ばれてしまい、nullをVectorに変換しようとしてNullPointerExceptionを投げているわけです。さて、どうしましょうか。
- boundをnullではない値で初期化する。[-1, -1]とか。
- 変換メソッドの中で返すべき値がnullの場合に代わりに何か返す。
- ユーザが「失敗したこと」に気づかずにその値を使って、正だと思っていた値が負だったりして面倒なバグを引き起こしそう。
- NullPointerExceptionを投げる。XML-RPCのクエリを投げた側はその例外を受け取ってうまく行かなかったことを知る。
-
java.lang.NullPointerException at org.nishiohirokazu.grinEdit.UtilCast.point2Vector(UtilCast.java:150) at org.nishiohirokazu.graph.BoxVertex.getParams(BoxVertex.java:62)
と言われて、Javaのソースを見ないと原因がわからない。
-
- っていうか今positionの値が必要なだけなのに全部のパラメータをまとめて返してくるAPIが悪いんじゃない?
- まぁ、今フィールドの数だけsetterがあるのに、さらにgetterも作ることになるけど…まぁ、これはやるべきことかも。
- 面倒だからsetter/getter生成スクリプトをPythonで書く。
- これをやっても、やっぱりboundの値をユーザが取得しようとして失敗する可能性は残っているから今回の問題の本質的な解決にはなってない。
- 明日デモするプログラムにそんな広い範囲の修正は掛けたくない。
- とりあえず今日はboundの値を返すコードだけコメントアウトでいいんじゃない?セーブ/ロード時にboundの値が欠けるけど、欠けたら自動的に再計算されるわけだし。
- まぁ、今フィールドの数だけsetterがあるのに、さらにgetterも作ることになるけど…まぁ、これはやるべきことかも。
座標をデフォルトの値に戻すコマンドが欲しいかも。
たかだか300頂点で15FPSまで落ちてしまうことがある。長い紐状のグラフがぐるぐる巻きの状態になってしまったときに、外側の頂点の拡散を辺の引っ張る力が邪魔をするために、頂点が密集した負荷の高い状態が持続してしまう現象。
デフォルトの物理演算は、イヤならはがせるわけだから、機能てんこ盛り路線でいいのかも。それなら「反発力がなかなか減らないときには拡散を加速する」という物理法則を入れる手がある。