Assignment;因为java的坐标系和习惯的坐标系不一样(Y轴正方向向下),所以要先建立自己的坐标。

为了达到这个目的,实现方法的思路大概是这样:自己的坐标系->视图->java坐标系(这三家伙两两之间的转换都是根据比例建立变换关系的).

CODE:

MyCanvas.java(我的画布类)

My View:注释都很详细,大家应该能看明白.

哦,要注意的一点是:在视图->java坐标系中,Y轴的变换有点特别.

一般屏幕坐标系是直角左手系,y轴方向向下为正,原点在屏幕的左上角.解释窗口内图形上任一点(x,y)变换到视口内成为(sx,xy),而(x,y)是相对用户坐标系(直角右手系)的。(sx,sy)是相对屏幕坐标系(直角左手系)的,因此y轴方向相反。为使窗口内图形变换到视口上图形其形状一致,需将视口上图形y轴方向变换成窗口内图形y轴方向。这只要将求得的视口内各点的sy整型坐标均用sy2去减,即sy2-sy(整型)代替sy(整型)即可,经这样的坐标轴方向变换后得到的视口内图形与窗口内图形一致。

程序中使用的是:1-y.

基于java图形学实践记录(The First Day)//MyCanvas.java
基于java图形学实践记录(The First Day)

