1、用户坐标视图坐标Javaawt坐标概念的建立和应用实验1实验报告格式计算机图形学实验1实验报告实验题目:用户坐标、视图坐标、Java awt坐标概念的建立和应用实验内容:掌握用户坐标、视图坐标、Java awt坐标概念,掌握三类坐标的转换算法。编写自己的算法函数,并形成Java语言程序包。编写程序调用验证之。参考程序:有两个示范程序MyCanvas.java和MyLineDrawApplet.java基本概念:用户坐标:是独立于设备的逻辑坐标,可以是用户用来定义设计对象的各种坐标。视图坐标:是设备相关的坐标,随目标渲染设备不同而不同。Javaawt坐标:使用java.awt时的坐标。填充:以已
2、知的某一条线为基准,向周围区域扩展像素,然后对这些像素所在的位置进行着色。将用户坐标转换为视图坐标实际上是将用户自己设计的逻辑坐标转换为设备相关的坐标,将视图坐标转化为AWT坐标就是将视图坐标按照显示窗口的大小进行缩放。算法设计:功能:用户可根据自己输入的用户坐标,进行视图坐标与awt坐标之间的转换,反向的转换原理与正向相同。此外,该程序还可以进行图形的绘制和填充,如矩形,椭圆等图形。算法1:用户坐标向视图坐标的转换 设userMinx、userMaxx分别为用户坐标系x轴的最小值与最大值,userMiny、userMaxy分别为用户坐标系y轴的最小值与最大值;viewMinx、viewMax
3、x分别为视图坐标系x轴的最小值与最大值,viewMiny、viewMaxy分别为视图坐标系y轴的最小值与最大值。若令(userX,userY)为要转换的用户坐标,(viewX,viewY)为转换后的视图坐标。则它们之间的转换关系为:viewX=viewMinx+(userX-userMinx)/(userMaxx-userMinx)*(viewMaxx-viewMinx) ;viewY=viewMiny+(userY-userMiny)/(userMaxy-userMiny)*(viewMaxy-viewMiny) ;算法1实现如下:public double viewX(double use
4、rX) /x坐标的转换 double s=(userX-userMinx)/(userMaxx-userMinx); double t=viewMinx+s*(viewMaxx-viewMinx); /坐标的平移及压缩 return t; public double viewY(double userY) /y坐标的转换 double s=(y-userMiny)/(userMaxy-userMiny); double t=viewMiny+s*(viewMaxy-viewMiny); /坐标的平移及压缩 return t;算法2:视图坐标向awt坐标的转换若令(viewX,viewY)为视图
5、坐标,(x,y)为awt坐标,width、height分别为窗口的宽度和高度,则它们之间的转换关系为:X = viewX * width ;Y = viewY * height ;算法2实现如下:/将视图坐标系的点转换到Java AWT坐标 public int getIntX(double viewX) return (int)(windowWidth * viewX); /注意视图坐标0-1之间 public int getIntY(double viewY) return (int)(windowHeight * (1-viewY); /Y轴方向相反 算法3:绘制矩形 首先将传入的用户坐
6、标转换为awt坐标,通过对传入的坐标比较,找出矩形左上角坐标(ix0,iy0),并求出矩形的宽度width和高度height,利用Graphics类的方法drawRect(ix0,iy0,width,height)可画出矩形。算法3实现如下:public void drawRect(double x1,double y1,double x2,double y2) /从用户的点坐标转换到Java AWT坐标 int ix1=getX(x1); int iy1=getY(y1); int ix2=getX(x2); int iy2=getY(y2); int ix0=(ix1ix2)?ix1:ix
7、2; /矩形左上角坐标 int iy0=(iy1iy2)?iy1:iy2; int width=Math.abs(ix1-ix2)+1; /矩形宽度,单位像素 int height=Math.abs(iy1-iy2)+1; /矩形高度 graphics.drawRect(ix0,iy0,width,height);代码:(给出主要的Java程序和注解)/文件名:MyCanvas.java/定义用户的canvas类,实现/ 从用户坐标到视图的转换/ 视图到JavaAWT坐标的转换/ 用户坐标系的二维图形的描画方法,等/用编译命令javac -d . MyCanvas.java把本文件制作成包My
8、Canvas/在调用这个包的程序里加入语句import MyCanvas.MyCanvas;package shiyan1; /制作的包名,这里包名和类名同import java.io.*;import java.applet.Applet;import java.awt.*;import java.awt.image.*;/定义canvas类public class MyCanvas extends Component public static void main(String args) Applet m = new Applet() ; m.setSize(256, 256) ; My
9、Canvas my = new MyCanvas(m) ; my.setWindow(-1,1,-1,1); /设定用户坐标系范围 my.createViewport(2) ; my.setViewport(0, 1, 0, 1) ; System.out.println(用户坐标 视图坐标 awt坐标); System.out.print(0.3+ ); double x = my.viewX(0.3) ; System.out.print(x+ ); int xx = my.getIntX(x) ; System.out.println(xx); /用户坐标系范围缺省值(-1,1,-1,1
10、) protected double userMinx=-1; /用户坐标系X轴的最小值 protected double userMaxx=1; /用户坐标系X轴的最大值 protected double userMiny=-1; /用户坐标系Y轴的最小值 protected double userMaxy=1; /用户坐标系Y轴的最大值 /视图的坐标范围缺省值(0,1,0,1) protected double viewMinx; /各视图X轴最小值的数组 protected double viewMaxx; /各视图X轴最大值的数组 protected double viewMiny;
11、/各视图Y轴最小值的数组 protected double viewMaxy; /各视图Y轴最大值的数组 final static int DefaultViewportMax=256; /缺省的视图数 protected int viewportMax=DefaultViewportMax; /最大视图数 protected int viewportNum=0; /当前视图数 protected int currentViewport=0; /当前视图的索引号 /窗口大小 final static int DefaultWindowSize=256; /缺省的窗口大小 protected i
12、nt windowWidth=DefaultWindowSize; /窗口宽度 protected int windowHeight=DefaultWindowSize; /窗口宽度 /定义Java AWT 的Graphics 和 Component protected Graphics graphics; /MyCanvas的Graphics数据类 protected Component component; /MyCanvas的component数据类 protected Color currentFrontColor=Color.white; /当前前景颜色 protected Colo
13、r currentBackColor=Color.white; /当前背景色 /构造方法 /缺省的构造方法中viewportMax=256 public MyCanvas(Component a) component=a; /设定MyCanvas类所用的Component graphics=a.getGraphics(); /设定MyCanvas类所用的graphics windowWidth=a.getSize().width; /窗口宽度 windowHeight=a.getSize().height; /窗口高度 createViewport(DefaultViewportMax); /
14、创建视图 /创建视图 private void createViewport(int max) currentViewport=0; /设定当前视图索引号 viewportMax=max; /设定视图数的最大值 viewMinx=new doubleviewportMax; /存放各视图X轴最小值 viewMaxx=new doubleviewportMax; /存放各视图X轴最大值 viewMiny=new doubleviewportMax; /存放各视图y轴最小值 viewMaxy=new doubleviewportMax; /存放各视图y轴最大值 viewMinxcurrentVie
15、wport=0.0; /设定当前视图的坐标轴范围 viewMinycurrentViewport=0.0; viewMaxxcurrentViewport=1.0; viewMaxycurrentViewport=1.0; viewportNum=1; /当前视图数 /设定用户坐标系范围 public void setWindow(double x1,double x2,double y1,double y2) userMinx=x1; /设定窗口(用户坐标系)X轴的最小值 userMaxx=x2; /设定窗口(用户坐标系)X轴的最大值 userMiny=y1; /设定窗口(用户坐标系)y轴的
16、最小值 userMaxy=y2; /设定窗口(用户坐标系)y轴的最大值 /设定视图 public void setViewport(double x1,double x2,double y1,double y2) currentViewport=viewportNum; /设定新的当前视图索引号 viewportNum+; /当前视图数加1 viewMinxcurrentViewport=x1; /存放视图的X轴最小值 viewMaxxcurrentViewport=x2; /存放视图的X轴最大值 viewMinycurrentViewport=y1; /存放视图的y轴最小值 viewMaxy
17、currentViewport=y2; /存放视图的y轴最大值 /视图复位 public void resetViewport() currentViewport=0; /当前视图索引号重归于零 viewMinxcurrentViewport=0.0; /设定当前视图的坐标轴范围 viewMinycurrentViewport=0.0; viewMaxxcurrentViewport=1.0; viewMaxycurrentViewport=1.0; viewportNum=1; /当前视图数 /将视图坐标系的点转换到Java AWT坐标 public int getIntX(double x
18、) return (int)(windowWidth * x); /注意视图坐标0-1之间 public int getIntY(double y) return (int)(windowHeight * (1-y); /Y轴方向相反 /将用户坐标的点转换到视图坐标 public double viewX(double x) double s=(x-userMinx)/(userMaxx-userMinx); double t=viewMinxcurrentViewport+s* /坐标的平移及压缩 (viewMaxxcurrentViewport-viewMinxcurrentViewpor
19、t); return t; public double viewY(double y) double s=(y-userMiny)/(userMaxy-userMiny); double t=viewMinycurrentViewport+s* /坐标的平移及压缩 (viewMaxycurrentViewport-viewMinycurrentViewport); return t; /将用户坐标的点转换到Java AWT坐标 public int getX(double x) double xx=viewX(x); /先将x转换到视图坐标 int ix=getIntX(xx); /将视图坐标
20、转换到Java AWT坐标 return ix; public int getY(double y) double yy=viewY(y); /先将y转换到视图坐标 int iy=getIntY(yy); /将视图坐标转换到Java AWT坐标 return iy; /将用户坐标系的宽度、高度值投影到Java AWT坐标 public int getDimensionX(double w) double x=viewMaxxcurrentViewport-viewMinxcurrentViewport; x*=windowWidth*w/(userMaxx-userMinx); /按比例投影,
21、经由视图坐标系 return (int)Math.abs(x); /用户坐标系可能反向 public int getDimensionY(double h) double y=viewMaxycurrentViewport-viewMinycurrentViewport; y*=windowHeight*h/(userMaxy-userMiny); /按比例投影,经由视图坐标系 return (int)Math.abs(y); /用户坐标系可能反向 /有关当前颜色的设定方法:画笔颜色、前景色、背景色 public Color getColor() return currentFrontColo
22、r; /得到当前颜色序号 public void setColor(Color c) graphics.setColor(c); /设置图形对象的颜色 currentFrontColor=c; /设定当前颜色序号 public Color getForeground() return currentFrontColor; /得到当前前景色序号 public void setForeground(Color c) component.setForeground(c); /设置前景色 currentFrontColor=c; /设定当前前景色序号 public Color getBackgroun
23、d() return currentBackColor; /得到当前背景色序号 public void setBackground(Color c) component.setBackground(c); /设置背景色 currentBackColor=c; /设定当前背景色序号 /-各类图形的描画方法- /直线画法:两点式参数 public void drawLine(double x1,double y1,double x2,double y2) /从用户的点坐标转换到Java AWT坐标 int ix1=getX(x1); int iy1=getY(y1); int ix2=getX(x
24、2); int iy2=getY(y2); graphics.drawLine(ix1,iy1,ix2,iy2); /这个方法它是怎样画直线的? /矩形画法:对角式参数 public void drawRect(double x1,double y1,double x2,double y2) /从用户的点坐标转换到Java AWT坐标 int ix1=getX(x1); int iy1=getY(y1); int ix2=getX(x2); int iy2=getY(y2); int ix0=(ix1ix2)?ix1:ix2; /矩形左上角坐标 int iy0=(iy1iy2)?iy1:iy2
25、; int width=Math.abs(ix1-ix2)+1; /矩形宽度,单位像素 int height=Math.abs(iy1-iy2)+1; /矩形高度 graphics.drawRect(ix0,iy0,width,height); /矩形填充 public void fillRect(double x1,double y1,double x2,double y2) /从用户的点坐标转换到Java AWT坐标 int ix1=getX(x1); int iy1=getY(y1); int ix2=getX(x2); int iy2=getY(y2); int ix0=(ix1ix2
26、)?ix1:ix2; /矩形左上角坐标 int iy0=(iy1iy2)?iy1:iy2; int width=Math.abs(ix1-ix2)+1; /矩形宽度,单位像素 int height=Math.abs(iy1-iy2)+1; /矩形高度 graphics.fillRect(ix0,iy0,width,height); /填充算法如何实现? /矩形区域的清除 public void clearRect(double x1,double y1,double x2,double y2) /从用户的点坐标转换到Java AWT坐标 int ix1=getX(x1); int iy1=ge
27、tY(y1); int ix2=getX(x2); int iy2=getY(y2); int ix0=(ix1ix2)?ix1:ix2; /矩形左上角坐标 int iy0=(iy1iy2)?iy1:iy2; int width=Math.abs(ix1-ix2)+1; /矩形宽度,单位像素 int height=Math.abs(iy1-iy2)+1; /矩形高度 graphics.clearRect(ix0,iy0,width,height); /算法等同填充 /圆角矩形画法 public void drawRoundRect(double x1,double y1,double x2,d
28、ouble y2, double arcW,double arcH) /圆弧高度、圆弧宽度 /从用户坐标的点转换到Java AWT坐标 int ix1=getX(x1); int iy1=getY(y1); int ix2=getX(x2); int iy2=getY(y2); int ix0=(ix1ix2)?ix1:ix2; /矩形左上角坐标 int iy0=(iy1iy2)?iy1:iy2; int width=Math.abs(ix1-ix2)+1; /矩形宽度,单位像素 int height=Math.abs(iy1-iy2)+1; /矩形高度 int iarcWidth=getDi
29、mensionX(arcW); /圆弧宽度投影到Java AWT坐标 int iarcHeight=getDimensionX(arcH); /圆弧高度投影 graphics.drawRoundRect(ix0,iy0,width,height,iarcWidth,iarcHeight); /圆角矩形填充 public void fillRoundRect(double x1,double y1,double x2,double y2, double arcW,double arcH) /圆弧高度、圆弧宽度 /从用户坐标的点转换到Java AWT坐标 int ix1=getX(x1); int iy1=getY(y1); int ix2=getX(x2); int iy2=getY(y2); int ix0=(ix1ix2)?ix1:ix2; /矩形左上角坐标 int iy0=(iy1iy2)?iy1:iy2; int width=Math.abs(ix1-ix2)+1; /矩形宽度,单位像素 int height=Math.abs(iy1-iy2)+1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1