木構造を描写すると重なる
vectorに入った要素をある順序で木構造で表現しようとしてます。
まず
bbについてですがi=0から増えていくごとに0,-1,1,-2,2というようになります。これにより一つ目の子ノードは親ノードのy座標と同じ位置で次はposY(親ノードのY座標)-1*y1*2となり次は反対側にという風に下上下上という風に描写していきます。それを再起呼び出しで繰り返すことで全ての文字を木構造表現しています。
木構造の表現は出来ているのですが問題があります。子ノード同士が同じ座標に描かれます。どういうことかというと同じ親ノードを持つ複数の子ノード(子2、子3とします)同士がさらに複数の子ノード(子4)を持つ時に、子4は子4の子3ノードと重なってしまいます。y座標の決定がbbによって同じ振幅になるからだと思います。
しかし打開策が思いつかないので考えられる方法を教えていただきませんか?
下のプログラム自体はそれほど必要でないと思いますので細かい説明は辞めておきます。
class drawpair{
int bb=0;//子ノードのy座標を決める値
int x1;
public drawpair(Graphics g,Vector x,int posX,int posY,Vector causal1){
for(int i=0;i<x.size();++i){
if(i==0){
//親ノードの描写.DrawWordで文字を描写します。
new DrawWord(g,(String)x.elementAt(i),posX,posY);
}else{
//y座標を決めるbbの値の設定。
bb +=(int) Math.pow(-1,i)*(i-1);
new DrawWord(g,(String)x.elementAt(i),getFontMetrics(f1).stringWidth((String)x.elementAt(0))+posX+50,posY+bb*2*y1);
PairNode tes = new PairNode();
x1=tes.nextNode((String)x.elementAt(i),causal1);
if(x1!=-1){
new drawpair(g,(Vector) causal.elementAt(x1),getFontMetrics(f1).stringWidth((String)x.elementAt(0))+posX+50,posY+bb*2*y1,causal);
}
}
samplevec.removeAllElements();
}
}
}
補足
下の回答への補足としてネットワーク構造の比較をしたいと書きましたが、 もっと言うと3次元空間に存在する点と曲線からならなる構造の、意味的な構造を 比較するためにネットワーク、木構造という考え方を用いようと思っています。 このようなデータを2種類用意し、共通となる端末点をなんらかの方法できめた上で、 そのノードをスタートとして木構造を作成しています。 2つの木構造(木A、木Bとします)で分岐があるときに、 木Aと一方の分岐線が、木Bの分岐線のうちどちらに対応するのかを決定することができません。 言い換えれば、分岐がどちらに対応するかがわかればこの問題は解決します。 リンクは長さ情報は一応持ってはいるのですが、長さ自体が木Aと木Bで異なる場合があり、 保証されていませんので、できれば使わずに済む方法を考えたいと思っています。 以上が基準がない、決められないと述べた理由です。 木構造ではなく、ネットワーク構造の比較をしたい、と質問を変えさせていただきます。 私の考えとしては ・複数の端末ノードが一致するという条件のもと、わかるところまで端末から攻めていく ・ネットワーク途中のノードにも一致条件を持たせる の2つを盛り込めば解決できるのではないかと思っているのですが、どうでしょうか