基于java图形学实践记录(The First Day)
importjava.awt.*;
基于java图形学实践记录(The First Day)
importjava.awt.image.*;
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicclassMyCanvasextendsComponent...{
基于java图形学实践记录(The First Day)
//自定义坐标系范围
基于java图形学实践记录(The First Day)
protecteddoubleuserMinX=-1;//X轴的最小值
基于java图形学实践记录(The First Day)
protecteddoubleuserMaxX=1;//x轴的最大值
基于java图形学实践记录(The First Day)
protecteddoubleuserMinY=-1;//Y轴的最小值
基于java图形学实践记录(The First Day)
protecteddoubleuserMaxY=-1;//Y轴的最小值
基于java图形学实践记录(The First Day)
基于java图形学实践记录(The First Day)
//视图范围Therangeofview
基于java图形学实践记录(The First Day)
protecteddouble[]viewMinX;//X轴的最小值
基于java图形学实践记录(The First Day)
protecteddouble[]viewMaxX;//x轴的最大值
基于java图形学实践记录(The First Day)
protecteddouble[]viewMinY;//Y轴的最小值
基于java图形学实践记录(The First Day)
protecteddouble[]viewMaxY;//Y轴的最小值
基于java图形学实践记录(The First Day)
finalstaticintDefaultViewportMax=256;//缺省试图数
基于java图形学实践记录(The First Day)
protectedintviewportMax=DefaultViewportMax;//视图数
基于java图形学实践记录(The First Day)
protectedintviewportNum=0;//当前视图数
基于java图形学实践记录(The First Day)
protectedintcurrentViewport=0;//当前试图的索引
基于java图形学实践记录(The First Day)
基于java图形学实践记录(The First Day)
//窗口大小Thesizeofwindow
基于java图形学实践记录(The First Day)
finalstaticintDefaultWindowSize=256;//缺省的窗口大小
基于java图形学实践记录(The First Day)
protectedintwindowWidth=DefaultWindowSize;//窗口宽度
基于java图形学实践记录(The First Day)
protectedintwindowHeight=DefaultWindowSize;//窗口高度
基于java图形学实践记录(The First Day)
基于java图形学实践记录(The First Day)
//GraphicanditsComponent
基于java图形学实践记录(The First Day)
protectedGraphicsmyGraphics;//Graphic类数据
基于java图形学实践记录(The First Day)
protectedComponentmyComponent;//Component类数据
基于java图形学实践记录(The First Day)
protectedColorcurrentFrontColor=Color.white;//当前颜色
基于java图形学实践记录(The First Day)
protectedColorcurrentBackColor=Color.black;//当前背景色
基于java图形学实践记录(The First Day)
基于java图形学实践记录(The First Day)
//构造器
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicMyCanvas(Componenta)...{
基于java图形学实践记录(The First Day)myComponent
=a;//设定MyCanvas类用的Component
基于java图形学实践记录(The First Day)
myGraphics=a.getGraphics();//设定MyCanvas用的Graphics
基于java图形学实践记录(The First Day)
windowWidth=a.getSize().width;//窗口宽度
基于java图形学实践记录(The First Day)
windowHeight=a.getSize().height;//窗口高度
基于java图形学实践记录(The First Day)
createViewport(DefaultViewportMax);//创建视图
基于java图形学实践记录(The First Day)
}

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
privatevoidcreateViewport(intmax)...{
基于java图形学实践记录(The First Day)currentViewport
=0;//视图索引的初始值设定
基于java图形学实践记录(The First Day)
viewportMax=max;//设定视图数的最大值
基于java图形学实践记录(The First Day)
viewMinX=newdouble[viewportMax];//视图X轴的最小值数组
基于java图形学实践记录(The First Day)
viewMaxX=newdouble[viewportMax];//视图X轴的最大值数组
基于java图形学实践记录(The First Day)
viewMinY=newdouble[viewportMax];//视图Y轴的最小值数组
基于java图形学实践记录(The First Day)
viewMaxY=newdouble[viewportMax];//视图Y轴的最大值数组
基于java图形学实践记录(The First Day)
viewMinX[0]=viewMinY[0]=0.0;//视图的最小值为0
基于java图形学实践记录(The First Day)
viewMaxX[0]=viewMaxY[0]=1.0;//视图的最大值为1
基于java图形学实践记录(The First Day)
viewportNum=1;//视图的当前索引为1
基于java图形学实践记录(The First Day)
}

基于java图形学实践记录(The First Day)
//自定义坐标系的范围的设定
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicvoidsetMyWindow(doublex1,doublex2,doubley1,doubley2)...{
基于java图形学实践记录(The First Day)userMinX
=x1;//窗口的X轴的最小值设定
基于java图形学实践记录(The First Day)
userMaxX=x2;//窗口的X轴的最大值设定
基于java图形学实践记录(The First Day)
userMinY=y1;//窗口的Y轴的最小值设定
基于java图形学实践记录(The First Day)
userMaxY=y2;//窗口的Y轴的最大值设定
基于java图形学实践记录(The First Day)
}

基于java图形学实践记录(The First Day)
//视图的设定
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicvoidsetViewport(doublex1,doublex2,doubley1,doubley2)...{
基于java图形学实践记录(The First Day)viewMinX[viewportNum]
=x1;//视图的X轴的最小值设定
基于java图形学实践记录(The First Day)
viewMaxX[viewportNum]=x2;//视图的X轴的最大值设定
基于java图形学实践记录(The First Day)
viewMinY[viewportNum]=y1;//视图的Y轴的最小值设定
基于java图形学实践记录(The First Day)
viewMaxY[viewportNum]=y2;//视图的Y轴的最大值设定
基于java图形学实践记录(The First Day)
currentViewport=viewportNum;//当前视图索引的设定
基于java图形学实践记录(The First Day)
viewportNum++;//视图数加1
基于java图形学实践记录(The First Day)
}

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
/***//****视图的复位****/
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicvoidresetViewport()...{
基于java图形学实践记录(The First Day)currentViewport
=0;//视图索引返回到0
基于java图形学实践记录(The First Day)
viewMinX[0]=viewMinY[0]=0.0;//视图的最小值为0
基于java图形学实践记录(The First Day)
viewMaxX[0]=viewMaxY[0]=1.0;//视图的最大值为1
基于java图形学实践记录(The First Day)
viewportNum=1;//视图数为1
基于java图形学实践记录(The First Day)
}

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
/***//****将视图坐标转换到javaAWT坐标方法***/
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicintgetIntX(doublex)...{
基于java图形学实践记录(The First Day)
return(int)(windowWidth*x);
基于java图形学实践记录(The First Day)}
//窗口宽度加倍
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicintgetIntY(doubley)...{
基于java图形学实践记录(The First Day)
return(int)(windowHeight*(1-y));
基于java图形学实践记录(The First Day)}
//窗口高度加倍
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
/***//*******将自定义坐标转换到视图坐标**********/
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicdoubleviewX(doublex)...{
基于java图形学实践记录(The First Day)
doubles=(x-userMinX)/(userMaxX-userMinX);
基于java图形学实践记录(The First Day)
doublet=viewMinX[currentViewport]+s*
基于java图形学实践记录(The First Day)(viewMaxX[currentViewport]
-viewMinX[currentViewport]);
基于java图形学实践记录(The First Day)
returnt;
基于java图形学实践记录(The First Day)}

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicdoubleviewY(doubley)...{
基于java图形学实践记录(The First Day)
doubles=(y-userMinY)/(userMaxY-userMinY);
基于java图形学实践记录(The First Day)
doublet=viewMinY[currentViewport]+s*
基于java图形学实践记录(The First Day)(viewMaxY[currentViewport]
-viewMinY[currentViewport]);
基于java图形学实践记录(The First Day)
returnt;
基于java图形学实践记录(The First Day)}

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
/***//*******将自定义坐标转换到javaAWT坐标********/
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicintgetX(doublex)...{
基于java图形学实践记录(The First Day)
doublexx=viewX(x);//x转换到视图坐标
基于java图形学实践记录(The First Day)
intix=getIntX(xx);//视图转换到java坐标
基于java图形学实践记录(The First Day)
returnix;
基于java图形学实践记录(The First Day)}

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicintgetY(doubley)...{
基于java图形学实践记录(The First Day)
doubleyy=viewY(y);//y转换到视图坐标
基于java图形学实践记录(The First Day)
intiy=getIntY(yy);//视图转换到java坐标
基于java图形学实践记录(The First Day)
returniy;
基于java图形学实践记录(The First Day)}

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
/***//******得到Dimension(维数)的方法**********/
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicintgetDimensionX(doublew)...{
基于java图形学实践记录(The First Day)
doublex=viewMaxX[currentViewport]-viewMinX[currentViewport];
基于java图形学实践记录(The First Day)x
*=windowWidth*w/(userMaxX-userMinX);
基于java图形学实践记录(The First Day)
return((int)Math.abs(x));
基于java图形学实践记录(The First Day)}

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicintgetDimensionY(doubleh)...{
基于java图形学实践记录(The First Day)
doubley=viewMaxY[currentViewport]-viewMinY[currentViewport];
基于java图形学实践记录(The First Day)y
*=windowHeight*h/(userMaxY-userMinY);
基于java图形学实践记录(The First Day)
return((int)Math.abs(y));
基于java图形学实践记录(The First Day)}

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
/***//*****颜色设定方法******/
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicColorgetColor()...{returncurrentFrontColor;}//当前的颜色检索
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicvoidsetColor(Colorc)...{
基于java图形学实践记录(The First Day)myGraphics.setColor(c);
基于java图形学实践记录(The First Day)currentFrontColor
=c;//当前颜色设定
基于java图形学实践记录(The First Day)
}

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicColorgetForeground()...{returncurrentFrontColor;}//前面颜色检索
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicvoidsetForeground(Colorc)...{//前面颜色设定
基于java图形学实践记录(The First Day)
myComponent.setForeground(c);
基于java图形学实践记录(The First Day)currentFrontColor
=c;
基于java图形学实践记录(The First Day)}

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicColorgetBackground()...{returncurrentBackColor;}//背景颜色检索
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicvoidsetBackground(Colorc)...{
基于java图形学实践记录(The First Day)myComponent.setBackground(c);
基于java图形学实践记录(The First Day)currentBackColor
=c;//背景颜色设定
基于java图形学实践记录(The First Day)
}

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
/***//*******************
基于java图形学实践记录(The First Day)***直线描画方法
基于java图形学实践记录(The First Day)*******************
*/

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicvoiddrawLine(doublex1,doubley1,doublex2,doubley2)...{
基于java图形学实践记录(The First Day)
//转换到java坐标系值
基于java图形学实践记录(The First Day)
intix1=getX(x1);
基于java图形学实践记录(The First Day)
intiy1=getY(y1);
基于java图形学实践记录(The First Day)
intix2=getX(x2);
基于java图形学实践记录(The First Day)
intiy2=getY(y2);
基于java图形学实践记录(The First Day)myGraphics.drawLine(ix1,iy1,ix2,iy2);
基于java图形学实践记录(The First Day)}

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
/***//*******************
基于java图形学实践记录(The First Day)***文字列的描画
基于java图形学实践记录(The First Day)*******************
*/

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicvoiddrawString(Stringstr,doublex,doubley)...{
基于java图形学实践记录(The First Day)
intix=getX(x);//自定义坐标轴到java坐标轴
基于java图形学实践记录(The First Day)
intiy=getY(y);//自定义坐标轴到java坐标轴
基于java图形学实践记录(The First Day)
myGraphics.drawString(str,ix,iy);
基于java图形学实践记录(The First Day)}

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
/***//*******************
基于java图形学实践记录(The First Day)***多边形的填充
基于java图形学实践记录(The First Day)*******************
*/

基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicvoidfillPolygon(double[]x,double[]y,intnumPoints)...{
基于java图形学实践记录(The First Day)
int[]ix=newint[numPoints];
基于java图形学实践记录(The First Day)
int[]iy=newint[numPoints];
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
for(inti=0;i<numPoints;i++)...{
基于java图形学实践记录(The First Day)ix[i]
=getX(x[i]);//自定义坐标轴到java坐标轴
基于java图形学实践记录(The First Day)
iy[i]=getY(y[i]);//自定义坐标轴到java坐标轴
基于java图形学实践记录(The First Day)
}

基于java图形学实践记录(The First Day)myGraphics.fillPolygon(ix,iy,numPoints);
基于java图形学实践记录(The First Day)}

基于java图形学实践记录(The First Day)}

