用户坐标视图坐标Javaawt坐标概念的建立和应用.docx

上传人:b****4 文档编号:5159216 上传时间:2023-05-08 格式:DOCX 页数:26 大小:37.45KB
下载 相关 举报
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第1页
第1页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第2页
第2页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第3页
第3页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第4页
第4页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第5页
第5页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第6页
第6页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第7页
第7页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第8页
第8页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第9页
第9页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第10页
第10页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第11页
第11页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第12页
第12页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第13页
第13页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第14页
第14页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第15页
第15页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第16页
第16页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第17页
第17页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第18页
第18页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第19页
第19页 / 共26页
用户坐标视图坐标Javaawt坐标概念的建立和应用.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

用户坐标视图坐标Javaawt坐标概念的建立和应用.docx

《用户坐标视图坐标Javaawt坐标概念的建立和应用.docx》由会员分享,可在线阅读,更多相关《用户坐标视图坐标Javaawt坐标概念的建立和应用.docx(26页珍藏版)》请在冰点文库上搜索。

用户坐标视图坐标Javaawt坐标概念的建立和应用.docx

用户坐标视图坐标Javaawt坐标概念的建立和应用

实验1实验报告格式

《计算机图形学》实验1实验报告

实验题目:

用户坐标、视图坐标、Javaawt坐标概念的建立和应用

实验内容:

掌握用户坐标、视图坐标、Javaawt坐标概念,掌握三类坐标的转换算法。

编写自己的算法函数,并形成Java语言程序包。

编写程序调用验证之。

参考程序:

有两个示范程序MyCanvas.java和MyLineDrawApplet.java

基本概念:

用户坐标:

是独立于设备的逻辑坐标,可以是用户用来定义设计对象的各种坐标。

视图坐标:

是设备相关的坐标,随目标渲染设备不同而不同。

Java awt坐标:

使用java.awt时的坐标。

填充:

以已知的某一条线为基准,向周围区域扩展像素,然后对这些像素所在的位置进行着色。

 

将用户坐标转换为视图坐标实际上是将用户自己设计的逻辑坐标转换为设备相关的坐标,将视图坐标转化为AWT坐标就是将视图坐标按照显示窗口的大小进行缩放。

算法设计:

功能:

用户可根据自己输入的用户坐标,进行视图坐标与awt坐标之间的转换,反向的转换原理与正向相同。

此外,该程序还可以进行图形的绘制和填充,如矩形,椭圆等图形。

算法1:

用户坐标向视图坐标的转换

设userMinx、userMaxx分别为用户坐标系x轴的最小值与最大值,userMiny、userMaxy分别为用户坐标系y轴的最小值与最大值;viewMinx、viewMaxx分别为视图坐标系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实现如下:

publicdoubleviewX(doubleuserX){//x坐标的转换

doubles=(userX-userMinx)/(userMaxx-userMinx);

doublet=viewMinx+s*(viewMaxx-viewMinx);//坐标的平移及压缩

returnt;

}

publicdoubleviewY(doubleuserY){//y坐标的转换

doubles=(y-userMiny)/(userMaxy-userMiny);

doublet=viewMiny+s*(viewMaxy-viewMiny);//坐标的平移及压缩

returnt;

}

算法2:

视图坐标向awt坐标的转换

若令(viewX,viewY)为视图坐标,(x,y)为awt坐标,width、height分别为窗口的宽度和高度,则它们之间的转换关系为:

X=viewX*width;

Y=viewY*height;

算法2实现如下:

//将视图坐标系的点转换到JavaAWT坐标

publicintgetIntX(doubleviewX){

return(int)(windowWidth*viewX);//注意视图坐标0-1之间

}

publicintgetIntY(doubleviewY){

return(int)(windowHeight*(1-viewY));//Y轴方向相反

}

算法3:

绘制矩形

首先将传入的用户坐标转换为awt坐标,通过对传入的坐标比较,找出矩形左上角坐标(ix0,iy0),并求出矩形的宽度width和高度height,利用Graphics类的方法drawRect(ix0,iy0,width,height)可画出矩形。

