/********************************************
5.座標変換用のクラス
Line2D.Double の導入
(JikuHenkan1.class)
********************************************/
import java.awt.*;
import java.awt.geom.*;
import java.lang.*;
public class JikuHenkan1 {
/*** フィールド ***/
Line2D.Double ff; //線分(ユーザー空間)
Rectangle2D.Double mm; //窓(ユーザー空間)
Rectangle ss; //視野(デバイス空間)
/*** コンストラクタ ***/
public JikuHenkan1(){
ff = new Line2D.Double( 0.0, 0.0, 0.0, 0.0);
mm = new Rectangle2D.Double( 0.0, 0.0, 0.0, 0.0);
ss = new Rectangle( 0, 0, 0, 0);
}
public JikuHenkan1( Line2D.Double ff, Rectangle2D.Double mm, Rectangle ss ){
this.ff = ff;
this.mm = mm;
this.ss = ss;
}
/*** 座標変換のメソッド ***/
public Point ppp( Point2D.Double fn) {
int px = (int) ( ss.x + ( fn.x - mm.x ) * ss.width / mm.width ) ; //x座標の変換
int py = (int) ( ss.y - ( fn.y - mm.y ) * ss.height / mm.height ); //y座標の変換
Point pp = new Point( px, py );
return pp;
}
/*** 枠を描くメソッド ***/
public void drawWaku( Graphics g ) {
Graphics2D g2 = ( Graphics2D ) g;
double xmin = mm.x; //ユーザー空間の左
double xmax = mm.x + mm.width; //ユーザー空間の右
double ymax = mm.y; //ユーザー空間の上
double ymin = mm.y - mm.height; //ユーザー空間の下
int pmin = ss.x; //デバイス空間の左
int pmax = ss.x + ss.width; //デバイス空間の右
int qmin = ss.y; //デバイス空間の上
int qmax = ss.y + ss.height; //デバイス空間の下
int pwidth = ss.width; //デバイス空間の幅
int qheight = ss.height; //デバイス空間の高さ
double pc = (double) ( pmin + pwidth / 2 ); //デバイス空間の中心
double qc = (double) ( qmin + qheight / 2 );
Point2D.Double f0 = new Point2D.Double( 0.0, 0.0); //ユーザー空間の原点
Point pp0 = new Point( ppp( f0 ) ); //デバイス空間の原点
g.setColor( Color.black );
g.drawRect( ss.x, ss.y, ss.width, ss.height ); //外枠
g.setColor( Color.lightGray );
g.fillRect( ss.x+1, ss.y+1, ss.width-1, ss.height-1 ); //塗りつぶし
g.setColor( Color.black ); //座標の値
g.drawString( ""+xmin, pmin-7, qmax+15 );
g.drawString( ""+xmax, pmax-7, qmax+15 );
g.drawString( ""+ymin, pmin-25, qmax+5 );
g.drawString( ""+ymax, pmin-25, qmin+5 );
g.drawString( "X座標", pmin+pwidth/2-25, qmax+30); //ラベル
g2.rotate( Math.PI*1.5, pc, qc );
g.drawString( "Y座標", pmin+pwidth/2-25, qmin-30);
g2.rotate( Math.PI*0.5, pc, qc );
if( ss.contains( pp0.x, qmin ) ){ //原点がx軸に含まれていれば
g.setColor( Color.red );
g.drawLine( pp0.x, qmin, pp0.x, qmax ); //y軸
g.setColor( Color.black );
g.drawString( ""+f0.x, pp0.x-7, qmax+15 ); //x軸の値
}
if( ss.contains( pmin, pp0.y ) ){ //原点がy軸に含まれていれば
g.setColor( Color.red );
g.drawLine( pmin, pp0.y, pmax, pp0.y ); //x軸
g.setColor( Color.black );
g.drawString( ""+f0.y, pmin-25, pp0.y+5 ); //y軸の値
}
}
/*** 線分を描くメソッド ***/
public void drawSenbun(Graphics g){
Point2D.Double f1 = new Point2D.Double( ff.x1, ff.y1 ); //ユーザー空間の点1
Point2D.Double f2 = new Point2D.Double( ff.x2, ff.y2 ); //ユーザー空間の点2
Point pp1 = new Point( ppp( f1 ) ); //デバイス空間の点1
Point pp2 = new Point( ppp( f2 ) ); //デバイス空間の点2
g.setColor( Color.black );
if( ss.contains( pp1 ) ){ //点1が含まれていれば
if( ss.contains( pp2 ) ){ //点2が含まれていれば
g.drawLine( pp1.x, pp1.y, pp2.x, pp2.y ); //点1から点2に直線を描く
}
}
}
}
|