Posted on 2007-09-19 13:28
形式系统 阅读(208)
评论(0) 编辑 收藏 引用 网摘 所属分类:
编程开发
import java.awt.*;
import javax.swing.*;
/**
* 实现数学坐标意义上的画板
* @author handbook
*
*/
public class MathCoordPanel extends JPanel{
private int x0,y0; //原点位置
private double scaleX; //X方向的刻度,即每像素表示多少单位。
private double scaleY; //Y方向的刻度。
/**
* 将用户坐标y轴下的坐标值转换为相应的设备坐标的坐标值
* @param x 用户坐标x坐标值
* @return 设备坐标x坐标值
*/
private int getPanelX(double x){
int offset=(int)(x/scaleX);
return x0+offset;
}
/**
* 将用户坐标y轴下的坐标值转换为相应的设备坐标的坐标值
* @param y 用户坐标y坐标值
* @return 设备坐标y坐标值
*/
private int getPanelY(double y) {
int offset=(int)(y/scaleY);
return y0+offset;
}
/**
* 将用户坐标x轴下的长度转换为设备坐标下x轴方向的长度
* @param dx 用户坐标x轴方向上的长度值
* @return 设备坐标x轴方向上的长度值
*/
private int getPanelDx(double dx){
return (int)(dx/scaleX);
}
/**
* 将用户坐标y轴下的长度转换为设备坐标下y轴方向的长度
* @param dy 用户坐标y轴方向上的长度值
* @return 设备坐标y轴方向上的长度值
*/
private int getPanelDy(double dy){
return -(int)(dy/scaleY);
}
/**
* 将设备坐标x轴下的坐标值转换为相应的用户坐标的坐标值
* @param x 设备坐标x坐标值
* @return 用户坐标x坐标值
*/
private double getRealX(int x){
return (x-x0)*scaleX;
}
/**
* 将设备坐标y轴下的坐标值转换为相应的用户坐标的坐标值
* @param y 设备坐标y坐标值
* @return 用户坐标y坐标值
*/
private double getRealY(int y){
return (y-y0)*scaleY;
}
/**
* 通过左上角和右下角来确定坐标(这种方法最容易)
* @param left 容器左上角在用户坐标系中的x坐标
* @param top 容器左上角在用户坐标系中的y坐标
* @param right 容器右下角在用户坐标系中的x坐标
* @param bottom 容器右下角在用户坐标系中的y坐标
* @param width 坐标的总宽度(按设备坐标计算)
* @param height 坐标的总高度
*/
public void setScale(double left,double top,double right,double bottom,int width,int height){
scaleX=(right-left)/width;
scaleY=(bottom-top)/height;
x0=-(int)(left/scaleX);
y0=-(int)(top/scaleY);
}
/**
* 设置用户坐标(上面setScale重载版本,自动获取当前Panel的宽和高)
* @param left 容器左上角在用户坐标系中的x坐标
* @param top 容器左上角在用户坐标系中的y坐标
* @param right 容器右下角在用户坐标系中的x坐标
* @param bottom 容器右下角在用户坐标系中的y坐标
*/
public void setScale(double left,double top,double right,double bottom){
int width=this.getWidth();
int height=this.getHeight();
setScale(left,top,right,bottom,width,height);
}
/**
* 以用户坐标系画线
* @param g 图形环境
* @param left 第一个点x坐标
* @param top 第一个点y坐标
* @param right 第二个点x坐标
* @param bottom 第二个点y坐标
*/
protected void drawLine(Graphics g,double left,double top,double right,double bottom){
int x1=getPanelX(left);
int y1=getPanelY(top);
int x2=getPanelX(right);
int y2=getPanelY(bottom);
g.drawLine(x1,y1,x2,y2);
}
/**
* 以用户坐标系画矩形
* @param g 图形环境
* @param x 矩形左上顶点x坐标
* @param y 矩形左上顶点y坐标
* @param width 矩形的宽
* @param height 矩形的高
*/
protected void drawRect(Graphics g,double x,double y,double width,double height){
int x1=getPanelX(x); //映射原矩形两对角线端点坐标。
int y1=getPanelY(y);
int x2=getPanelX(x+width);
int y2=getPanelY(y+height);
int w=getPanelDx(width);
int h=getPanelDy(height);
g.drawRect(Math.min(x1,x2),Math.min(y1,y2),w,h);
}
/**
* 以用户坐标系画并填充矩形
* @param g 图形环境
* @param x 矩形左上顶点x坐标
* @param y 矩形左上顶点y坐标
* @param width 矩形的宽
* @param height 矩形的高
*/
protected void fillRect(Graphics g,double x,double y,double width,double height){
int x1=getPanelX(x); //映射原矩形两对角线端点坐标。
int y1=getPanelY(y);
int x2=getPanelX(x+width);
int y2=getPanelY(y+height);
int w=getPanelDx(width);
int h=getPanelDy(height);
g.fillRect(Math.min(x1,x2),Math.min(y1,y2),w,h);
}
/**
* 以用户坐标画弧(并填充)
* @param g 图形环境
* @param x 外接矩形左上顶点x坐标
* @param y 外接矩形左上顶点y坐标
* @param width 外接矩形的宽
* @param height 外接矩形的高
* @param start 开始角度
* @param end 终止角度
*/
protected void fillArc(Graphics g,double x,double y,double width,double height,
int start,int end){
int x1=getPanelX(x); //映射原矩形两对角线端点坐标。
int y1=getPanelY(y);
int x2=getPanelX(x+width);
int y2=getPanelY(y+height);
int w=getPanelDx(width);
int h=getPanelDy(height);
g.fillArc(Math.min(x1,x2),Math.min(y1,y2),w,h,start,end);
}
}