計(jì)算機(jī)圖形學(xué)畫多邊形_第1頁
計(jì)算機(jī)圖形學(xué)畫多邊形_第2頁
計(jì)算機(jī)圖形學(xué)畫多邊形_第3頁
計(jì)算機(jī)圖形學(xué)畫多邊形_第4頁
計(jì)算機(jī)圖形學(xué)畫多邊形_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

的建立)。(2)編輯菜單資源。設(shè)計(jì)如圖1-29所示的菜單項(xiàng)。在工作區(qū)的ResourceView標(biāo)簽中,單擊Menu項(xiàng)左邊“+”,然后雙擊其子項(xiàng)IDR_MAINFRAME,并根據(jù)表1-9中的定義編輯菜單資源。表1-9菜單資源表菜單標(biāo)題菜單項(xiàng)標(biāo)題標(biāo)小付ID圖形裁剪線段裁剪ID_CLIPLINE多邊形裁剪ID_CLIPPOLYGON(3)添加消息處理函數(shù)。利用ClassWizard(建立類向?qū)?為應(yīng)用程序添加與菜單項(xiàng)相關(guān)的消息處理函數(shù),ClassName欄中選擇CMyView,根據(jù)表1-10建立如下的消息映射函數(shù),ClassWizard會(huì)自動(dòng)完成有關(guān)的函數(shù)聲明。表1-10菜單項(xiàng)的消息處理函數(shù)菜單項(xiàng)ID消息消息處理函數(shù)ID_CLIPLINECONMMANOnIDTRANSLATIONID_CLIPPOLYGONCONMMANOnIDROTATION(4)添加代碼,在圖形裁剪應(yīng)用程序的相應(yīng)文件中添加如下黑體字部分代碼。①在“圖形裁剪View.h”文檔中的適當(dāng)位置添加定義存儲(chǔ)線段端點(diǎn)的數(shù)組。classCMyView:publicCView{protected://createfromserializationonlyapublic:CPointptset[N];};②在“圖形裁剪View.cpp”文檔中的適當(dāng)位置手工添加以下黑體部分代碼。#include"stdafx.h"#include"圖形裁剪.h"#endif#defineLEFT1#defineRIGHT2#defineBOTTOM4#defineTOP8#defineXL300#defineXR500#defineYT100#defineYB200//////////////////////////////////////////////////////////////////voidCMyView::OnDraw(CDC*pDC)//功能為程序開始呈現(xiàn)下面的界面{CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahereCPennewpen(PS_SOLID,1,RGB(255,0,0));CPen*old=pDC->SelectObject(&newpen);pDC->Rectangle(CRect(XL,YT,XR,YB));//剪切窗口,可通過修改上面的對應(yīng)數(shù)據(jù)修改裁剪矩形框ptset[0]=CPoint(320,150);//需要剪切的各種線段,可通過修改數(shù)據(jù)修改線段(見圖1-30)ptset[1]=CPoint(370,110);ptset[2]=CPoint(200,190);ptset[3]=CPoint(550,150);圖1-30線段剪切ptset[4]=CPoint(200,250);ptset[5]=CPoint(350,230);ptset[6]=CPoint(400,50);ptset[7]=CPoint(450,130);pDC->TextOut(0,0,"雙擊,出現(xiàn)要剪切的線段");pDC->TextOut(0,0,"雙擊鼠標(biāo)右鍵,出現(xiàn)要剪切的多邊形");pDC->SelectObject(old);}////////////////////////////////////////////////////////////////////處理雙擊左鍵消息函數(shù),得到要進(jìn)行裁剪的直線段voidCMyView::OnLButtonDblClk(UINTnFlags,CPointpoint){CDC*pDC=GetDC();CPennewpen(PS_SOLID,1,RGB(255,0,0));CPen*old=pDC->SelectObject(&newpen);for(inti=0;i<N;i++){pDC->MoveTo(ptset[i]);

pDC->LineTo(ptset[i+1]);i++;}CView::OnLButtonDblClk(nFlags,point);}voidCMyView::OnClipline()//線段裁剪消息處理函數(shù){CDC*pDC=GetDC();CPennewpen(PS_SOLID,1,RGB(0,255,0));CPen*old=pDC->SelectObject(&newpen);if(flag!=1){MessageBox(“請先雙擊","警告!”);}(如圖1-31所示)elsefloatx,y,x1,x2,y1,y2;inti;intcode1,code2;RedrawWindow();//求兩端點(diǎn)所在區(qū)號codefor(i=0;i<N;i++,i++){intc=0;if(ptset[i].x<XL)c=c|LEFT;elseif(ptset[i].x>XR)c=c|RIGHT;if(ptset[i].y>YB)c=c|BOTTOM;elseif(ptset[i].y<YT)c=c|TOP;code1=c;圖1-31圖1-31警告圖示窗圖1-32線段剪切結(jié)果if(ptset[i+1].x<XL)c=c|LEFT;elseif(ptset[i+1].x>XR)c=c|RIGHT;if(ptset[i+1].y>YB)c=c|BOTTOM;elseif(ptset[i+1].y<YT)c=c|TOP;code2=c;//線段與區(qū)域的相交情況(見圖1-32)if(code1!=0&&code2!=0&&(code1&code2)==0){if((LEFT&code1)!=0)//線段與左邊界相交x=XL;y=ptset[i].y+(ptset[i+1].y-ptset[i].y)*(XL-ptset[i].x)/(ptset[i+1].x-ptset[i].x);}elseif((RIGHT&code1)!=0)//線段與右邊界相交{x=XR;y=ptset[i].y+(ptset[i+1].y-ptset[i].y)*(XR-ptset[i].x)/(ptset[i+1].x-ptset[i].x);}elseif((BOTTOM&code1)!=0)//線段與下邊界相交{y=YB;x=ptset[i].x+(ptset[i+1].x-ptset[i].x)*(YB-ptset[i].y)/(ptset[i+1].y-ptset[i+1].y);}elseif((TOP&code1)!=0)//線段與上邊界相交{y=YT;x=ptset[i].x+(ptset[i+1].x-ptset[i].x)*(YT-ptset[i].y)/(ptset[i+1].y-ptset[i].y);}ptset[i].x=x;ptset[i].y=y;if((LEFT&code2)!=0)//線段與左邊界相交{x=XL;y=ptset[i].y+(ptset[i+1].y-ptset[i].y)*(XL-ptset[i].x)/(ptset[i+1].x-ptset[i].x);}elseif((RIGHT&code2)!=0)//線段與右邊界相交{x=XR;y=ptset[i].y+(ptset[i+1].y-ptset[i].y)*(XR-ptset[i].x)/(ptset[i+1].x-ptset[i].x);}elseif((BOTTOM&code2)!=0)//線段與下邊界相交y=YB;x=ptset[i].x+(ptset[i+1].x-ptset[i].x)*(YB-ptset[i].y)/(ptset[i+1].y-ptset[i+1].y);}elseif((TOP&code2)!=0)//線段與上邊界相交{y=YT;x=ptset[i].x+(ptset[i+1].x-ptset[i].x)*(YT-ptset[i].y)/(ptset[I+1].y-ptset[i].y);}ptset[i+1].x=x;ptset[i+1].y=y;pDC->MoveTo(ptset[i].x,ptset[i].y);pDC->LineTo(ptset[i+1].x,ptset[i+1].y);}if(code1==0&&code2==0){pDC->MoveTo(ptset[i].x,ptset[i].y);pDC->LineTo(ptset[i+1].x,ptset[i+1].y);}if(code1==0&&code2!=0){pDC->MoveTo(ptset[0].x,ptset[0].y);if((LEFT&code2)!=0)//線段與左邊界相交{x=XL;y=ptset[i].y+(ptset[i+1].y-ptset[i].y)*(XL-ptset[i].x)/(ptset[i+1].x-ptset[i].x);}elseif((RIGHT&code2)!=0)//線段與右邊界相交{x=XR;y=ptset[i].y+(ptset[i+1].y-ptset[i].y)*(XR-ptset[i].x)/(ptset[i+1].x-ptset[i].x);}elseif((BOTTOM&code2)!=0)//線段與下邊界相交{y=YB;x=ptset[i].x+(ptset[i+1].x-ptset[i].x)*(YB-ptset[i].y)/(ptset[i+1].y-ptset[i+1].y);}elseif((TOP&code2)!=0)//線段與上邊界相交{y=YT;x=ptset[i].x+(ptset[i+1].x-ptset[i].x)*(YT-ptset[i].y)/(ptset[i+1].y-ptset[i].y);}ptset[i+1].x=x;ptset[i+1].y=y;pDC->LineTo(ptset[i+1].x,ptset[i+1].y);}if(code1!=0&&code2==0){pDC->MoveTo(ptset[i+1].x,ptset[i+1].y);if((LEFT&code1)!=0)//線段與左邊界相交{x=XL;y=ptset[i].y+(ptset[i+1].y-ptset[i].y)*(XL-ptset[i].x)/(ptset[i+1].x-ptset[i].x);}elseif((RIGHT&code1)!=0)//線段與右邊界相交{x=XR;y=ptset[i].y+(ptset[i+1].y-ptset[i].y)*(XR-ptset[i].x)/(ptset[i+1].x-ptset[i].x);}elseif((BOTTOM&code1)!=0)//線段與下邊界相交{y=YB;x=ptset[i].x+(ptset[i+1].x-ptset[i].x)*(YB-ptset[i].y)/(ptset[i+1].y-ptset[i+1].y);}elseif((TOP&code1)!=0)//線段與上邊界相交{y=YT;x=ptset[i].x+(ptset[i+1].x-ptset[i].x)*(YT-ptset[i].y)/(ptset[i+1].y-ptset[i].y);ptset[i].x=x;ptset[i].y=y;pDC->LineTo(ptset[i].x,ptset[i].y);}//處理雙擊右鍵出現(xiàn)要裁剪的多邊形(見圖1-33)voidCMyView::OnRButtonDblClk(UINTnFlags,CPointpoint){CDC*pDC=GetDC();CPennewpen(PS_SOLID,1,RGB(255,0,0));CPen*old=pDC->SelectObject(&newpen);pDC->MoveTo(ptset1[0]);for(inti=1;i<5;i++){pDC->LineTo(ptset1[i]);}CView::OnRButtonDblClk(nFlags,point);}voidCMyView::OnClippolygon()多邊形裁剪(見圖1-34){CDC*pDC=GetDC();CPennewpen(PS_SOLID,1,RGB(0,255,0));CPen*old=pDC->SelectObject(&newpen);if(flag!=1){MessageBox(“請先雙擊鼠標(biāo)右鍵","警告!");}(見圖1-35)else{inti,k;intcode1,code2;intM=5;RedrawWindow();//求兩端點(diǎn)所在區(qū)號codek=0;圖1-33多邊形剪切圖1-34多邊形剪切結(jié)果圖1-35警告提示窗for(i=0;i<M;i++)intc=0;if(ptset1[i].x<XL)c=1;elseif(ptset1[i].x>XL)c=0;code1=c;c=0;if(ptset1[i+1].x<XL)c=1;elseif(ptset1[i+1].x>XL)c=0;code2=c;if(code1!=0&&code2==0){pt[k].x=XL;pt[k].y=ptset1[i].y+(ptset1[i+1].y-ptset1[i].y)*(XL-ptset1[i].x)/(ptset1[i+1].x-ptset1[i].x);pt[k+1].x=ptset1[i+1].x;pt[k+1].y=ptset1[i+1].y;k=k+2;}if(code1==0&&code2==0){if(k==0){pt[k].x=ptset1[i].x;pt[k].y=ptset1[i].y;pt[k+1].x=ptset1[i+1].x;pt[k+1].y=ptset1[i+1].y;k=k+2;}if(k!=0){pt[k].x=ptset1[i+1].x;pt[k].y=ptset1[i+1].y;k=k+1;}}if(code1==0&&code2!=0)pt[k].x=XL;pt[k].y=ptset1[i].y+(ptset1[i+1].y-ptset1[i].y)*(XL-ptset1[i].x)/(ptset1[i+1].x-ptset1[i].x);k++;))pt[k].x=pt[0].x;pt[k].y=pt[0].y;M=k+1;k=0;for(i=0;i<M;i++)(intc=0;if(pt[i].x<XR)c=0;elseif(pt[i].x>XR)c=2;code1=c;c=0;if(pt[i+1].x<XR)c=0;elseif(pt[i+1].x>XR)c=2;code2=c;if(code1==0&&code2==0)(if(k==0)(pts[k].x=pt[i].x;pts[k].y=pt[i].y;pts[k+1].x=pt[i+1].x;pts[k+1].y=pt[i+1].y;k=k+2;)if(k!=0)(pts[k].x=pt[i+1].x;pts[k].y=pt[i+1].y;k++;))if(code1!=0&&code2==0)pts[k].x=XR;pts[k].y=pt[i].y+(pt[i+1].y-pt[i].y)*(XR-pt[i].x)/(pt[i+1].x-pt[i].x);pts[k+1].x=pt[i+1].x;pts[k+1].y=pt[i+1].y;k=k+2;)if(code1==0&&code2!=0)(pts[k].x=XR;pts[k].y=pt[i].y+(pt[i+1].y-pt[i].y)*(XR-pt[i].x)/(pt[i+1].x-pt[i].x);k=k+1;〃處理最后一條邊pts[k]=pts[0];M=k+1;k=0;for(i=0;i<M;i++)(intc=0;if(pts[i].y>YB)c=4;elseif(pts[i].y<YB)c=0;code1=c;c=0;if(pts[i+1].y>YB)c=4;elseif(pts[i+1].y<YB)c=0;code2=c;if(code1==0&&code2==0)(if(k==0)ptse[k].x=pts[i].x;ptse[k].y=pts[i].y;ptse[k+1].x=pts[i+1].x;ptse[k+1].y=pts[i+1].y;k=k+2;if(k!=0)ptse[k].x=pts[i+1].x;ptse[k].y=pts[i+1].y;k=k+1;}}if(code1!=0&&code2==0){ptse[k].y=YB;ptse[k].x=pts[i].x+(pts[i+1].x-pts[i].x)*(YB-pts[i].y)/(pts[i+1].y-pts[i+1].y);ptse[k+1].x=pts[i+1].x;ptse[k+1].y=pts[i+1].y;k=k+2;}}if(code1==0&&code2!=0){ptse[k].y=YB;ptse[k].x=pts[i].x+(pts[i+1].x-pts[i].x)*(YB-pts[i].y)/(pts[i+1].y-pts[i+1].y);k=k+1;}ptse[k]=ptse[0];M=k+1;k=0;for(i=0;i<M;i++){intc=0;if(ptse[i].y>YT)c=0;elseif(ptse[i].y<YT)c=1;code1=c;c=0;if(ptse[i+1].y>YT)c=0;elseif(ptse[i+1].y<YT)c=1;code2=c;if(code1!=0&&code2==0)p[k].y=YT;p[k].x=ptse[i].x+(ptse[i+1].x-ptse[i].x)*(YT-ptse[i].y)/(ptse[i+1].y-ptse[i].y);p[k+1].x=ptse[i+1].x;p[k+1].y=ptse[i+1].y;k=k+2;}if(code1==0&&code2==0){if(k==0){p[k].x=ptse[i].x;p[k].y=ptse[i].y;p[k+1].x=ptse[i+1].x;p[k+1].y=ptse[i+1].y;k=k+2;}if(k!=0){p[k].x=ptse[i+1].x;p[k].y=ptse[i+1].y;k=k+1;}}if(code1==0&&code2!=0){p[k].y=YT;p[k].x=ptse[i].x+(ptse[i+1].x-ptse[i].x)*(YT-ptse[i].y)/(ptse[i+1].y-ptse[i].y);k++;}}p[k]=p[0];M=k+1;pDC->MoveTo(p[0]);for(intj=1;j<=M;j++)pDC->LineTo(p[j]);}說明:為避免上述“圖形裁剪”程序執(zhí)行過程中,在沒有雙擊就直接單擊“線段裁剪”或沒有雙擊就直接單擊“多邊形裁剪”的情況發(fā)生,設(shè)置了消息對話框進(jìn)行警告。1.7VisualC++中基本繪圖函數(shù)實(shí)際利用VisualC++中編制圖形程序,可以利用上述算法自己動(dòng)手編制基本圖形程序,作為圖形程序的基類,當(dāng)然還可利用系統(tǒng)中已提供的圖形基類。下面簡單介紹VisualC++提供的常用繪制圖形函數(shù)。.點(diǎn)畫點(diǎn)是最基本的繪圖操作,在繪圖中,畫點(diǎn)是通過調(diào)用CDC::SetPixel()或CDC::SetPixelV()函數(shù)來實(shí)現(xiàn)的,原型如:(1)COLORREFSetPixel(intx,inty,COLORREFcrColor);COLORREFSetPixel(POINTpoint,COLORREFcrColor);BOOLSetPixelV(intx,inty,COLORREFcrColor);BOOLSetPixelV(POINTpoint,COLORREFcrColor);2.畫筆一般格式:Cpen()::Cpen(intnPenStyle,intnWidth,CORLORREFcrColor);各屬性意義:nPenStyle設(shè)置畫筆的式樣,式樣有:PS_SOLID(實(shí)線),PS_DASH(虛線)、PS_DASHDOT(點(diǎn)劃線)、PS_DASHDOTDOT(雙點(diǎn)劃線)、PS_DOT(點(diǎn)線)、PS_NULL(空筆不畫線);nWidth設(shè)置線的寬度,默認(rèn)值為1(1個(gè)像素寬);crColor表示顏色,可用DWOR表示,也可用RGB(r,g,b)表示。3.畫刷用于指定填充的特征,畫刷創(chuàng)建的格式如下:CBrush::CBrush(創(chuàng)建一個(gè)空的畫刷對象),可用GreateSolidBrush(),Greateha-tchBrush(),GreatehatchBrushIndrect(),GreatePatternBrush(),GreateDIBPatternBrush()建立畫刷。CBrush::CBrush()建立單一顏色的畫刷,用次畫刷畫出的圖形內(nèi)部將會(huì)填充指定顏色。CBrush::CBrush(intnIndex,COLORREFcrColor);構(gòu)建名為hatch的畫刷,特點(diǎn)為畫出的多邊形內(nèi)部將填充nrColor指定的線條格式,nrColor有HS_BDIAGONAL(45°左下-右上的斜線)、HS_CROSS(垂直線和水平線)、HS_DIAGCROSS(45°左上-右下、左上-右下的相交斜線)、HS_HDLAGNAL(45°左上-右下的斜線)、HS_HORIZONAL(水平線)、HS_VERTICAL(垂直線)。CBrush::CBrush(Cbitmap*pBitmap)中pBitmap指向Cbitmap對象的指針,這一位圖對象包含用做畫刷圖案的位圖,此位圖必須為8X8大小,否則將對原位圖進(jìn)行裁剪。創(chuàng)建畫刷和畫筆后,還要用CDC類選中畫筆和畫刷,用CPaintDC,CClientDC或CWindowDC來選中、繪圖及撤銷對象。CClientDC對象代表客戶程序區(qū)域的繪圖畫面只能在窗口的客戶區(qū)域中畫圖。若需處理整個(gè)畫面(包括客戶程序區(qū)域和非客戶程序區(qū))設(shè)備上下文的調(diào)用和釋放可用CWindowDC。4.繪制直線函數(shù)(1)MoveTo()函數(shù)用來設(shè)置當(dāng)前的x,y的位置,創(chuàng)建的格式如下:CPointMoveTo(intx,inty);CPointMoveTo(POINTpoint);其中x,y用于定義新位置的坐標(biāo),point指定新位置,可為其傳遞一個(gè)POINT對象。功能:將線的起點(diǎn)從當(dāng)前位置移到新位置(x,y),并且只移動(dòng)點(diǎn)不畫線。(2)LineTo()用于繪制起點(diǎn)坐標(biāo)到終點(diǎn)直線,創(chuàng)建的格式如下:BOOLLineTo(intx,inty);BOOLLineTo(POINTpoint);其中x,y用于定義線的終點(diǎn)坐標(biāo),point指定線段端點(diǎn)位置,可為其傳遞一個(gè)POINT結(jié)構(gòu)或POINT對象。功能:從當(dāng)前的位置到新位置(x,y)畫線(不包括此端點(diǎn))。5.橢圓函數(shù)創(chuàng)建的格式如下:BOOLEllipse(intx1,inty1,intx2,inty2);BOOLEllipse(LPCRECTlpRect);說明:x1,y1為限定橢圓范圍的矩形左上角坐標(biāo),x2,y2為限定橢圓范圍的矩形右下角坐標(biāo)。LpRect指定橢圓的限定矩形,可為其傳遞一個(gè)CRect對象。.函數(shù)繪制一段橢圓弧Arc()創(chuàng)建的格式如下:BOOLArc(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);BOOLEllipse(LPCRECTlpRect);x1,y1為限定橢圓弧范圍的矩形左上角坐標(biāo);x2,y2為限定橢圓弧范圍的矩形右下角坐標(biāo)。x3,y3為起點(diǎn)坐標(biāo);x4,y4為終點(diǎn)坐標(biāo)。.矩形函數(shù)創(chuàng)建的格式如下:BOOLRectangle(intx1,inty1,intx2,inty2);x1,y1為矩形左上角坐標(biāo),x2,y2為矩形右下角坐標(biāo)。功能:使用當(dāng)前畫筆畫一矩形。8.連續(xù)畫線函數(shù)創(chuàng)建的格式如下:BOOLPolyLine(LPPOINTlpPoints,intnCount);說明:lpPoints指向POINT結(jié)構(gòu)數(shù)組,數(shù)組中每一個(gè)結(jié)構(gòu)標(biāo)識一個(gè)點(diǎn)的坐標(biāo)。nCount:為定義數(shù)組中的點(diǎn)數(shù),使用當(dāng)前畫筆從第一個(gè)點(diǎn)開始經(jīng)后續(xù)點(diǎn)連續(xù)畫線直到最后一個(gè)點(diǎn)。BOOLPolyLineTo(LPPOINT*lpPoints,intnCount);說明:lpPoints指向POINT結(jié)構(gòu)數(shù)組指針,畫一條或多條直線的指針,數(shù)組中存放直線頂點(diǎn)的坐標(biāo)。nCount:為定義數(shù)組中的點(diǎn)數(shù)。BOOLPolyBezier(LPPOINT*lpPoints);說明:lpPoints指向POINT結(jié)構(gòu)數(shù)組指針,畫一條或多條直線的指針,數(shù)組中包括曲線的重點(diǎn)和控制點(diǎn)。nCount:為定義數(shù)組中的點(diǎn)數(shù)。繪制三次貝塞爾曲線需要兩個(gè)控制點(diǎn)及一個(gè)

溫馨提示

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

評論

0/150

提交評論