版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《計(jì)算機(jī)圖形學(xué)》實(shí)驗(yàn)1實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)題目:用戶坐標(biāo)、視圖坐標(biāo)、Javaawt坐標(biāo)概念的建立和應(yīng)用實(shí)驗(yàn)內(nèi)容:掌握用戶坐標(biāo)、視圖坐標(biāo)、Javaawt坐標(biāo)概念,掌握三類坐標(biāo)的轉(zhuǎn)換算法。編寫自己的算法函數(shù),并形成Java語(yǔ)言程序包。編寫程序調(diào)用驗(yàn)證之。參考程序:有兩個(gè)示范程序MyCanvas.java和MyLineDrawApplet.java基本概念:用戶坐標(biāo):是獨(dú)立于設(shè)備的邏輯坐標(biāo),可以是用戶用來(lái)定義設(shè)計(jì)對(duì)象的各種坐標(biāo)。
視圖坐標(biāo):是設(shè)備相關(guān)的坐標(biāo),隨目標(biāo)渲染設(shè)備不同而不同。
Java
awt坐標(biāo):使用java.awt時(shí)的坐標(biāo),即窗口顯示圖像時(shí)的邊界坐標(biāo)。。
填充:這個(gè)過(guò)程可以抽象的理解為以已知的線為中心,向周圍擴(kuò)展像素,然后對(duì)這些像素所在的方塊進(jìn)行著色。算法設(shè)計(jì):功能:用戶可根據(jù)自己輸入的用戶坐標(biāo),進(jìn)行視圖坐標(biāo)與javaawt坐標(biāo)之間的轉(zhuǎn)換,反向的轉(zhuǎn)換原理與正向相同。此外,該程序還可以進(jìn)行一些基本圖形的繪制和顏色的填充,如矩形,橢圓等圖形。算法1:用戶坐標(biāo)向視圖坐標(biāo)的轉(zhuǎn)換設(shè)userMinx、userMaxx分別為用戶坐標(biāo)系x軸的最小值與最大值,userMiny、userMaxy分別為用戶坐標(biāo)系y軸的最小值與最大值;viewMinx、viewMaxx分別為視圖坐標(biāo)系x軸的最小值與最大值,viewMiny、viewMaxy分別為視圖坐標(biāo)系y軸的最小值與最大值。通過(guò)坐標(biāo)的壓縮及平移實(shí)現(xiàn)坐標(biāo)的轉(zhuǎn)換。轉(zhuǎn)換關(guān)系如下:viewX=viewMinx+(userX-userMinx)/(userMaxx-userMinx)*(viewMaxx-viewMinx)viewY=viewMiny+(userY-userMiny)/(userMaxy-userMiny)*(viewMaxy-viewMiny)算法實(shí)現(xiàn)://將用戶坐標(biāo)的點(diǎn)轉(zhuǎn)換到視圖坐標(biāo) publicdoubleviewX(doublex){ doubles=(x-userMinx)/(userMaxx-userMinx); doublet=viewMinx[currentViewport]+s* //坐標(biāo)的平移及壓縮 (viewMaxx[currentViewport]-viewMinx[currentViewport]); returnt; } publicdoubleviewY(doubley){ doubles=(y-userMiny)/(userMaxy-userMiny); doublet=viewMiny[currentViewport]+s* //坐標(biāo)的平移及壓縮 (viewMaxy[currentViewport]-viewMiny[currentViewport]); returnt; }算法2:視圖坐標(biāo)向javaawt坐標(biāo)的轉(zhuǎn)換若令(viewX,viewY)為視圖坐標(biāo),(x,y)為awt坐標(biāo),width、height分別為窗口的寬度和高度,則它們之間的轉(zhuǎn)換關(guān)系為:X=viewX*widthY=viewY*height算法實(shí)現(xiàn)://將視圖坐標(biāo)系的點(diǎn)轉(zhuǎn)換到JavaAWT坐標(biāo) publicintgetIntX(doublex){ return(int)(windowWidth*x); //注意視圖坐標(biāo)0-1之間 } publicintgetIntY(doubley){ return(int)(windowHeight*(1-y)); //Y軸方向相反 }算法3:橢圓的繪制首先將從用戶坐標(biāo)獲得的圓心坐標(biāo)轉(zhuǎn)換到j(luò)avaawt坐標(biāo),將X、Y軸坐標(biāo)分別投影在AWT坐標(biāo)上,獲得橢圓外切矩形的左上角X、Y軸坐標(biāo),即可繪制出橢圓。算法實(shí)現(xiàn)://橢圓的畫法(圓心坐標(biāo)和兩個(gè)半徑) publicvoiddrawOval(doublex,doubley,doublexr,doubleyr){ //圓心從用戶坐標(biāo)轉(zhuǎn)換到JavaAWT坐標(biāo) intix=getX(x); intiy=getY(y); intixr=getDimensionX(xr); //x軸半徑投影到JavaAWT坐標(biāo) intiyr=getDimensionX(yr); //y軸半徑投影 intx0=ix-ixr; //橢圓外切矩形的左上角x坐標(biāo) inty0=iy-iyr; //橢圓外切矩形的左上角y坐標(biāo) graphics.drawOval(x0,y0,2*ixr,2*iyr); } 代碼://文件名:MyCanvas.java//定義用戶的canvas類,實(shí)現(xiàn)// 從用戶坐標(biāo)到視圖的轉(zhuǎn)換// 視圖到JavaAWT坐標(biāo)的轉(zhuǎn)換// 用戶坐標(biāo)系的二維圖形的描畫方法,等//用編譯命令javac-d.MyCanvas.java把本文件制作成包MyCanvas//在調(diào)用這個(gè)包的程序里加入語(yǔ)句importMyCanvas.MyCanvas;package MyCanvas; //制作的包名,這里包名和類名同importjava.io.*;importjava.awt.*;importjava.awt.image.*;//定義canvas類publicclassMyCanvasextendsComponent{ //用戶坐標(biāo)系范圍缺省值([-1,1],[-1,1]) protecteddoubleuserMinx=-1; //用戶坐標(biāo)系X軸的最小值 protecteddoubleuserMaxx=1; //用戶坐標(biāo)系X軸的最大值 protecteddoubleuserMiny=-1; //用戶坐標(biāo)系Y軸的最小值 protecteddoubleuserMaxy=1; //用戶坐標(biāo)系Y軸的最大值 //視圖的坐標(biāo)范圍缺省值([0,1],[0,1]) protecteddouble[]viewMinx; //各視圖X軸最小值的數(shù)組 protecteddouble[]viewMaxx; //各視圖X軸最大值的數(shù)組 protecteddouble[]viewMiny; //各視圖Y軸最小值的數(shù)組 protecteddouble[]viewMaxy; //各視圖Y軸最大值的數(shù)組 finalstaticintDefaultViewportMax=256; //缺省的視圖數(shù) protectedintviewportMax=DefaultViewportMax; //最大視圖數(shù) protectedintviewportNum=0; //當(dāng)前視圖數(shù) protectedintcurrentViewport=0; //當(dāng)前視圖的索引號(hào) //窗口大小 finalstaticintDefaultWindowSize=256; //缺省的窗口大小 protectedintwindowWidth=DefaultWindowSize; //窗口寬度 protectedintwindowHeight=DefaultWindowSize; //窗口寬度 //定義JavaAWT的Graphics和Component protectedGraphicsgraphics; //MyCanvas的Graphics數(shù)據(jù)類 protectedComponentcomponent; //MyCanvas的component數(shù)據(jù)類 protectedColorcurrentFrontColor=Color.white; //當(dāng)前前景顏色 protectedColorcurrentBackColor=Color.white; //當(dāng)前背景色 //構(gòu)造方法 //缺省的構(gòu)造方法中viewportMax=256 publicMyCanvas(Componenta){ component=a; //設(shè)定MyCanvas類所用的Component graphics=a.getGraphics(); //設(shè)定MyCanvas類所用的graphics windowWidth=a.getSize().width; //窗口寬度 windowHeight=a.getSize().height; //窗口高度 createViewport(DefaultViewportMax); //創(chuàng)建視圖 } //創(chuàng)建視圖 privatevoidcreateViewport(intmax){ currentViewport=0; //設(shè)定當(dāng)前視圖索引號(hào) viewportMax=max; //設(shè)定視圖數(shù)的最大值 viewMinx=newdouble[viewportMax]; //存放各視圖X軸最小值 viewMaxx=newdouble[viewportMax]; //存放各視圖X軸最大值 viewMiny=newdouble[viewportMax]; //存放各視圖y軸最小值 viewMaxy=newdouble[viewportMax]; //存放各視圖y軸最大值 viewMinx[currentViewport]=0.0; //設(shè)定當(dāng)前視圖的坐標(biāo)軸范圍 viewMiny[currentViewport]=0.0; viewMaxx[currentViewport]=1.0; viewMaxy[currentViewport]=1.0; viewportNum=1; //當(dāng)前視圖數(shù) } //設(shè)定用戶坐標(biāo)系范圍 publicvoidsetWindow(doublex1,doublex2,doubley1,doubley2){ userMinx=x1; //設(shè)定窗口(用戶坐標(biāo)系)X軸的最小值 userMaxx=x2; //設(shè)定窗口(用戶坐標(biāo)系)X軸的最大值 userMiny=y1; //設(shè)定窗口(用戶坐標(biāo)系)y軸的最小值 userMaxy=y2; //設(shè)定窗口(用戶坐標(biāo)系)y軸的最大值 } //設(shè)定視圖 publicvoidsetViewport(doublex1,doublex2,doubley1,doubley2){ currentViewport=viewportNum; //設(shè)定新的當(dāng)前視圖索引號(hào) viewportNum++; //當(dāng)前視圖數(shù)加1 viewMinx[currentViewport]=x1; //存放視圖的X軸最小值 viewMaxx[currentViewport]=x2; //存放視圖的X軸最大值 viewMiny[currentViewport]=y1; //存放視圖的y軸最小值 viewMaxy[currentViewport]=y2; //存放視圖的y軸最大值 } //視圖復(fù)位 publicvoidresetViewport(){ currentViewport=0; //當(dāng)前視圖索引號(hào)重歸于零 viewMinx[currentViewport]=0.0; //設(shè)定當(dāng)前視圖的坐標(biāo)軸范圍 viewMiny[currentViewport]=0.0; viewMaxx[currentViewport]=1.0; viewMaxy[currentViewport]=1.0; viewportNum=1; //當(dāng)前視圖數(shù) } //將視圖坐標(biāo)系的點(diǎn)轉(zhuǎn)換到JavaAWT坐標(biāo) publicintgetIntX(doublex){ return(int)(windowWidth*x); //注意視圖坐標(biāo)0-1之間 } publicintgetIntY(doubley){ return(int)(windowHeight*(1-y)); //Y軸方向相反 } //將用戶坐標(biāo)的點(diǎn)轉(zhuǎn)換到視圖坐標(biāo) publicdoubleviewX(doublex){ doubles=(x-userMinx)/(userMaxx-userMinx); doublet=viewMinx[currentViewport]+s* //坐標(biāo)的平移及壓縮 (viewMaxx[currentViewport]-viewMinx[currentViewport]); returnt; } publicdoubleviewY(doubley){ doubles=(y-userMiny)/(userMaxy-userMiny); doublet=viewMiny[currentViewport]+s* //坐標(biāo)的平移及壓縮 (viewMaxy[currentViewport]-viewMiny[currentViewport]); returnt; } //將用戶坐標(biāo)的點(diǎn)轉(zhuǎn)換到JavaAWT坐標(biāo) publicintgetX(doublex){ doublexx=viewX(x); //先將x轉(zhuǎn)換到視圖坐標(biāo) intix=getIntX(xx); //將視圖坐標(biāo)轉(zhuǎn)換到JavaAWT坐標(biāo) returnix; } publicintgetY(doubley){ doubleyy=viewY(y); //先將y轉(zhuǎn)換到視圖坐標(biāo) intiy=getIntY(yy); //將視圖坐標(biāo)轉(zhuǎn)換到JavaAWT坐標(biāo) returniy; } //將用戶坐標(biāo)系的寬度、高度值投影到JavaAWT坐標(biāo) publicintgetDimensionX(doublew){ doublex=viewMaxx[currentViewport]-viewMinx[currentViewport]; x*=windowWidth*w/(userMaxx-userMinx); //按比例投影,經(jīng)由視圖坐標(biāo)系 return((int)Math.abs(x)); //用戶坐標(biāo)系可能反向 } publicintgetDimensionY(doubleh){ doubley=viewMaxy[currentViewport]-viewMiny[currentViewport]; y*=windowHeight*h/(userMaxy-userMiny); //按比例投影,經(jīng)由視圖坐標(biāo)系 return((int)Math.abs(y)); //用戶坐標(biāo)系可能反向 } //有關(guān)當(dāng)前顏色的設(shè)定方法:畫筆顏色、前景色、背景色 publicColorgetColor(){ returncurrentFrontColor; //得到當(dāng)前顏色序號(hào) } publicvoidsetColor(Colorc){ graphics.setColor(c); //設(shè)置圖形對(duì)象的顏色 currentFrontColor=c; //設(shè)定當(dāng)前顏色序號(hào) } publicColorgetForeground(){ returncurrentFrontColor; //得到當(dāng)前前景色序號(hào) } publicvoidsetForeground(Colorc){ component.setForeground(c); //設(shè)置前景色 currentFrontColor=c; //設(shè)定當(dāng)前前景色序號(hào) } publicColorgetBackground(){ returncurrentBackColor; //得到當(dāng)前背景色序號(hào) } publicvoidsetBackground(Colorc){ component.setBackground(c); //設(shè)置背景色 currentBackColor=c; //設(shè)定當(dāng)前背景色序號(hào) } //-----各類圖形的描畫方法----------- //直線畫法:兩點(diǎn)式參數(shù) publicvoiddrawLine(doublex1,doubley1,doublex2,doubley2){ //從用戶的點(diǎn)坐標(biāo)轉(zhuǎn)換到JavaAWT坐標(biāo) intix1=getX(x1); intiy1=getY(y1); intix2=getX(x2); intiy2=getY(y2); graphics.drawLine(ix1,iy1,ix2,iy2); //這個(gè)方法它是怎樣畫直線的? } //矩形畫法:對(duì)角式參數(shù) publicvoiddrawRect(doublex1,doubley1,doublex2,doubley2){ //從用戶的點(diǎn)坐標(biāo)轉(zhuǎn)換到JavaAWT坐標(biāo) intix1=getX(x1); intiy1=getY(y1); intix2=getX(x2); intiy2=getY(y2); intix0=(ix1<ix2)?ix1:ix2; //矩形左上角坐標(biāo) intiy0=(iy1<iy2)?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){ //從用戶的點(diǎn)坐標(biāo)轉(zhuǎn)換到JavaAWT坐標(biāo) intix1=getX(x1); intiy1=getY(y1); intix2=getX(x2); intiy2=getY(y2); intix0=(ix1<ix2)?ix1:ix2; //矩形左上角坐標(biāo) intiy0=(iy1<iy2)?iy1:iy2; intwidth=Math.abs((ix1-ix2))+1; //矩形寬度,單位像素 intheight=Math.abs((iy1-iy2))+1; //矩形高度 graphics.fillRect(ix0,iy0,width,height); //填充算法如何實(shí)現(xiàn)? } //矩形區(qū)域的清除 publicvoidclearRect(doublex1,doubley1,doublex2,doubley2){ //從用戶的點(diǎn)坐標(biāo)轉(zhuǎn)換到JavaAWT坐標(biāo) intix1=getX(x1); intiy1=getY(y1); intix2=getX(x2); intiy2=getY(y2); intix0=(ix1<ix2)?ix1:ix2; //矩形左上角坐標(biāo) intiy0=(iy1<iy2)?iy1:iy2; intwidth=Math.abs((ix1-ix2))+1; //矩形寬度,單位像素 intheight=Math.abs((iy1-iy2))+1; //矩形高度 graphics.clearRect(ix0,iy0,width,height); //算法等同填充 }//橢圓的畫法(圓心坐標(biāo)和兩個(gè)半徑) publicvoiddrawOval(doublex,doubl
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣告施工環(huán)保合同文本格式
- 交通運(yùn)輸HSE施工安全協(xié)議
- 橋梁建設(shè)沖擊鉆施工合同
- 地鐵換乘站電梯租賃協(xié)議
- 玻璃衛(wèi)生應(yīng)急隊(duì)伍管理辦法
- 燒烤店行業(yè)合作合伙協(xié)議書
- 2024年工程承包方與甲方之間的單項(xiàng)工程合同
- 2024專賣店員工勞動(dòng)合同范本
- 2024解除買賣合同協(xié)議書
- 2024年城市供水排水工程建設(shè)的委托監(jiān)理合同
- 設(shè)備部-常用維修工具的使用課件
- 教老外一些基礎(chǔ)漢語(yǔ)教學(xué)課件
- 鋅鋼護(hù)欄安裝施工技術(shù)
- BOSCH 噴油器型號(hào)與參數(shù)對(duì)照表
- 常用中醫(yī)護(hù)理技術(shù)在腫瘤患者中的應(yīng)用
- 大學(xué)生溝通成功的案例(9篇)
- 2022年全國(guó)大學(xué)生英語(yǔ)競(jìng)賽D類試題(含答案)
- 音樂(lè)欣賞PPT全套完整教學(xué)課件
- 第二章作物需水量和灌溉用水量
- 深圳航空飛行品質(zhì)監(jiān)控系統(tǒng)(FOQA)需求規(guī)格說(shuō)明書 V2.0
- 木刻版畫-馬宏強(qiáng)課件
評(píng)論
0/150
提交評(píng)論