版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
《計算機圖形學》實驗1實驗報告實驗題目:用戶坐標、視圖坐標、Javaawt坐標概念的建立和應用實驗內容:掌握用戶坐標、視圖坐標、Javaawt坐標概念,掌握三類坐標的轉換算法。編寫自己的算法函數(shù),并形成Java語言程序包。編寫程序調用驗證之。參考程序:有兩個示范程序MyCanvas.java和MyLineDrawApplet.java基本概念:用戶坐標:是獨立于設備的邏輯坐標,可以是用戶用來定義設計對象的各種坐標。
視圖坐標:是設備相關的坐標,隨目標渲染設備不同而不同。
Java
awt坐標:使用java.awt時的坐標,即窗口顯示圖像時的邊界坐標。。
填充:這個過程可以抽象的理解為以已知的線為中心,向周圍擴展像素,然后對這些像素所在的方塊進行著色。算法設計:功能:用戶可根據(jù)自己輸入的用戶坐標,進行視圖坐標與javaawt坐標之間的轉換,反向的轉換原理與正向相同。此外,該程序還可以進行一些基本圖形的繪制和顏色的填充,如矩形,橢圓等圖形。算法1:用戶坐標向視圖坐標的轉換設userMinx、userMaxx分別為用戶坐標系x軸的最小值與最大值,userMiny、userMaxy分別為用戶坐標系y軸的最小值與最大值;viewMinx、viewMaxx分別為視圖坐標系x軸的最小值與最大值,viewMiny、viewMaxy分別為視圖坐標系y軸的最小值與最大值。通過坐標的壓縮及平移實現(xiàn)坐標的轉換。轉換關系如下:viewX=viewMinx+(userX-userMinx)/(userMaxx-userMinx)*(viewMaxx-viewMinx)viewY=viewMiny+(userY-userMiny)/(userMaxy-userMiny)*(viewMaxy-viewMiny)算法實現(xiàn)://將用戶坐標的點轉換到視圖坐標 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; }算法2:視圖坐標向javaawt坐標的轉換若令(viewX,viewY)為視圖坐標,(x,y)為awt坐標,width、height分別為窗口的寬度和高度,則它們之間的轉換關系為:X=viewX*widthY=viewY*height算法實現(xiàn)://將視圖坐標系的點轉換到JavaAWT坐標 publicintgetIntX(doublex){ return(int)(windowWidth*x); //注意視圖坐標0-1之間 } publicintgetIntY(doubley){ return(int)(windowHeight*(1-y)); //Y軸方向相反 }算法3:橢圓的繪制首先將從用戶坐標獲得的圓心坐標轉換到javaawt坐標,將X、Y軸坐標分別投影在AWT坐標上,獲得橢圓外切矩形的左上角X、Y軸坐標,即可繪制出橢圓。算法實現(xiàn)://橢圓的畫法(圓心坐標和兩個半徑) publicvoiddrawOval(doublex,doubley,doublexr,doubleyr){ //圓心從用戶坐標轉換到JavaAWT坐標 intix=getX(x); intiy=getY(y); intixr=getDimensionX(xr); //x軸半徑投影到JavaAWT坐標 intiyr=getDimensionX(yr); //y軸半徑投影 intx0=ix-ixr; //橢圓外切矩形的左上角x坐標 inty0=iy-iyr; //橢圓外切矩形的左上角y坐標 graphics.drawOval(x0,y0,2*ixr,2*iyr); } 代碼://文件名:MyCanvas.java//定義用戶的canvas類,實現(xiàn)// 從用戶坐標到視圖的轉換// 視圖到JavaAWT坐標的轉換// 用戶坐標系的二維圖形的描畫方法,等//用編譯命令javac-d.MyCanvas.java把本文件制作成包MyCanvas//在調用這個包的程序里加入語句importMyCanvas.MyCanvas;package MyCanvas; //制作的包名,這里包名和類名同importjava.io.*;importjava.awt.*;importjava.awt.image.*;//定義canvas類publicclassMyCanvasextendsComponent{ //用戶坐標系范圍缺省值([-1,1],[-1,1]) protecteddoubleuserMinx=-1; //用戶坐標系X軸的最小值 protecteddoubleuserMaxx=1; //用戶坐標系X軸的最大值 protecteddoubleuserMiny=-1; //用戶坐標系Y軸的最小值 protecteddoubleuserMaxy=1; //用戶坐標系Y軸的最大值 //視圖的坐標范圍缺省值([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; //當前視圖數(shù) protectedintcurrentViewport=0; //當前視圖的索引號 //窗口大小 finalstaticintDefaultWindowSize=256; //缺省的窗口大小 protectedintwindowWidth=DefaultWindowSize; //窗口寬度 protectedintwindowHeight=DefaultWindowSize; //窗口寬度 //定義JavaAWT的Graphics和Component protectedGraphicsgraphics; //MyCanvas的Graphics數(shù)據(jù)類 protectedComponentcomponent; //MyCanvas的component數(shù)據(jù)類 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); //創(chuàng)建視圖 } //創(chuàng)建視圖 privatevoidcreateViewport(intmax){ currentViewport=0; //設定當前視圖索引號 viewportMax=max; //設定視圖數(shù)的最大值 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; //當前視圖數(shù) } //設定用戶坐標系范圍 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++; //當前視圖數(shù)加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; //當前視圖數(shù) } //將視圖坐標系的點轉換到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); //按比例投影,經(jīng)由視圖坐標系 return((int)Math.abs(x)); //用戶坐標系可能反向 } publicintgetDimensionY(doubleh){ doubley=viewMaxy[currentViewport]-viewMiny[currentViewport]; y*=windowHeight*h/(userMaxy-userMiny); //按比例投影,經(jīng)由視圖坐標系 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; //設定當前背景色序號 } //-----各類圖形的描畫方法----------- //直線畫法:兩點式參數(shù) publicvoiddrawLine(doublex1,doubley1,doublex2,doubley2){ //從用戶的點坐標轉換到JavaAWT坐標 intix1=getX(x1); intiy1=getY(y1); intix2=getX(x2); intiy2=getY(y2); graphics.drawLine(ix1,iy1,ix2,iy2); //這個方法它是怎樣畫直線的? } //矩形畫法:對角式參數(shù) publicvoiddrawRect(doublex1,doubley1,doublex2,doubley2){ //從用戶的點坐標轉換到JavaAWT坐標 intix1=getX(x1); intiy1=getY(y1); intix2=getX(x2); intiy2=getY(y2); intix0=(ix1<ix2)?ix1:ix2; //矩形左上角坐標 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){ //從用戶的點坐標轉換到JavaAWT坐標 intix1=getX(x1); intiy1=getY(y1); intix2=getX(x2); intiy2=getY(y2); intix0=(ix1<ix2)?ix1:ix2; //矩形左上角坐標 intiy0=(iy1<iy2)?iy1:iy2; intwidth=Math.abs((ix1-ix2))+1; //矩形寬度,單位像素 intheight=Math.abs((iy1-iy2))+1; //矩形高度 graphics.fillRect(ix0,iy0,width,height); //填充算法如何實現(xiàn)? } //矩形區(qū)域的清除 publicvoidclearRect(doublex1,doubley1,doublex2,doubley2){ //從用戶的點坐標轉換到JavaAWT坐標 intix1=getX(x1); intiy1=getY(y1); intix2=getX(x2); intiy2=getY(y2); intix0=(ix1<ix2)?ix1:ix2; //矩形左上角坐標 intiy0=(iy1<iy2)?iy1:iy2; intwidth=Math.abs((ix1-ix2))+1; //矩形寬度,單位像素 intheight=Math.abs((iy1-iy2))+1; //矩形高度 graphics.clearRect(ix0,iy0,width,height); //算法等同填充 }//橢圓的畫法(圓心坐標和兩個半徑) publicvoiddrawOval(doublex,doubl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度地下車庫買賣合同附帶車位管理及增值服務協(xié)議3篇
- 2024年度員工職務行為規(guī)范及保密協(xié)議書3篇
- 2024年國家重大水利工程土方運輸合同示范文本3篇
- 2024年度醫(yī)療設備租賃合作協(xié)議范本3篇
- 共同性斜視病因介紹
- 游戲安全的玩法
- 新疆警察學院《通信工程學》2023-2024學年第一學期期末試卷
- 白血病靶向藥物研究報告
- 《人文精神的發(fā)展》課件
- 技術加盟合同范例封面
- 管道巡護管理
- 2024年度托管班二人合伙協(xié)議書3篇
- 2024-2024年高考全國卷英語語法填空
- 第17課《貓》課件+【知識精研】統(tǒng)編版語文七年級上冊
- 專題01:新聞作品-2023-2024學年八年級語文上冊單元主題閱讀(統(tǒng)編版)(原卷版+解析)
- 湖北省武漢市東湖高新區(qū)2023-2024學年七年級上學期期末語文試題(解析版)
- 《風險評估培訓》課件
- DB13-T 5931-2024 珍珠棉生產企業(yè)安全生產技術條件
- 2025屆上海曹楊二中高二物理第一學期期末綜合測試模擬試題含解析
- 會議會務服務投標方案投標文件(技術方案)
- 成都大學《Python數(shù)據(jù)分析》2023-2024學年期末試卷
評論
0/150
提交評論