ポリゴン
多角形の点
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) { }
}
マウスをクリックしていくと、多角形が描かれます
どうぞ、一度描いたら消せませんが、お絵かきしてください…