形式系统

计算机专业教学
posts - 48, comments - 150, trackbacks - 0, articles - 10
  教师博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

实现数学坐标的面板类源代码

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);
    }
}


只有注册用户登录后才能发表评论。