實驗3實驗報告_第1頁
實驗3實驗報告_第2頁
實驗3實驗報告_第3頁
實驗3實驗報告_第4頁
實驗3實驗報告_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

實驗3實驗報告格式《計算機圖形學》實驗3實驗報告

信息:張凱班級:信息1103學號:201101010331實驗題目:直線(光柵化)實數型Bresenham算法在用戶坐標系和JavaAWT坐標系下顯示圖像實驗內容:1直線(光柵化)實數型Bresenham算法原理及程序。2直線(光柵化)DDA算法原理及程序。3在用戶坐標系和JavaAWT坐標系下顯示圖像的算法原理及實現。寫程序調用驗證之。參考資料:1課件:光柵圖形生成算法.PPTBresenham算法演示程序已經在MyCanvas包里,DDA算法applet演示程序DDA.java有一個示范程序imageDrawApplet.java基本概念:(詳細敘述自己對實驗內容的理解)光柵化:光柵圖形顯示器可以看作一個像素的矩陣。在光柵顯示器上顯示的每一種圖形,實際上都是具有一種或多種顏色的像素集合。確定最佳逼近圖形的像素集合,并用指定屬性寫像素的過程稱為圖形的掃描轉換或光柵化。直線光柵化:尋找出最逼近直線的一組像數序列,表示該直線,并且填充色彩數據,這個過程就叫做直線的光柵化。DDA算法基本原理:舍入法求解最佳逼近;利用微分思想,即每一個點坐標都可以由前一個坐標變化一個增量得到。Bresenham算法原理:Bresenham直線算法是用來描繪由兩點所決定的直線的算法,它會算出一條線段在n維光柵上最接近的點。這個算法只會用到較為快速的整數加法、減法和位元移位,不會用到除法。各點選擇的原則是看精確值y與yi及yi+1的距離d1及d2的大小而定。算法設計:(詳細敘述自己設計的Bresenham算法以及程序的功能、不同坐標系下圖像顯示的算法)程序功能:用DDA算法畫出直線,在不同的坐標系下顯示圖像。Bresenham算法:用坐標為(xi,yi,r)的象素來表示直線上的點,則第i+1個點只能在C和D中選取。令d1=BC、d2=DB^>+1%Xi+1^>+1%Xi+1dl—d2=(y—y.)-(y.+l—y)=2y—y.-(y.+1)=2y—2y.-1i+1i,ri,ri+1i+1i,ri,ri+1i,r令£(xi+1)=yi+1-yi,r-0.5=BC—AC=BA=B—A=yi+1-(yi,r+yi,r+l)/2當£(xi+1)三0時,yi+1,r=yi,r+1,即選D點,即下個點(xi+1,yi+1)對應的象素(xi+1,yi+1,r)為(xi+1,yi,r+1)當£(xi+1)<0時,yi+1,r=yi,r,即選C點,即下個點(xi+1,yi+1)對應的象素(xi+1,yi+1,r)為(象素(xi+1,yi+1,r)為(xi+1,yi,r)不同坐標系下圖像顯示的算法:定義自己的坐標系,將用戶坐標系轉換為Javaawt坐標,調用Graphics類的drawImage方法即可。代碼:(給出和實驗內容相關的Java程序和注解,不要輔助代碼,否則扣分)//******線段光柵化的成員變量********protectedImageimage;//Java圖像類的對象protectedMemoryImageSourcemis;//內存圖像數據源protectedintpixelWidth;//圖像點陣的寬度(像素數)protectedintpixelHeight;//圖像點陣的高度(像素數)protectedint[]pixel;//存放圖像點的顏色(行優(yōu)先一維存放)protectedintxoffset;//像素數據窗口內X坐標的偏移protectedintyoffset;//像素數據窗口內Y坐標的偏移}}//直線(光柵化)實數型Bresenham算法publicvoidrasterizeDrawLine(doublex1,doubley1,doublex2,doubley2){doubleleftTopx,leftTopy;〃從用戶坐標到JavaAWT坐標intix1=getX(x1);intiy1=windowHeight-getY(y1);//到窗口下方的像素數intix2=getX(x2);intiy2=windowHeight-getY(y2);//到窗口下方的像素數if(x1<x2){leftTopx=xl;〃左上角的X坐標值設為xl(用戶坐標)xoffset=ixl;〃窗口中的偏移量是JavaAWT坐標}else{leftTopx=x2;〃左上角的X坐標值設為x2(用戶坐標)xoffset=ix2;〃窗口中的偏移量是JavaAWT坐標}if(y1vy2){〃用戶坐標原點在左下,JavaAWT在左上leftTopy=y2;〃左上角的y坐標值設為y2yoffset=iy1;〃窗口中的偏移量是JavaAWT坐標}else{〃用戶坐標原點在左下,JavaAWT在左上leftTopy=y1;〃左上角的y坐標值設為y1(用戶坐標)yoffset=iy2;〃窗口中的偏移量是JavaAWT坐標}intdx=ix2-ix1;〃取得X向的間距intdy=iy2-iy1;〃取得y向的間距intadx=Math.abs(dx);//X向的間距的絕對值intady=Math.abs(dy);//Y向的間距的絕對值pixelWidth=adx+1;//圖像點陣的寬度(像素數)pixelHeight=ady+1;//圖像點陣的高度(像素數)//一維數組存放圖像點的顏色(行優(yōu)先)pixel=newint[pixelWidth*pixelHeight];for(intk=0;k<pixelWidth*pixelHeight;k++)pixel[k]=0x00000000;//預設透明背景,32位0intsx=(dx>0)?1:-1;〃取正負號,1或者-1intsy=(dy>0)?1:-1;intx=ix1;//x從ix1開始循環(huán)inty=iy1;//y從iy1開始循環(huán)if(adx==0){〃說明這是平行于Y軸的直線for(intj=1;j<=ady;j++){myPutPixel(x,y);//調用同類成員函數,設當前定像素顏色y+=sy;//y坐標的改變量為1或者-1個像素elseif(ady==0){//說明這是平行于x軸的直線for(inti=1;i<=adx;i++){myPutPixel(x,y);//調用同類成員函數,設當前定像素顏色i+=sx;//x坐標的改變量為1或者-1個像素}}elseif(adx>ady){//直線走向貼近x軸方向doubled=(double)dy/(double)dx;//直線斜率doublety=(double)y;for(inti=1;i<=adx;i++,x+=sx){//x增加1或者-1個像素myPutPixel(x,y);//調用同類成員函數,設定當前像素顏色ty+=sx*d;//y坐標相應的改變量(像素)if(Math.abs(ty-y)>Math.abs(ty-y-sy))y+=sy;//沿y向前進了一個像素}}else{〃直線走向貼近Y軸方向(adx<=ady)doubled=(double)dx/(double)dy;〃直線斜率doubletx=(double)x;for(intj=1;j<=ady;j++,y+=sy){//y增加1或者-1個像素myPutPixel(x,y);//調用同類成員函數,設當前定像素顏色tx+=sy*d;//y坐標相應的改變量(像素)if(Math.abs(tx-x)>Math.abs(tx-x-sx))x+=sx;//沿x向前進了一個像素}}/**作成內存圖像源**/mis=newMemoryImageSource(pixelWidth,pixelHeight,pixel,0,pixelWidth);//生成內存圖像有五個參數image=createImage(mis);//生成圖像/**調用顯示圖像方法,需要四個參數**/myDrawImage(image,leftTopx,leftTopyt,his);}//結束Bresenham算法//設定當前像素的顏色publicvoidmyPutPixel(inti,intj){intr=getColor().getRed()&0xff;//獲取當前紅色值intg=getColor().getGreen()&0xff;〃綠色值intb=getColor().getBlue()&0xff;//藍色值inta=0xff000000|(r<<16)|(g<<8)|b;//組成像素值為32位二進制數,存放到像素數組的相應位置pixel[(pixelHeight-1-(j-yoffset))*pixelWidth+(i-xoffset)]=a;//其它位置為初始設置的透明色,不覆蓋原來已顯示的像素}//圖像的顯示publicbooleanmyDrawImage(Imageimg,doublex,doubley,ImageObserverobserver){〃從用戶坐標點轉換到JavaAWT坐標intix=getX(x);intiy=getY(y);〃調用AWT的圖像顯示returngraphics.drawImage(img,ix,iy,observer);}//******畫筆移動方法*******protecteddoublelastX=0;//畫筆當前位置X坐標protecteddoublelastY=0;//畫筆當前位置Y坐標//抬筆移動到指定位置publicvoidmoveTo(doublex,doubley){lastX=x;//更新畫筆的當前位置lastY=y;}//落筆移動到指定位置publicvoidlineTo(doublex,doubley){drawLine(lastX,lastY,x,y);//畫直線lastX=x;//更新畫筆的當前位置lastY=y;}}//===定義imageDrawApplet類======publicclassimageDrawAppletextendsApplet{protectedImageimage;//圖像對象protectedURLimageURL;//文件的URL//protectedStringimageFile="飛機.gif":〃文件路徑名protectedStringimageFile="pig.jpg";//文件路徑名protectedMyCanvasm;〃定義MyCanvas的對象publicvoidinit(){//初始化try{〃生成存放圖像數據文件的URLimageURL=newURL(getDocumentBase(),imageFile);}catch(MalformedURLExceptione){};MediaTrackermt=newMediaTracker(this);//剪輯對象image=getImage(imageURL);//獲取圖像mt.addImage(image,1);//將圖像追加到第一個剪輯try{mt.waitForID(1);//等待第一個剪輯就緒}catch(InterruptedExceptione){};m=newMyCanvas(this);//生成MyCanvas的對象}publicvoidpaint(Graphicsg){//繪圖方法/*在用戶坐標系下顯示圖像*///m.myDraw

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論