Java Appletの解説
<17.お絵かきソフト(その3)>
多角形、中塗り多角形の描写をします。また、色が重なると変わる点を改良してます。
1.多角形、中塗り多角形の描写
マウスのボタンのクリックを繰り返すと多角形が描けます。
16.の2「お絵かきソフト」を変化させたものです。bmt5に多角形、bmt6に中塗り多角形
の機能を持たせています。後、方法に中塗四角形と細線にしています。
1.<Javaファイル>
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
略
public class tpaint4 extends Applet{
int chi=4,tadi=0,taka=0;
int xpl[]=new int[10],ypl[]=new int[10];
int spx1,spy1,spx2,spy2;
略
public void init(){
略
p1.add(bmt5=new Button("多角形"));
p1.add(bmt6=new Button("中塗多角"));
略
public void mousePressed(MouseEvent e){
略
if ((chi==6)||(chi==5)){if (taka==0) {spx1=e.getX();spy1=e.getY();
spx2=e.getX();spy2=e.getY();xpl[0]=spx1;ypl[0]=spy1;}
else {spx1=spx2;spy1=spy2;}
略
public void mouseReleased(MouseEvent e){
if(chi==3){g.setPaintMode();g.fillRect(xx1,yy1,w1,h1);}
else if ((chi==6)||(chi==5)){if (taka<9){taka=taka+1;xpl[taka]=spx2;ypl[taka]=spy2;}
else{chi=4;pmeth.setText("細線");}
略
public void mouseDragged(MouseEvent e){
略
else if((chi==5)||(chi==6)){g.setXORMode(new Color(255,255,255));
g.drawLine(spx1,spy1,spx2,spy2);spx2=e.getX();spy2=e.getY();
g.drawLine(spx1,spy1,spx2,spy2);}
略
class MyListener implements ActionListener{
public void actionPerformed(ActionEvent e){
if(e.getSource()==bmt1){repaint();tadi=0;taka=0;chi=1;pmeth.setText("全消去");}
else if(e.getSource()==bmt2){plydisp(tadi);tadi=0;taka=0;chi=2;pmeth.setText("部分消去");}
else if(e.getSource()==bmt3){plydisp(tadi);tadi=0;taka=0;chi=3;pmeth.setText("中塗四角");}
else if(e.getSource()==bmt4){plydisp(tadi);tadi=0;taka=0;chi=4;pmeth.setText("細線");}
else if(e.getSource()==bmt5){plydisp(tadi);tadi=1;taka=0;chi=5;pmeth.setText("多角形");}
else if(e.getSource()==bmt6){plydisp(tadi);tadi=2;taka=0;chi=6;pmeth.setText("中塗多角");}
略
void plydisp(int tadi){
if (tadi==1){g.setPaintMode();g.drawPolygon(xpl,ypl,taka+1);}
if (tadi==2){g.setPaintMode();g.fillPolygon(xpl,ypl,taka+1);}
}}
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
例1.ここをクリックして下さい。
2.<解説>
1)初期設定
1.int chi=4,tadi=0,taka=0;
tadiは、多角形表示か中塗多角形表示の判定のための変数。tadi=1は、多角形、tadi=2は中塗多角形。
takaは、多角形の角の数。chi=4 方法の初期状態が"中塗四角"。
2.int xpl[]=new int[10],ypl[]=new int[10];
多角形の角の座標(xpl,ypl)
3.int spx1,spy1,spx2,spy2;
多角形表示の時に、(spx1,spy1)は直線の始点,(spx2,spy2)は終点を意味する。
2)マウスボタンが押された時の処理;
1.if ((chi==6)||(chi==5)){;chi==5は多角形、chi==6は中塗多角形が選ばれた時の処理。
2.if (taka==0) {;多角形表示で、taka==0即ち最初の第1辺を描く時の処理。
3.spx1=e.getX();spy1=e.getY();spx2=e.getX();spy2=e.getY();
マウスボタンが押された時の座標を(spx1,spy1)、(spx2,spy2)に入れる。
4.xpl[0]=spx1;ypl[0]=spy1;
多角形の始点(xpl[0],ypl[0])にマウスボタンが押された時の座標を代入する。
5.else {spx1=spx2;spy1=spy2;}
第2辺目以降は前の線の終点が今の線の始点となるように置き換える。
3)マウスボタンが放された時の処理;
1.if(chi==3){g.setPaintMode();g.fillRect(xx1,yy1,w1,h1);}
chi==3は"中塗四角"が選ばれた時の処理。g.setPaintMode();これで元の状態に戻してから四角形を描写すれば重なっても色は変わらない。
2.else if ((chi==6)||(chi==5)){if (taka<9){taka=taka+1;xpl[taka]=spx2;ypl[taka]=spy2;}
taka<9は角が9以下なら多角形の座標を代入する。taka=taka+1;xpl[taka]=spx2;ypl[taka]=spy2;角を
1個増やして辺の終点の座標を角として格納する。
9を超えれば以下を実行する。
3.else{chi=4;pmeth.setText("細線");}9を超えたら細線を描写する状態にして多角形終了。
4)マウスがドラッグされている時の処理;
else if((chi==5)||(chi==6)){g.setXORMode(new Color(255,255,255));g.drawLine(spx1,spy1,spx2,spy2);
spx2=e.getX();spy2=e.getY();g.drawLine(spx1,spy1,spx2,spy2);}
g.drawLine(spx1,spy1,spx2,spy2);(spx1,spy1)は直線の始点,(spx2,spy2)は終点で線を引く。
5)方法のボタンが押された時の処理
else if(e.getSource()==bmt4){plydisp(tadi);tadi=0;taka=0;chi=4;pmeth.setText("細線");}
plydisp(tadi);多角形を描き、初期状態tadi=0;taka=0;にする。plydisp(tadi);tadi=0;taka=0;を入れたのはどのボタンが押されても
多角形の方法が終了するようにするためです。
else if(e.getSource()==bmt5){plydisp(tadi);tadi=1;taka=0;chi=5;pmeth.setText("多角形");}
else if(e.getSource()==bmt6){plydisp(tadi);tadi=2;taka=0;chi=6;pmeth.setText("中塗多角");}
多角形はtadi=1;中塗り多角形はtadi=2;です。
6)多角形の描写void plydisp(int tadi){
1.if (tadi==1){g.setPaintMode();g.drawPolygon(xpl,ypl,taka+1);}
tadi==1は多角形の処理。g.setPaintMode();線が重なって色が変わらないようにするためg.setXORMode(new Color(255,255,255))で
変わってる状態を元にもどす。
g.drawPolygon(xpl,ypl,taka+1);(xpl[],ypl[])の点を結ぶ多角形を描く。
2.if (tadi==2){g.setPaintMode();g.fillPolygon(xpl,ypl,taka+1);}
tadi==2は中塗多角の処理。g.setPaintMode();図形が重なっても色が変わらないようにもとの状態に戻します。
g.fillPolygon(xpl,ypl,taka+1);中塗り多角形を描く。
<問題点>
g.setPaintMode()を使うと、最終的に描写された図形は色が重なっても変わりません。しかし、
描写途中では色が重なると色が変わります。この方法だけでは、この問題が解決できません。
娯楽室の各部屋