import java.awt.event.*;import java.awt.*;import java.applet.*; class Obi { int haba2; //帯の幅の2乗 int haba; //帯の幅 int edamotox;int edamotoy; //基本枝の枝元のx、y int edasakix;int edasakiy; //基本枝の枝先のx、y boolean moto_saki_tadasii; //基本枝の枝元と枝先が正しく設定されたかを示すフラグ boolean enryouiki; /*円領域かどうかの判定用フラグ*/ String buimeisyou; /*部位の名前(頭とか尾など)*/ } public class orio3 extends Applet implements MouseListener, MouseMotionListener, ActionListener{ int posx0;int posy0; int posx1;int posy1; int vposx0;int vposy0; int vposx1;int vposy1; //基本枝の平行移動時のベクトル Label lbel; int i;//上部文字表示用ラベル boolean sinki = true;//基本枝によって加えた帯が新規なら真 boolean hajinoten = true;//基本枝の棒の端の点を選択したなら真 boolean heikouidou = true;//基本枝の棒の平行移動をする状態なら真 int sagyouJyoutai;//作業状態 1基本枝−基本枝、2基本枝−円図、3円図−円図、4円図−展開図、5展開図−展開図 int r=7;//基本枝構造の直線の両端の円の半径 int enzurasi=300;//円図のx軸方向のオフセット値 //帯領域用変数の定義 int nobis; //帯領域の数 int activeobi; //活性な帯の番号 Obi obis[] = new Obi[500];//帯領域のインスタンス定義 //マウスボタンを押した場所の帯番号の取得 void obiBangouHantei(int bhx , int bhy){ sinki =true ; hajinoten = true; heikouidou = false; for (int bhi=1; bhi<=nobis; bhi++ ){ if( //平行移動を行うべきか判断 ((obis[bhi].edamotox-bhx)*(obis[bhi].edamotox-bhx)+(obis[bhi].edamotoy-bhy)*(obis[bhi].edamotoy-bhy) 円図"); KihonsiEnzuButton.addActionListener(this); pnl.add(KihonsiEnzuButton); add("South",pnl); nobis=1;addObi(150,120,150,220); activeobi=1;addObiatosyori() ; sagyouJyoutai=1; } public void destroy() {removeMouseListener(this);} //マウス操作(ボタンを離したとき) public void mouseReleased(MouseEvent e) { addObiatosyori() ;repaint(); } //マウス操作(ボタンを押したとき) public void mousePressed(MouseEvent e) { posx0=e.getX();posy0=e.getY(); posx1=e.getX();posy1=e.getY(); obiBangouHantei(posx0,posy0); repaint(); } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) {} //マウス操作(ドラッグしたとき) public void mouseDragged(MouseEvent e) { if(!heikouidou){ obis[activeobi].edasakix =e.getX(); obis[activeobi].edasakiy =e.getY(); } if(heikouidou){ obis[activeobi].edamotox =e.getX()+vposx0; obis[activeobi].edamotoy =e.getY()+vposy0; obis[activeobi].edasakix =e.getX()+vposx1; obis[activeobi].edasakiy =e.getY()+vposy1; } repaint(); } public void mouseMoved(MouseEvent e) {} //ペイント public void paint(Graphics g) { String c=new String(); lbel.setText(c.valueOf(activeobi)); //基本枝の描画 for (int obibangou=1; obibangou<=nobis; obibangou++ ){ g.drawLine( obis[obibangou].edamotox, obis[obibangou].edamotoy, obis[obibangou].edasakix, obis[obibangou].edasakiy); //直線 g.drawOval(obis[obibangou].edamotox-r/2,obis[obibangou].edamotoy-r/2,r,r); //円 g.drawOval(obis[obibangou].edasakix-r/2,obis[obibangou].edasakiy-r/2,r,r); //円 } if ( sagyouJyoutai==2){ //円領域の描画 for (int obibangou=1; obibangou<=nobis; obibangou++ ){ g.drawOval(obis[obibangou].edasakix-obis[obibangou].haba/2+enzurasi , obis[obibangou].edasakiy-obis[obibangou].haba/2 ,obis[obibangou].haba,obis[obibangou].haba); //円 g.drawOval(obis[obibangou].edasakix-r/2+enzurasi,obis[obibangou].edasakiy-r/4,r/2,r/2); //円 } } } //ボタンを押されたときの処理 public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("基本枝の入力")) { lbel.setText("きほんし から きほんし" ); sagyouJyoutai=1; } if(e.getActionCommand().equals("基本枝―>円図")){ lbel.setText("きほんし から えんず" ); sagyouJyoutai=2; edaSettei(); enSyokiIti(); } repaint(); } //枝先と枝元を正しく設定 void edaSettei() { //初期化 for (int obibangou=1; obibangou<=nobis; obibangou++ ){ obis[obibangou].moto_saki_tadasii=false; } obis[1].moto_saki_tadasii=true; //実際の判定 for (int i=1; i<=nobis; i++ ){ for (int sansyou_obibangou=1; sansyou_obibangou<=nobis; sansyou_obibangou++ ){ if(obis[sansyou_obibangou].moto_saki_tadasii) for (int hanteisuru_obibangou=2; hanteisuru_obibangou<=nobis; hanteisuru_obibangou++ ){ if((sansyou_obibangou!= hanteisuru_obibangou)&&(!obis[hanteisuru_obibangou].moto_saki_tadasii)) { //もともと枝元先が正しい場合 if(intkyori( obis[sansyou_obibangou].edamotox, obis[sansyou_obibangou].edamotoy, obis[hanteisuru_obibangou].edamotox,obis[hanteisuru_obibangou].edamotoy)