2次元空間の点


座標の点

前回の内容などでもよくわかると思いますが
GUIプログラムでは、画像や文字などのコンポーネントを表示するために
コンポーネント上の位置を2次元のx座標とy座標で表します

最初のほうにやった図形でも、頻繁に位置を指定しましたね
そこで、このような2次元空間における2点の座標をカプセル化したクラスがあります
それがjava.awt.Pointクラスです
コンストラクタは次のとおりです

public Point()
public Point( Point p )
public Point( int x, int y )

一番上のなにも指定しない場合は、x,y座標共に0の点で初期化します
pはPointオブジェクトと同じ位置に点を作成します
xにはx座標、yにはy座標を指定します

このクラスには、座標を確保する二つの変数が存在します

public int x x座標
public int y y座標

なんらかの座標を動的に変更したり
2点をもとに、動的に変更する図形やアニメーションなどで、このクラスは非常に便利です
指定位置に座標を変更するには同クラスのsetLocation()メソッドを使用します

public void setLocation( Point p )
public void setLocation( int x, int y )

pの場合、Pointオブジェクトの座標に変更し
xとyは、数値で座標を指定します (同一の動作をするメソッドで public void move( int x, int y ) というのもあります)

また、現在の座標から相対的に移動する場合はtranslate()メソッドを使用します

public void translate( int dx, int dy )

dx , dy には、相対移動するx座標とy座標を指定します
これは ( x + dx , y + dy ) と同じ動作をします
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

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

public class App44 extends Applet implements MouseMotionListener {
	Label lb;
	Point p = new Point();
	public void init() {
		setBackground(Color.white);
		lb = (Label)add(new Label("カーソルを乗せてください" , Label.CENTER));
		addMouseMotionListener(this);
	}
	public void mouseMoved(MouseEvent e) {
		p.setLocation(e.getX() , e.getY());
		lb.setText("x = " + p.x + " : y = " + p.y);
	}
	public void mouseDragged(MouseEvent e) { }
}
アプレット

マウスカーソルをコンポーネントじょうに乗せると、座標を表示するアプレットです
前回のような、複雑な座標計算を要求される場合などにPointクラスは有効です

このほかにも、現在の座標を持つオブジェクトを返すgetLocation()メソッドなどもあります

public Point getLocation()

現在のオブジェクトの座標のコピーを返します


点と幅

Pointクラスは、2次元空間の座標を意味する「点」でした
しかし、Java言語の図形システムは点と点ではなく(つまり、絶対座標同士ではなく)
一つの点と、その点を座標とした相対値から図を描きます
これは、GraphicsクラスのdrawRect()メソッドなどでよくわかります

ある点と、そこからの相対的な縦と横の幅を表現するにはPointクラスでは役不足です
そこで、長方形の座標をカプセル化するのがjava.awt.Rectangleクラスです
コンストラクタは次のものが用意されています

public Rectangle()
public Rectangle( Rectangle r )
public Rectangle( int x, int y, int width, int height )
public Rectangle( int width, int height )
public Rectangle( Point p, Dimension d )
public Rectangle( Point p )
public Rectangle( Dimension d )

pは座標の原点、dは座標からの幅を指定します
x , y はx座標とy座標、widthとheightは横幅と縦幅です

座標を指定しない場合は、x,y共に0を座標とします
幅を指定しなければ、座標から0の長方形になります

このクラスは、2点の座標と幅の変数を持ちます
現在のオブジェクトのサイズを得るには、この変数を参照します

public int height 高さ
public int width
public int x x座標
public int y y座標

現在の座標を変更するにはsetLocation()メソッドを
現在の幅を変更するにはsetSize()メソッドを使用します
また、現在の座標を得るgetLocation()
現在の幅を得るgetSize()メソッドも用意されています

public void setLocation( Point p )
public void setLocation( int x, int y )
public void setSize( Dimension d )
public void setSize( int width, int height )
public Point getLocation()
public Dimension getSize()

setLocation()のpは、新しく設定する座標オブジェクトを指定します
xとyは、数値でx座標とy座標を指定します
setSize()のdには、新しく設定する幅のオブジェクトを指定します
widthとheightは、同様に数値で幅を変更します

getLocation()は、現在の座標を表すPointオブジェクトを
getSize()は、現在の幅を表すDemensionオブジェクトを返します

このように、座標はPoint、幅はDimensionオブジェクトで表すことができるので
その関係になれることが重要です
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

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

public class App45 extends Applet implements MouseMotionListener {
	Rectangle rec = new Rectangle();
	public void init() {
		setBackground(Color.white);
		addMouseMotionListener(this);
	}
	public void mouseMoved(MouseEvent e) {
		rec.setLocation(e.getX() , e.getY());
	}
	public void mouseDragged(MouseEvent e) {
		rec.setSize(e.getX() - rec.x , e.getY() - rec.y);
		repaint();
	}
	public void paint(Graphics g) {
		g.drawRect(rec.x , rec.y , rec.width , rec.height);
	}
}
アプレット

ドラッグすると長方形が描かれます
もっとも、マウスカーソル位置を座標原点にしているので(常に)
再描画すると、長方形の位置が変なところに変更されてしまいます



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