實(shí)驗(yàn)3實(shí)驗(yàn)報(bào)告_第1頁(yè)
實(shí)驗(yàn)3實(shí)驗(yàn)報(bào)告_第2頁(yè)
實(shí)驗(yàn)3實(shí)驗(yàn)報(bào)告_第3頁(yè)
實(shí)驗(yàn)3實(shí)驗(yàn)報(bào)告_第4頁(yè)
實(shí)驗(yàn)3實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

實(shí)驗(yàn)3實(shí)驗(yàn)報(bào)告格式《計(jì)算機(jī)圖形學(xué)》實(shí)驗(yàn)3實(shí)驗(yàn)報(bào)告

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

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論