算法3实现如下:

publicvoiddrawRect(doublex1,doubley1,doublex2,doubley2){

//从用户的点坐标转换到JavaAWT坐标

intix1=getX(x1);intiy1=getY(y1);

intix2=getX(x2);intiy2=getY(y2);

intix0=(ix1

ix1:

ix2;//矩形左上角坐标

intiy0=(iy1

iy1:

iy2;

intwidth=Math.abs((ix1-ix2))+1;//矩形宽度,单位像素

intheight=Math.abs((iy1-iy2))+1;//矩形高度

graphics.drawRect(ix0,iy0,width,height);

}

代码:

(给出主要的Java程序和注解)

//文件名:

MyCanvas.java

//定义用户的canvas类,实现

//从用户坐标到视图的转换

//视图到JavaAWT坐标的转换

//用户坐标系的二维图形的描画方法,等

//用编译命令javac-d.MyCanvas.java把本文件制作成包MyCanvas

//在调用这个包的程序里加入语句importMyCanvas.MyCanvas;

packageshiyan1;//制作的包名,这里包名和类名同

importjava.io.*;

importjava.applet.Applet;

importjava.awt.*;

importjava.awt.image.*;

//定义canvas类

publicclassMyCanvasextendsComponent{

publicstaticvoidmain(String[]args){

Appletm=newApplet();

m.setSize(256,256);

MyCanvasmy=newMyCanvas(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+"");

doublex=my.viewX(0.3);

System.out.print(x+"");

intxx=my.getIntX(x);

System.out.println(xx);

}

//用户坐标系范围缺省值([-1,1],[-1,1])

protecteddoubleuserMinx=-1;//用户坐标系X轴的最小值

protecteddoubleuserMaxx=1;//用户坐标系X轴的最大值

protecteddoubleuserMiny=-1;//用户坐标系Y轴的最小值

protecteddoubleuserMaxy=1;//用户坐标系Y轴的最大值

//视图的坐标范围缺省值([0,1],[0,1])

protecteddouble[]viewMinx;//各视图X轴最小值的数组

protecteddouble[]viewMaxx;//各视图X轴最大值的数组

protecteddouble[]viewMiny;//各视图Y轴最小值的数组

protecteddouble[]viewMaxy;//各视图Y轴最大值的数组

finalstaticintDefaultViewportMax=256;//缺省的视图数

protectedintviewportMax=DefaultViewportMax;//最大视图数

protectedintviewportNum=0;//当前视图数

protectedintcurrentViewport=0;//当前视图的索引号

//窗口大小

finalstaticintDefaultWindowSize=256;//缺省的窗口大小

protectedintwindowWidth=DefaultWindowSize;//窗口宽度

protectedintwindowHeight=DefaultWindowSize;//窗口宽度

//定义JavaAWT的Graphics和Component

protectedGraphicsgraphics;//MyCanvas的Graphics数据类

protectedComponentcomponent;//MyCanvas的component数据类

protectedColorcurrentFrontColor=Color.white;//当前前景颜色

protectedColorcurrentBackColor=Color.white;//当前背景色

//构造方法

//缺省的构造方法中viewportMax=256

publicMyCanvas(Componenta){

component=a;//设定MyCanvas类所用的Component

graphics=a.getGraphics();//设定MyCanvas类所用的graphics

windowWidth=a.getSize().width;//窗口宽度

windowHeight=a.getSize().height;//窗口高度

createViewport(DefaultViewportMax);//创建视图

}

//创建视图

privatevoidcreateViewport(intmax){

currentViewport=0;//设定当前视图索引号

viewportMax=max;//设定视图数的最大值

viewMinx=newdouble[viewportMax];//存放各视图X轴最小值

viewMaxx=newdouble[viewportMax];//存放各视图X轴最大值

viewMiny=newdouble[viewportMax];//存放各视图y轴最小值

viewMaxy=newdouble[viewportMax];//存放各视图y轴最大值

viewMinx[currentViewport]=0.0;//设定当前视图的坐标轴范围

viewMiny[currentViewport]=0.0;

viewMaxx[currentViewport]=1.0;

viewMaxy[currentViewport]=1.0;

viewportNum=1;//当前视图数

}

//设定用户坐标系范围

publicvoidsetWindow(doublex1,doublex2,doubley1,doubley2){

userMinx=x1;//设定窗口(用户坐标系)X轴的最小值

userMaxx=x2;//设定窗口(用户坐标系)X轴的最大值

userMiny=y1;//设定窗口(用户坐标系)y轴的最小值

userMaxy=y2;//设定窗口(用户坐标系)y轴的最大值

}

//设定视图

publicvoidsetViewport(doublex1,doublex2,doubley1,doubley2){

currentViewport=viewportNum;//设定新的当前视图索引号

viewportNum++;//当前视图数加1

viewMinx[currentViewport]=x1;//存放视图的X轴最小值

viewMaxx[currentViewport]=x2;//存放视图的X轴最大值

viewMiny[currentViewport]=y1;//存放视图的y轴最小值

viewMaxy[currentViewport]=y2;//存放视图的y轴最大值

}

//视图复位

publicvoidresetViewport(){

currentViewport=0;//当前视图索引号重归于零

viewMinx[currentViewport]=0.0;//设定当前视图的坐标轴范围

viewMiny[currentViewport]=0.0;

viewMaxx[currentViewport]=1.0;

viewMaxy[currentViewport]=1.0;

viewportNum=1;//当前视图数

}

//将视图坐标系的点转换到JavaAWT坐标

publicintgetIntX(doublex){

return(int)(windowWidth*x);//注意视图坐标0-1之间

}

publicintgetIntY(doubley){

return(int)(windowHeight*(1-y));//Y轴方向相反

}

//将用户坐标的点转换到视图坐标

publicdoubleviewX(doublex){

doubles=(x-userMinx)/(userMaxx-userMinx);

doublet=viewMinx[currentViewport]+s*//坐标的平移及压缩

(viewMaxx[currentViewport]-viewMinx[currentViewport]);

returnt;

}

publicdoubleviewY(doubley){

doubles=(y-userMiny)/(userMaxy-userMiny);

doublet=viewMiny[currentViewport]+s*//坐标的平移及压缩

(viewMaxy[currentViewport]-viewMiny[currentViewport]);

returnt;

}

//将用户坐标的点转换到JavaAWT坐标

publicintgetX(doublex){

doublexx=viewX(x);//先将x转换到视图坐标

intix=getIntX(xx);//将视图坐标转换到JavaAWT坐标

returnix;

}

publicintgetY(doubley){

doubleyy=viewY(y);//先将y转换到视图坐标

intiy=getIntY(yy);//将视图坐标转换到JavaAWT坐标

returniy;

}

//将用户坐标系的宽度、高度值投影到JavaAWT坐标

publicintgetDimensionX(doublew){

doublex=viewMaxx[currentViewport]-viewMinx[currentViewport];

x*=windowWidth*w/(userMaxx-userMinx);//按比例投影,经由视图坐标系

return((int)Math.abs(x));//用户坐标系可能反向

}

publicintgetDimensionY(doubleh){

doubley=viewMaxy[currentViewport]-viewMiny[currentViewport];

y*=windowHeight*h/(userMaxy-userMiny);//按比例投影,经由视图坐标系

return((int)Math.abs(y));//用户坐标系可能反向

}

//有关当前颜色的设定方法:

画笔颜色、前景色、背景色

publicColorgetColor(){

returncurrentFrontColor;//得到当前颜色序号

}

publicvoidsetColor(Colorc){

graphics.setColor(c);//设置图形对象的颜色

currentFrontColor=c;//设定当前颜色序号

}

publicColorgetForeground(){

returncurrentFrontColor;//得到当前前景色序号

}

publicvoidsetForeground(Colorc){

component.setForeground(c);//设置前景色

currentFrontColor=c;//设定当前前景色序号

}

publicColorgetBackground(){

returncurrentBackColor;//得到当前背景色序号

}

publicvoidsetBackground(Colorc){

component.setBackground(c);//设置背景色

currentBackColor=c;//设定当前背景色序号

}

//-----各类图形的描画方法-----------

//直线画法:

两点式参数

publicvoiddrawLine(doublex1,doubley1,doublex2,doubley2){

//从用户的点坐标转换到JavaAWT坐标

intix1=getX(x1);intiy1=getY(y1);

intix2=getX(x2);intiy2=getY(y2);

graphics.drawLine(ix1,iy1,ix2,iy2);//这个方法它是怎样画直线的?

}

//矩形画法:

对角式参数

publicvoiddrawRect(doublex1,doubley1,doublex2,doubley2){

//从用户的点坐标转换到JavaAWT坐标

intix1=getX(x1);intiy1=getY(y1);

intix2=getX(x2);intiy2=getY(y2);

intix0=(ix1

ix1:

ix2;//矩形左上角坐标

intiy0=(iy1

iy1:

iy2;

intwidth=Math.abs((ix1-ix2))+1;//矩形宽度,单位像素

intheight=Math.abs((iy1-iy2))+1;//矩形高度

graphics.drawRect(ix0,iy0,width,height);

}

//矩形填充

publicvoidfillRect(doublex1,doubley1,doublex2,doubley2){

//从用户的点坐标转换到JavaAWT坐标

intix1=getX(x1);intiy1=getY(y1);

intix2=getX(x2);intiy2=getY(y2);

intix0=(ix1

ix1:

ix2;//矩形左上角坐标

intiy0=(iy1

iy1:

iy2;

intwidth=Math.abs((ix1-ix2))+1;//矩形宽度,单位像素

intheight=Math.abs((iy1-iy2))+1;//矩形高度

graphics.fillRect(ix0,iy0,width,height);//填充算法如何实现?

}

//矩形区域的清除

publicvoidclearRect(doublex1,doubley1,doublex2,doubley2){

//从用户的点坐标转换到JavaAWT坐标

intix1=getX(x1);intiy1=getY(y1);

intix2=getX(x2);intiy2=getY(y2);

intix0=(ix1

ix1:

ix2;//矩形左上角坐标

intiy0=(iy1

iy1:

iy2;

intwidth=Math.abs((ix1-ix2))+1;//矩形宽度,单位像素

intheight=Math.abs((iy1-iy2))+1;//矩形高度

graphics.clearRect(ix0,iy0,width,height);//算法等同填充

}

//圆角矩形画法

publicvoiddrawRoundRect(doublex1,doubley1,doublex2,doubley2,

doublearcW,doublearcH){//圆弧高度、圆弧宽度

//从用户坐标的点转换到JavaAWT坐标

intix1=getX(x1);intiy1=getY(y1);

intix2=getX(x2);intiy2=getY(y2);

intix0=(ix1

ix1:

ix2;//矩形左上角坐标

intiy0=(iy1

iy1:

iy2;

intwidth=Math.abs((ix1-ix2))+1;//矩形宽度,单位像素

intheight=Math.abs((iy1-iy2))+1;//矩形高度

intiarcWidth=getDimensionX(arcW);//圆弧宽度投影到JavaAWT坐标

intiarcHeight=getDimensionX(arcH);//圆弧高度投影

graphics.drawRoundRect(ix0,iy0,width,height,iarcWidth,iarcHeight);

}

//圆角矩形填充

publicvoidfillRoundRect(doublex1,doubley1,doublex2,doubley2,

doublearcW,doublearcH){//圆弧高度、圆弧宽度

//从用户坐标的点转换到JavaAWT坐标

intix1=getX(x1);intiy1=getY(y1);

intix2=getX(x2);intiy2=getY(y2);

intix0=(ix1

ix1:

ix2;//矩形左上角坐标

intiy0=(iy1

iy1:

iy2;

intwidth=Math.abs((ix1-ix2))+1;//矩形宽度,单位像素

intheight=Math.abs((iy1-iy2))+1;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2