




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)5實(shí)驗(yàn)報(bào)告格式計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)5實(shí)驗(yàn)報(bào)告xxxxxx xxx xxxxxxx實(shí)驗(yàn)題目:多邊形裁剪與填充實(shí)驗(yàn)內(nèi)容:1 閱讀理解提供的參考資料。2編寫(xiě)并調(diào)通一個(gè)多邊形裁剪的java程序。3編寫(xiě)并調(diào)通一個(gè)多邊形填充的java程序。參考資料:1 fillPolygon.java 2 clipSC2.java2變換與剪裁.ppt3多邊形的填充.ppt基本概念:(詳細(xì)敘述自己對(duì)實(shí)驗(yàn)內(nèi)容的理解)變換與裁剪基本概念的理解:矢量:矢量是一個(gè)n元組,在坐標(biāo)系中它對(duì)應(yīng)于n維空間的一個(gè)點(diǎn),這個(gè)點(diǎn) 可以代表物體在空間的位置,也可以代表其運(yùn)動(dòng)狀態(tài)等。模型坐標(biāo)系(局部坐標(biāo)系):當(dāng)構(gòu)造單個(gè)對(duì)象的數(shù)字模型時(shí),為了方便,可以
2、將其置于一個(gè)特定的坐標(biāo)系下,即模型坐標(biāo)系或局部坐標(biāo)系.世界坐標(biāo)系:為描述圖形場(chǎng)景中所有圖形之間的空間關(guān)系,將它們置于一個(gè)統(tǒng)一的坐標(biāo)系中,該坐標(biāo)系被稱為世界坐標(biāo)系。標(biāo)準(zhǔn)化設(shè)備坐標(biāo)系:有些圖形系統(tǒng),對(duì)設(shè)備坐標(biāo)系進(jìn)行了規(guī)范化,將坐標(biāo)范圍限定在區(qū)間x,y,z | 0x1, 0y1, 0z1內(nèi),稱標(biāo)準(zhǔn)化設(shè)備坐標(biāo)系投影: 三維空間中的對(duì)象要在二維的屏幕或圖紙上顯示出來(lái),就必須通過(guò)投影。投影的方法有兩種,平行投影和透視投影。視區(qū):在屏幕或繪圖紙上定義一個(gè)矩形,稱為視區(qū),也稱為視口,窗口內(nèi)的景物在視區(qū)中顯示。平移:點(diǎn)(x,y,z)由點(diǎn)(x, y, z)在x, y和z軸方向分別移動(dòng)距離x, y和z得到。兩點(diǎn)坐標(biāo)
3、間的關(guān)系為 x=x+x y=y+y (4.1) z=z+z放大和縮小以原點(diǎn)為中心的縮放:設(shè)點(diǎn)(x, y, z)經(jīng)縮放變換后得點(diǎn)(x,y,z)。兩點(diǎn)坐標(biāo)間的關(guān)系為其中sx,sy和sz 分別為沿x, y和z軸方向放縮的比例。其矩陣形式是圖形模式:矩陣合并時(shí),先調(diào)用的矩陣放在右邊,后調(diào)用的矩陣放在左邊.也稱為固定坐標(biāo)系模式。這種模式的特點(diǎn)是每一次變換均可看成相對(duì)于原始坐標(biāo)系執(zhí)行的??臻g模式:又稱活動(dòng)坐標(biāo)系模式。先調(diào)用的矩陣放在左邊,后調(diào)用的矩陣放在右邊,連續(xù)執(zhí)行幾次變換時(shí),每一次變換均可看成是在上一次變換形成的新坐標(biāo)系中進(jìn)行的。多邊形的填充:多邊形的表示方法:1)頂點(diǎn)表示是用多邊形的頂點(diǎn)的序列來(lái)描述
4、多邊形,該表示幾何意義強(qiáng)、占內(nèi)存少,但它不能直觀地說(shuō)明哪些像素在多邊形內(nèi)。2)點(diǎn)陣表示是用位于多邊形內(nèi)的象素的集合來(lái)刻劃多邊形,該方法雖然沒(méi)有多邊形的幾何信息,是面著色所需要的圖像表示形式。區(qū)域是指已經(jīng)表示成點(diǎn)陣形式的像素集合。在光柵圖形中,區(qū)域可采用內(nèi)點(diǎn)表示和邊界表示兩種形式進(jìn)行描述。內(nèi)點(diǎn)表示法:把位于給定區(qū)域內(nèi)的所有像素一一列舉出來(lái)的方法稱為內(nèi)點(diǎn)表示法。邊界表示法:把位于給定區(qū)域邊界上的像素一一列舉出來(lái)的方法稱為邊界表示法。算法設(shè)計(jì):(詳細(xì)敘述自己設(shè)計(jì)的的算法)多邊形裁剪算法分析:基本思想是一次用窗口的一條邊裁剪多邊形,窗口的一條邊以及延長(zhǎng)線構(gòu)成裁剪線,該線把平面分成兩個(gè)部分:可見(jiàn)一側(cè),不
5、可見(jiàn)一側(cè)。用一條裁剪邊對(duì)多邊形進(jìn)行裁剪,得到一個(gè)頂點(diǎn)序列,作為下一條裁剪邊處理過(guò)程的輸入點(diǎn)。對(duì)于每一條裁剪邊,只是判斷點(diǎn)在窗口的哪一測(cè)以及求線段與裁剪邊的交點(diǎn)算法應(yīng)隨之改變。多邊形裁剪的SutherlandHodgman算法1.SutherlandHodgman多邊形裁剪算法思想該算法的基本思想是每次用窗口的一條邊界及其延長(zhǎng)線來(lái)裁剪多邊形的各邊。多邊形通常由它的頂點(diǎn)序列來(lái)表示,經(jīng)過(guò)裁剪規(guī)則針對(duì)某條邊界裁剪后,結(jié)果形成新的頂點(diǎn)序列,又留待下條邊界進(jìn)行裁剪,直到窗口的所有邊界都裁剪完畢,算法形成最后的頂點(diǎn)序列,才是結(jié)果多邊形(它可能構(gòu)成一個(gè)或多個(gè)多邊形)。當(dāng)多邊形一個(gè)頂點(diǎn)Pi相對(duì)于窗口某條邊界及其
6、延長(zhǎng)線進(jìn)行剪裁時(shí),不外乎下列四種情況(即裁剪規(guī)則):1、頂點(diǎn)Pi在內(nèi)側(cè),前一頂點(diǎn)Pi-1也在內(nèi)側(cè),則將Pi納入新的頂點(diǎn)序列;2、頂點(diǎn)Pi在內(nèi)側(cè),前一頂點(diǎn)Pi-1在外側(cè),則先求交點(diǎn)Q,再將Q、Pi依次納入新的頂點(diǎn)序列;3、頂點(diǎn)Pi在外側(cè),前一頂點(diǎn)Pi-1在內(nèi)側(cè),則先求交點(diǎn)Q,再將Q納入新的頂點(diǎn)序列;4、頂點(diǎn)Pi與前一頂點(diǎn)Pi-1均在外側(cè),則頂點(diǎn)序列中不增加新的頂點(diǎn)。多邊形填充算法分析:確定多邊形所占有的最大掃描線數(shù),得到多邊形頂點(diǎn)的最小和最大y值(ymin和ymax),從y=ymin到y(tǒng)=ymax,每次用一條掃描進(jìn)行填充。對(duì)一條掃描線填充的過(guò)程可分為四個(gè)步驟:a.求交b.排序c.交點(diǎn)配對(duì)d.區(qū)間
7、填色。掃描多邊形填充算法的基本原理在直角坐標(biāo)系中,假設(shè)有一條從左至右的掃描線穿過(guò)多邊形,從左至右開(kāi)始計(jì)數(shù),與多邊形交點(diǎn)為奇數(shù)時(shí),開(kāi)始進(jìn)入多邊形,與多邊形交點(diǎn)為偶數(shù)時(shí),走出多邊形。這樣在這相鄰配對(duì)的奇偶交點(diǎn)間的所有象素都在多邊形內(nèi)。如圖,奇數(shù)交點(diǎn)a,c,都是入多邊形,偶數(shù)交點(diǎn)b,d都是走出多邊形,相鄰的奇偶交點(diǎn)配對(duì),a,b之間,c,d之間的象素都多邊形內(nèi),可見(jiàn)一條掃描線上,與多邊形交點(diǎn)個(gè)數(shù)需要為偶數(shù)。依據(jù)這樣的思路,掃描線從上到下從左到右依次掃過(guò)多邊形即可求得多邊形所占據(jù)的象素。(注意退化情況的處理,也就是掃描線剛好經(jīng)過(guò)頂點(diǎn)或者多邊形的邊本身就是水平的情況)bdca掃描多邊形填充的原理代碼:(給
8、出和實(shí)驗(yàn)內(nèi)容相關(guān)的Java程序和注解,不要輔助代碼,否則扣分) /Sutherland_Cohen裁減算法 public void Sutherland_Cohen(Graphics g,float x0,float y0,float x2,float y2) int c1,c2,c; float x,y,wx,wy; boolean accept=false,done=false; c1=code(x0,y0); c2=code(x2,y2); do if (c1|c2)=0)/兩個(gè)編碼都為0,表明在窗口內(nèi) accept=true; done=true; else if(c1&c2)!=0)
9、done=true;/兩個(gè)編碼的某一位為1,則必然在外側(cè)顯然在窗口外 else c=c1; if(c=0)c=c2; wx=x2-x0; wy=y2-y0; if (c&8)=8) /求交點(diǎn) x=x0+wx*(yT-y0)/wy; y=yT; else if (c&4)=4) x=x0+wx*(yB-y0)/wy; y=yB; else if (c&1)=1) y=y0+wy*(xL-x0)/wx; x=xL; else/即(c&2)=2 y=y0+wy*(xR-x0)/wx; x=xR; if (c=c1) /表明c1!=0,起始點(diǎn)不在窗口內(nèi),將交點(diǎn)作為新的起點(diǎn)重復(fù)判斷步驟; x0=x; y
10、0=y; c1=code(x0,y0); else /終點(diǎn)不在窗口內(nèi),交點(diǎn)作為新的終點(diǎn) x2=x; y2=y; c2=code(x2,y2); /else while (done=false); if(accept)g.drawLine(int)100,(int)150,(int)200,(int)150);=/fillPolygon.java/*定義多邊形單鏈表類(lèi)activeEdgeListclass activeEdgeList activeEdgeListEntry header=null;/鏈表頭指針activeEdgeListEntry tailer=null;/鏈表尾指針/構(gòu)造方法
11、public activeEdgeList(activeEdgeListEntry element) header=tailer=element;/指向第一個(gè)邊結(jié)點(diǎn)/把新結(jié)點(diǎn)插入有序排列的多邊形單鏈表public void insert(activeEdgeListEntry element) activeEdgeListEntry sentinel;/當(dāng)前結(jié)點(diǎn)指針if(element=null | this.header=null)/新結(jié)點(diǎn)異?;蛘哝湵砜誸hrow new NullPointerException();/出錯(cuò),拋出異常sentinel=this.header;/當(dāng)前指針指向表
12、頭結(jié)點(diǎn)int xt=element.topx;/新結(jié)點(diǎn)的topxint xtold=sentinel.topx;double oldDelta=sentinel.delta;/當(dāng)前結(jié)點(diǎn)的deltadouble newDelta=element.delta;/* 排序第一關(guān)鍵字結(jié)點(diǎn)的topx,第二關(guān)鍵字結(jié)點(diǎn)的delta */* 兩個(gè)關(guān)鍵字由小到大*/if(xtoldxt)|(xtold=xt)&(oldDeltanewDelta)while(true)/在鏈表頭指針之后尋找新結(jié)點(diǎn)element的位置if(sentinel.next=null) /當(dāng)前位置是表尾sentinel.next=elem
13、ent;/追加到表尾this.tailer=element;break;/結(jié)束while循環(huán)activeEdgeListEntry mp=sentinel.next;/下一結(jié)點(diǎn)int xmt=mp.topx;double midDelta=mp.delta;if(xmtxt)|(xmt=xt)&(midDeltanewDelta)sentinel=mp;/新結(jié)點(diǎn)仍然大于下一結(jié)點(diǎn),當(dāng)前結(jié)點(diǎn)指針后移,繼續(xù)循環(huán)else /否則,新結(jié)點(diǎn)就應(yīng)該插入當(dāng)前位置sentinel.next=element;element.next=mp;break;/結(jié)束while循環(huán),尾指針不動(dòng)/結(jié)束whileelse /新
14、結(jié)點(diǎn)作為單鏈表頭結(jié)點(diǎn)sentinel=this.header;this.header=element;element.next=sentinel;/插入新結(jié)點(diǎn)結(jié)束/把新結(jié)點(diǎn)作為多邊形鏈表的頭結(jié)點(diǎn)或者尾結(jié)點(diǎn)public void append(activeEdgeListEntry element) if(element=null) throw new NullPointerException();if(tailer=null) /如果單鏈表是空tailer=element;header=element;else /否則把新結(jié)點(diǎn)作為單鏈表尾結(jié)點(diǎn)tailer.next=element;tailer
15、=element;/兩個(gè)多邊形單鏈表的合并:自身單鏈表與list單鏈表的合并public activeEdgeList merge(activeEdgeList list,int y) if(list=null) return this;activeEdgeListEntry a=this.header;/自身單鏈表的頭指針activeEdgeListEntry b=list.header;/單鏈表list的頭指針activeEdgeListEntry save=null;/指向鏈表結(jié)點(diǎn)的工作指針activeEdgeListEntry anext,bnext;/指向鏈表結(jié)點(diǎn)的工作指針activ
16、eEdgeList result=null;/合并結(jié)果鏈表while(true) if(a=null&b=null) return result; /兩個(gè)空表else if(a=null) /自身為空表if(save!=null) save.next=b;result.tailer=list.tailer;return result; else if(b=null)/list為空表 if(save!=null) save.next=a;result.tailer=this.tailer;return result; /*兩個(gè)表都不空*/int xa=(int)(a.topx+(a.topy-y
17、)*a.delta);/自身鏈表int xb=b.topx;/list鏈表頭結(jié)點(diǎn)的topxif(xa=xb) /決定合并后兩個(gè)表的先后anext=a.next;a.next=null;if(result=null) /結(jié)果鏈表為空,則a表在前result=new activeEdgeList(a);save=result.tailer;else result.append(a);/結(jié)果鏈表不空,則a表在后save=a;a=anext;else bnext=b.next;b.next=null;if(result=null) /結(jié)果鏈表為空,則b表在前result=new activeEdgeL
18、ist(b);save=result.tailer;else result.append(b);/結(jié)果鏈表不空,則b表在后save=b;b=bnext; /結(jié)束while/單鏈表合并結(jié)束/刪除多邊形單鏈表的結(jié)點(diǎn)public void remove(activeEdgeListEntry element) activeEdgeListEntry p,q;if(header=element) /要?jiǎng)h除的是頭結(jié)點(diǎn)header=element.next;if(tailer=element) tailer=header;return;p=q=header;while(p!=element) q=p;p=
19、p.next;if(p=null) throw new NullPointerException();/查無(wú)此結(jié)點(diǎn)if(element=tailer) tailer=q;/要?jiǎng)h除的是尾結(jié)點(diǎn)q.next=p.next;/要?jiǎng)h除的是非頭尾結(jié)點(diǎn)/多邊形單鏈表的相鄰結(jié)點(diǎn)public void traverse() activeEdgeListEntry p,q,r,tmp;p=r=header;while(p!=null)q=p.next;if(q=null) break;/到達(dá)末尾if(q.xp.x) /多邊形單鏈表相鄰結(jié)點(diǎn)的x坐標(biāo)要由小到大tmp=q.next;/交換兩個(gè)結(jié)點(diǎn)if(p=header
20、) header=q; else r.next=q;q.next=p;p.next=tmp;r=p;/指向尾結(jié)點(diǎn)p=p.next;/下一個(gè)結(jié)點(diǎn)/結(jié)束whiletailer=r;/多邊形單鏈表新的尾指針/結(jié)束多邊形單鏈表類(lèi)/*定義直線類(lèi)class Line public double x1,y1;public double x2,y2;public Line(double x1,double y1,double x2,double y2) this.x1=x1;this.y1=y1;this.x2=x2;this.y2=y2; /結(jié)束直線類(lèi)/*定義多邊形的填充類(lèi)*/public class fi
21、llPolygon extends Applet /繼承鼠標(biāo)事件監(jiān)聽(tīng)接口implements MouseListener,MouseMotionListener protected MyCanvas m;/定義MyCanvas的對(duì)象/掃描行處理用數(shù)據(jù)protected activeEdgeListEntry edgeData=null;/邊結(jié)點(diǎn)數(shù)組protected activeEdgeList bucket=null;/多邊形單鏈表數(shù)組protected activeEdgeList activeHeader=null;/當(dāng)前邊單鏈表的頭指針protected int numEdge=5;/
22、多邊形的邊數(shù)/鼠標(biāo)相關(guān)數(shù)據(jù)protected boolean isFirstClicked=true;/鼠標(biāo)最初點(diǎn)擊protected boolean isDoubleClicked=false;/雙擊標(biāo)志protected boolean isSingleClicked=false;/單擊標(biāo)志/繪圖區(qū)域protected int width,height;/Applet繪圖區(qū)的大小protected Image image=null;/圖像區(qū)域protected MemoryImageSource mis=null;/內(nèi)存圖像protected int pixel=null;/內(nèi)存圖像配色數(shù)
23、組protected int pixelWidth;/圖像寬度protected int pixelHeight;/圖像高度protected int xoffset;/pixel數(shù)據(jù)的窗口內(nèi)顯示偏移量protected int yoffset;protected double leftTopx;/pixel數(shù)據(jù)的起始點(diǎn)protected double leftTopy;/多邊形的繪圖數(shù)據(jù)protected double x0,y0;/邊的起點(diǎn)protected double lastx,lasty;/邊的終點(diǎn)位置protected double movingx,movingy;/用戶坐標(biāo)系下
24、一個(gè)點(diǎn)的坐標(biāo)protected int numPoints=0;/頂點(diǎn)計(jì)數(shù)器protected boolean isPolygonMode=true;/標(biāo)志protected Vector lines=new Vector(256,256);/Java的向量類(lèi)/APPLET程序的初始化public void init()m=new MyCanvas(this);/本APPLET容器的MyCanvas對(duì)象addMouseListener(this);/定義鼠標(biāo)按鈕監(jiān)聽(tīng)器addMouseMotionListener(this);/定義鼠標(biāo)按鈕監(jiān)聽(tīng)器Dimension d=getSize();/本A
25、PPLET容器的大小width=d.width; height=d.height;/成員變量初始化public void initData()isFirstClicked=true;/鼠標(biāo)最初點(diǎn)擊isPolygonMode=true;/標(biāo)志描繪多邊形numPoints=0;/多邊形頂點(diǎn)計(jì)數(shù)器bucket=new activeEdgeListheight+1;/邊的單鏈表數(shù)組for(int i=0;i0) lines.removeAllElements();/向量類(lèi)的對(duì)象/APPLET程序的繪圖public void paint(Graphics g) if(isFirstClicked) /初
26、始狀態(tài)initData();Font f=m.MyFont(m.getFont().getName(),Font.BOLD+Font.ITALIC,3);m.setFont(f);m.drawString(單擊畫(huà)多邊形,-1,0.2);m.drawString(雙擊填充多邊形,-4,-6);m.setBackground(new Color(220,220,220);/背景色m.setColor(Color.black);/前景色for(int i=0;ilines.size();i+) Line l=(Line)lines.elementAt(i);/轉(zhuǎn)換第i個(gè)向量m.drawLine(l.
27、x1,l.y1,l.x2,l.y2);if(isPolygonMode&!isFirstClicked)/畫(huà)線m.drawLine(lastx,lasty,movingx,movingy);if(!isPolygonMode)&(image!=null)/填充m.myDrawImage(image,leftTopx,leftTopy,this);/APPLET程序的繪圖/把多邊形頂點(diǎn)數(shù)據(jù)生成邊結(jié)點(diǎn)public void registerActiveEdgeEntry() numEdge=lines.size();/多邊形邊的數(shù)量edgeData=new activeEdgeListEntryn
28、umEdge;for(int i=0;inumEdge;i+)/每個(gè)邊的單鏈表頭結(jié)點(diǎn)edgeDatai=new activeEdgeListEntry();/* 四個(gè)極值用于確定顯示圖像的大小和范圍 */int LARGE=0x0ffffffff;int xmin=LARGE,xmax=-1,ymin=LARGE,ymax=-1;double dxmin=LARGE,dxmax=-1,dymin=LARGE,dymax=-1;for(int i=0;iiy2) /邊的斜向edgeDatai.isHorizontal=false;edgeDatai.topy=iy1;edgeDatai.topx
29、=ix1;edgeDatai.x=ix1;edgeDatai.boty=iy2;edgeDatai.delta=(double)(-(ix2-ix1)/(iy2-iy1);if(iy2ymax) ymax=iy1;dymax=l.y1;else if(iy1iy2) /邊的斜向edgeDatai.isHorizontal=false;edgeDatai.topy=iy2;edgeDatai.topx=ix2;edgeDatai.x=ix2;edgeDatai.boty=iy1;edgeDatai.delta=(double)(-(ix1-ix2)/(iy1-iy2);if(iy1ymax) y
30、max=iy2;dymax=l.y2;else /水平邊y1=iy2edgeDatai.isHorizontal=true;if(iy1ymax) ymax=iy1;dymax=l.y1;if(ix1ix2) /進(jìn)行xMin xMax 計(jì)算if(ix1xmax) xmax=ix2;dxmax=l.x2;else if(ix2ix1) if(ix2xmax) xmax=ix1;dxmax=l.x1;else /垂直邊ix2=ix1if(ix1xmax) xmax=ix1;dxmax=l.x1;/結(jié)束for循環(huán)/*內(nèi)存圖像的數(shù)組空間及相關(guān)數(shù)據(jù)*/pixelWidth=xmax-xmin+1;pix
31、elHeight=ymax-ymin+1;pixel=new intpixelWidth*pixelHeight;/圖像的個(gè)點(diǎn)顏色for(int k=0;kpixelWidth*pixelHeight;k+)pixelk=0x00000000;/初值透明色xoffset=xmin;yoffset=ymin;leftTopx=dxmin;/用于顯示圖像方法myDrawImage();leftTopy=dymax;/生成邊結(jié)點(diǎn)registerActiveEdgeEntry()/多邊形單鏈表數(shù)組bucketd初始化public void bucketSort() for(int i=0;i=0;y-
32、) if(buckety!=null) /該指針元素存在makeActiveEdgeList(buckety,y);/建立該行的邊鏈表processActiveEdgeList(y);/處理該行的邊鏈表else if(activeHeader!=null&activeHeader.header!=null)processActiveEdgeList(y);/處理該行的邊鏈表/結(jié)束for循環(huán)/多邊形的掃描轉(zhuǎn)換/處理給定行的邊鏈表public void processActiveEdgeList(int y) int xleft,xright;double xl,xr;activeEdgeList
33、Entry left=activeHeader.header;activeEdgeListEntry right=left.next;if(right=null) return;while(true) xl=left.x;xr=right.x;xleft=(int)xl;xright=(int)(xr+0.5);if(xleft=y-1 & right.boty=y-1) xleft=(int)left.x;xright=(int)(right.x+0.5);if(xleft=y-1) /將左面的邊從當(dāng)前鏈表中刪去activeHeader.remove(left);if(right.boty=
34、y-1) /將左面的邊從當(dāng)前鏈表中刪去activeHeader.remove(right);left=right.next;/選擇當(dāng)前鏈表中下一對(duì)結(jié)點(diǎn)if(left=null) break;/到達(dá)鏈表末尾,退出循環(huán)right=left.next;if(right=null)/邊鏈表的結(jié)點(diǎn)數(shù)一定為偶數(shù)throw new NullPointerException();/出錯(cuò)/結(jié)束whileactiveHeader.traverse();/邊封閉后,重新整理單鏈表/處理給定行的邊鏈表/建立指定行的邊鏈表public void makeActiveEdgeList(activeEdgeList lis
35、t,int y) if(activeHeader=null)activeHeader=list;/指定為當(dāng)前單鏈表else/把list與當(dāng)前單鏈表合并activeHeader=activeHeader.merge(list,y);/填充何種圖案public boolean isTilePattern(int i,int j) if( i%8=0 | j%8=0 | i%8=1 | j%8=1 |i%8=2 | j%8=2 ) return true;/ 填充圖案1return false;/ 填充圖案2/設(shè)定像素顏色public void putPixel(int i,int j) int r
36、,g,b;if(isTilePattern(i,j)r=g=b=0;/黑色else r=(int)(Math.random()*255);/0到255之間的隨機(jī)數(shù)g=(int)(Math.random()*255);b=(int)(Math.random()*255);int a=0xff000000|(r16)|(g8)|b;/像素顏色/*圖像的i行j列處的顏色*/pixel(pixelHeight-1-(j-yoffset)*pixelWidth+(i-xoffset)=a;/填充指定行的像素列public void fillScanline(int xleft,int xright,in
37、t y) for(int x=xleft;x=2) /雙擊,添加多邊形的頂點(diǎn)isDoubleClicked=true;/標(biāo)記/* 給光柵向量表增加一行,這個(gè)向量成員方法導(dǎo)致編譯要加上參數(shù)-Xlint,會(huì)出現(xiàn)警告錯(cuò)誤*/lines.addElement(new Line(lastx,lasty,x0,y0);isPolygonMode=false;scanLineFillPolygon();/多邊形填充總控程序if(numEdge2) /內(nèi)存圖像生成mis=new MemoryImageSource(pixelWidth,pixelHeight,pixel,0,pixelWidth);image
38、=createImage(mis);else /單擊,準(zhǔn)備開(kāi)始if(isFirstClicked) /初次點(diǎn)擊isFirstClicked=false;/*先按照J(rèn)awa AWT坐標(biāo)ix iy得到視圖索引號(hào),再由視圖反向轉(zhuǎn)換得到用戶坐標(biāo)系下的lastx lasty*/lastx=x0=m.getUserX(ix,m.getViewport(ix,iy);lasty=y0=m.getUserY(iy,m.getViewport(iy,iy);movingx=lastx; movingy=lasty;else /非初次點(diǎn)擊/*ix iy所對(duì)應(yīng)的用戶坐標(biāo)系下的坐標(biāo)*/x=m.getUserX(ix,m.getViewport(ix,iy);y=m.getUserY(iy,m.getViewport(iy,iy);/* 給光柵向量表增加一行 */lines.addElement(new Line(lastx,lasty,x,y);lastx=x; lasty=y;numPoints+;repaint();/paint繪圖/結(jié)束if(isPolygonMode)語(yǔ)句/響應(yīng)鼠標(biāo)擊鍵事件/響應(yīng)鼠標(biāo)移動(dòng)事件public void mouseMoved(
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年自治區(qū)科技廳直屬事業(yè)單位引進(jìn)考試真題
- 修繕采購(gòu)協(xié)議合同范本
- 兼職輔導(dǎo)老師合同范例
- 新能源汽車(chē)動(dòng)力蓄電池系統(tǒng)構(gòu)造與檢修 項(xiàng)目三-課后習(xí)題帶答案
- 勞務(wù)分包用工合同范本
- 公司銷(xiāo)售渠道合同范本
- 農(nóng)民玉米出售合同范本
- 2024年杭州銀行招聘考試真題
- 2024年江西省人才服務(wù)有限公司招聘筆試真題
- 企業(yè)雇傭貨車(chē)合同范本
- 美團(tuán)外賣(mài)騎手服務(wù)合同(2025年度)
- 應(yīng)急預(yù)案解讀與實(shí)施
- 2025年《國(guó)有企業(yè)領(lǐng)導(dǎo)人員腐敗案例剖析》心得體會(huì)樣本(3篇)
- 廣告行業(yè)安全培訓(xùn)詳細(xì)介紹
- 2024-2029年全球及中國(guó)氨能源(綠氨)應(yīng)用可行性研究與投資戰(zhàn)略規(guī)劃分析報(bào)告
- 2025福南平市建武夷水務(wù)發(fā)展限公司招聘21人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年上半年工業(yè)和信息化部裝備工業(yè)發(fā)展中心應(yīng)屆畢業(yè)生招聘(第二批)易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年中遠(yuǎn)海運(yùn)物流有限公司招聘筆試參考題庫(kù)含答案解析
- 2024年廣州市海珠區(qū)衛(wèi)生健康系統(tǒng)招聘事業(yè)單位工作人員筆試真題
- 一科一品一骨科護(hù)理
- 加氣站安全培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論