基于java图形学实践记录(The First Day)

MyCoordinate.java(测试类)

基于java图形学实践记录(The First Day)//<appletcode=MyCoordinatewidth=300height=300>
基于java图形学实践记录(The First Day)
//</applet>
基于java图形学实践记录(The First Day)
基于java图形学实践记录(The First Day)
基于java图形学实践记录(The First Day)
//MyCoordinate.java
基于java图形学实践记录(The First Day)
importjava.awt.*;
基于java图形学实践记录(The First Day)
importjava.applet.Applet;
基于java图形学实践记录(The First Day)
基于java图形学实践记录(The First Day)
基于java图形学实践记录(The First Day)
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicclassMyCoordinateextendsApplet...{
基于java图形学实践记录(The First Day)
基于java图形学实践记录(The First Day)MyCanvasm;
//MyCanvas用数据
基于java图形学实践记录(The First Day)
finalstaticintidealSizeX=600;
基于java图形学实践记录(The First Day)
finalstaticintidealSizeY=350;
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicvoidinit()...{m=newMyCanvas(this);}//生成myCanvas对象
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
publicvoidpaint(Graphicsg)...{
基于java图形学实践记录(The First Day)m.setBackground(
newColor(200,200,200));
基于java图形学实践记录(The First Day)m.setColor(Color.black);
基于java图形学实践记录(The First Day)m.setViewport(
0.1,0.9,0.1,0.9);//设定视图范围坐标[0,1]*[0,1]
基于java图形学实践记录(The First Day)
m.setMyWindow(-1,1,-1,1);//设定自定义坐标系范围
基于java图形学实践记录(The First Day)
基于java图形学实践记录(The First Day)
基于java图形学实践记录(The First Day)
//画X轴
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
double[]x1=...{0.95,1.0,0.95};//箭头的坐标值
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
double[]y1=...{-0.05,0.0,0.05};//箭头的坐标值
基于java图形学实践记录(The First Day)
m.drawLine(-1,0,1,0);//画X轴
基于java图形学实践记录(The First Day)
m.fillPolygon(x1,y1,3);//填充箭头
基于java图形学实践记录(The First Day)
m.drawString("x轴",0.8,-0.2);//标注"X轴"
基于java图形学实践记录(The First Day)
//画y轴
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
double[]x2=...{-0.05,0.05,0.0};//箭头的坐标值
基于java图形学实践记录(The First Day)基于java图形学实践记录(The First Day)
double[]y2=...{0.95,0.95,1.0};//箭头的坐标值
基于java图形学实践记录(The First Day)
m.drawLine(0,-1,0,1);//画X轴
基于java图形学实践记录(The First Day)
m.fillPolygon(x2,y2,3);//填充箭头
基于java图形学实践记录(The First Day)
m.drawString("y轴",-0.2,0.9);//标注"X轴"
基于java图形学实践记录(The First Day)

基于java图形学实践记录(The First Day)
基于java图形学实践记录(The First Day)
基于java图形学实践记录(The First Day)m.resetViewport();
基于java图形学实践记录(The First Day)}

基于java图形学实践记录(The First Day)}

基于java图形学实践记录(The First Day)

RUN:

My View:能看到的在MyCoordinate.java的顶端有这么一段"//<applet code=MyCoordinate width =300 height =300> //</applet>" 目的是在命令行中直接运行Applet.

  而在编译时也有点问题,用下图的命令可得到比较好的解决。

运行命令:

基于java图形学实践记录(The First Day)

运行结果:

基于java图形学实践记录(The First Day)

闪……

相关文章:

  • 2021-10-14
  • 2022-12-23
  • 2021-10-01
  • 2021-12-17
  • 2021-12-17
  • 2022-02-24
  • 2021-12-13
  • 2022-12-23
猜你喜欢
  • 2021-04-02
  • 2021-10-23
  • 2021-07-18
  • 2022-12-23
  • 2022-12-23
  • 2021-09-23
  • 2021-12-08
相关资源
相似解决方案