ポリゴン


多角形の点

Javaでよく挙げられる、もう一つの優秀な点がグラフィックである
JavaのGraphicsクラスは、制限こそ多かれ(線のピクセルが指定できないなど)
かなり効率的な開発を可能とするクラス郡は魅力的です

ここでは、多角形によるポリゴンについて少し説明します
以前、Graphicsクラスの学習でdrawPolygon()メソッドを扱いました
そのとき、少しだけjava.awt.Polygonクラスの話をしました
ここでは、このPolygonクラスを詳しく扱ってみようと思います。コンストラクタは以下のものがあります

public Polygon()
public Polygon( int xpoints[], int ypoints[], int npoints )

このコンストラクタは以前説明しましたね
xpoints[]にはxの座標、ypoints[]にはy座標を格納した配列を指定します
npointsは、多角形の数を指定します
ここで指定された値だけ、多角形を配列の数値をもとに生成します

Polygonクラスには、オブジェクトの多角形を表現する変数と
頂点の総数などを格納したフィールドがあります

protected Rectangle bounds 多角形を囲む最小の長方形
public int npoints 頂点の数
public int xpoints[] x座標の配列
public int ypoints[] y座標の配列

npointsの値をもとにx座標やy座標をループ操作するなどして、動的に値を制御することができます
import java.applet.Applet;
import java.awt.*;

/*	<applet code="App46.class" width="300"height="300">
 	</applet>
*/

public class App46 extends Applet implements Runnable {
	Image buf;
	Graphics off;
	Dimension dim;
	Polygon plg;

	public void init() {
		dim = getSize();

		int x[] = { 10 , dim.width - 10 , 40 , dim.width - 40 };
		int y[] = { 10 , 70 , dim.height - 10 , dim.height - 20 };

		plg = new Polygon(x , y , 4);
		buf = createImage(dim.width , dim.height);
		off = buf.getGraphics();

		Thread th = new Thread(this);
		th.start();
	}

	public void run() {
		boolean x[] = new boolean[plg.npoints];
		boolean y[] = new boolean[plg.npoints];
		try {
			while(true) {
				for (int count = 0 ; count < plg.npoints ; count++) {
					if (x[count]) plg.xpoints[count]++;
					else plg.xpoints[count]--;
					if (y[count]) plg.ypoints[count]++;
					else plg.ypoints[count]--;

					if (plg.xpoints[count] == dim.width) x[count] = false;
					if (plg.xpoints[count] == 0) x[count] = true;
					if (plg.ypoints[count] == dim.height) y[count] = false;
					if (plg.ypoints[count] == 0) y[count] = true;
				}
				repaint();
				Thread.sleep(10);
			}
		}
		catch(Exception e) { }
	}
	public void update(Graphics g) {
		paint(g);
	}
	public void paint(Graphics g) {
		off.setColor(Color.black);
		off.fillRect(0 , 0 ,dim.width , dim.height);

		off.setColor(Color.red);
		off.drawPolygon(plg);
		g.drawImage(buf , 0 , 0 , this);
	}
}
アプレット

Polygonクラスのフィールドはpublicな変数なので、直接操作して動的に表示させることができます

また、このクラスには多角形を操作するいくつかのメソッドがあります
多角形の頂点を移動するにはtranslate()メソッドを
多角形を表現する最小の長方形はgetBounds()メソッドを使用します

public void translate( int deltaX, int deltaY )
public Rectangle getBounds()

translate()は、頂点を変換する量を指定します
deltaXには、x軸方向に変換する量を
deltaYには、y軸方向に変換する量を指定します

getBounds()は、多角形を表現する最小の長方形を取得します
Rectabgle型のオブジェクトを返します
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

/*	<applet code="test.class" width="300"height="300">
 	</applet>
*/

public class test extends Applet implements MouseMotionListener {
	Polygon plg;
	Rectangle rct;

	public void init() {
		setBackground(Color.white);
		int x[] = { 10 , 100 , 40 , 100 };
		int y[] = { 10 , 80 , 100 , 50 };
		plg = new Polygon(x , y , 4);
		addMouseMotionListener(this);
	}
	public void paint(Graphics g) {
		rct = plg.getBounds();
		g.drawRect(rct.x , rct.y , rct.width , rct.height);
		g.drawPolygon(plg);
	}
	public void mouseDragged(MouseEvent e) {
		plg.translate(e.getX() - plg.xpoints[0] , e.getY() - plg.ypoints[0]);
		repaint();
	}
	public void mouseMoved(MouseEvent e) { }
}
このアプレットは、マウスをドラッグした地点に多角形を移動させます
このとき、多角形は長方形に囲まれています
drawRectで指定しているサイズは、多角形を囲む長方形です

また、頂点を追加することも可能です(簡単に)
頂点の追加にはaddPoint()メソッドを使用します

public void addPoint( int x, int y )

xとyには、追加する頂点のx座標とy座標を指定します
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

/*	<applet code="App47.class" width="300"height="300">
 	</applet>
*/

public class App47 extends Applet implements MouseListener {
	Polygon plg;

	public void init() {
		setBackground(Color.white);
		plg = new Polygon();
		addMouseListener(this);
	}
	public void paint(Graphics g) {
		g.drawPolyline(plg.xpoints , plg.ypoints , plg.npoints);
	}
	public void mousePressed(MouseEvent e) {
		plg.addPoint(e.getX() , e.getY());
		repaint();
	}
	public void mouseReleased(MouseEvent e) { }
	public void mouseExited(MouseEvent e) { }
	public void mouseEntered(MouseEvent e) { }
	public void mouseClicked(MouseEvent e) { }
}
アプレット

マウスをクリックしていくと、多角形が描かれます
どうぞ、一度描いたら消せませんが、お絵かきしてください…



前のページへ戻る次のページへ