• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:木構造を描写すると重なる)

重なる木構造の表現方法について

このQ&Aのポイント
  • 木構造の表現について説明されています。子ノード同士が同じ座標に描かれる問題について、解決策を求めています。
  • プログラムの詳細な説明は省略されています。
  • タイトルや要約文はSEOを意識したものとして作成されています。

質問者が選んだベストアンサー

  • ベストアンサー
  • kacchann
  • ベストアンサー率58% (347/594)
回答No.2

#1です。 下の回答で、画像添付に失敗したので、 ここで添付します。 --- おまけソースコード。 適当。自信アリマセン。 import java.awt.*;import java.util.*;class Ele{ Vector child=new Vector();Rectangle word;String name; static int A=16;int desH;int diffY=5;Ele(String name){ this.name=name;word=new Rectangle(name.length()*A,A);} void add(Ele child){this.child.add(child);} void add(String child){add(new Ele(child));} int calcDesH(){int h=0;if(Demo.vVal(child)){ for(int i=0;i<child.size();i++)h+=((Ele)child.elementAt(i)).calcDesH()+diffY; h-=diffY;}else{h=(int)word.getHeight();}desH=h;return h;} void setPosX(int off){ int diff=80;word.x=off;if(!Demo.vVal(child))return; for(int i=0;i<child.size();i++) ((Ele)child.elementAt(i)).setPosX(off+diff);} void setPosY(int allH,int off){ word.y=off+desH/2;if(!Demo.vVal(child))return; int curOff=off;for(int i=0;i<child.size();i++){ Ele ele=(Ele)child.elementAt(i); ele.setPosY(allH,curOff);curOff+=ele.desH+diffY;}} void draw(Graphics g){ g.drawRect(word.x,word.y,word.width, word.height); g.drawString(name, word.x+2, word.y+A-2); if(!Demo.vVal(child))return;for(int i=0;i<child.size();i++) ((Ele)child.elementAt(i)).draw(g);}} public class Demo extends Canvas{ Ele root;Demo(){ Ele c,c2;root=new Ele("たべもの"); root.add(c=new Ele("くだもの")); c.add(c2=new Ele("みかん"));c2.add("愛媛");c2.add("紀州"); c.add(c2=new Ele("りんご"));c2.add("紅玉"); root.add(c=new Ele("ごりら肉")); c.add("ブタゴリラ");c.add("ゴリラブタ");c.add("ゴリライモ"); root.add(c=new Ele("やさい")); c.add(c2=new Ele("きゃべつ"));c2.add("紫");c2.add("キャベ2"); c.add(c2=new Ele("だいこん"));c2.add("たくあん"); root.calcDesH();root.setPosY(root.desH,0);root.setPosX(0); } static boolean vVal(Vector v){return(v==null||v.size()==0)?false:true;} public void paint(Graphics g){root.draw(g);} public static void main(String[] args){Frame f=new Frame(); f.add(new Demo());f.setSize(400,300);f.show();} }

hiro0825
質問者

お礼

ありがとうございます。描写するサイズを決めるというのは思いつかなかったです。 その考え方を使わせていただき、解決しました。ありがとうございます。

その他の回答 (1)

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.1

自信アリマセンが・・・ --- こういうのは (1)まず、木全体の大きさを把握 (2)次に、全ノードの位置を決定 (3)最後に全ノードを描画 という手順ではないでしょうか・・・。 「描画しながら位置決定」という方針だと なかなか うまくいかないんじゃないでしょうか。 (だいいち、どう考えていいのか、よくわからない) --- 図参照。 まず、「全体木」の「幅」は9。 (部分木1の幅が3、木2が3、木3が3) ここで、 例えば「部分木3の最上位ノード」(※ノード「やさい」) を描画することを考えてみることにする。 まず、現在のペン位置のY座標penYを、 とりあえず6に設定する。 (なぜなら、木1の幅が3で木2の幅が3だから、その合計値。 言い換えると、図の緑枠の上辺(top)のy座標値) penY=6 また、この木3の幅wは3。 w=3 よって、ノード「やさい」を描画するためには、 ペン位置のY座標をw/2(※木3の"中央")だけ下方にずらす 必要がある。 penY = penY+w/2 = 7.5

関連するQ&A

専門家に質問してみよう