《計算機圖形學(xué)》實習(xí)指導(dǎo)書20140430_第1頁
《計算機圖形學(xué)》實習(xí)指導(dǎo)書20140430_第2頁
《計算機圖形學(xué)》實習(xí)指導(dǎo)書20140430_第3頁
《計算機圖形學(xué)》實習(xí)指導(dǎo)書20140430_第4頁
《計算機圖形學(xué)》實習(xí)指導(dǎo)書20140430_第5頁
已閱讀5頁,還剩91頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第一章VC編程基礎(chǔ)(3)用同樣的方法,將鼠標(biāo)右鍵響應(yīng)函數(shù)、鼠標(biāo)移動響應(yīng)函數(shù)加到程序中,只是在

#endifCStatusBarm_wndStatusBar;3)修改staticUINTindicators[]數(shù)組staticUINTindicators[]={ID_SEPARATOR,//statuslineindicator//ID_INDICATOR_CAPS,//ID_INDICATOR_NUM,//ID_INDICATOR_SCRL,ID_SEPARATOR,//statuslineindicatorID_SEPARATOR,//statuslineindicatorID_SEPARATOR,//statuslineindicator};4)將CMainFrame::OnCreate函數(shù)中的內(nèi)容作如下修改://if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|//WS_VISIBLE|CBRS_TOP//|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|//CBRS_SIZE_DYNAMIC)||//!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))if(!m_wndToolBar.Create(this)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)){TRACE0("Failedtocreatetoolbar\n");return-1;//failtocreate}5)在CMainFrame::OnCreate函數(shù)中最后一個語句前增加下列語句:m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);xx=point.x; //取出坐標(biāo)信息sprintf(p1,“%4d”,xx); //轉(zhuǎn)化為字符串m_wndStatusBar.SetPaneText(2,p1,TRUE);//在第2個區(qū)域顯示x坐標(biāo)m_wndStatusBar.SetPaneText(3,p1,TRUE);//在第3個區(qū)域顯示y坐標(biāo)獲得文檔類指針CClientDCht(this); //定義當(dāng)前繪圖設(shè)備if(MenuID==1){//DDA直線//第一次按鍵將第一點保留在文檔類數(shù)組中pDoc->group[PressNum]=point;//第二次按鍵保留第二點,用文檔類畫線pDoc->group[PressNum]=point;PressNum=0;//程序畫圖

//定義數(shù)組,public:voidDDALine(CClientDC*DCPoint);//定義函數(shù)CPenpen(0,0,RGB(255,0,0));//定義一支新筆CPen*pOldPen=DCPoint->SelectObject(&pen);//繪圖設(shè)備選新筆,//同時保留舊筆DCPoint->SetROP2(R2_COPYPEN);//繪圖方法為直接畫DCPoint->MoveTo(group[0]); //抬筆到第一點,第一點由鼠標(biāo)事先確定,//存放在group[0]DCPoint->LineTo(group[1]); //畫到第二點,第二點由鼠標(biāo)事先確定,//存放在group[1]DCPoint->SelectObject(pOldPen); //恢復(fù)舊筆}mPointOrign=point;mPointOld=point;;//記錄第一點pDC.SetROP2(R2_NOT);//設(shè)置異或方式pDC.MoveTo(mPointOrign);pDC.LineTo(mPointOld);//擦舊線pDC.MoveTo(mPointOrign);pDC.LineTo(point);//畫新線

第二章圖形生成1、理論分析1,xi第六種直線是垂直線,要求x0=x1,y0<y1。繪制程序如下:for(y=y0;y<=y1;y++){setpixel(x0,y,RGB(255,0,0));}對于一條任意給定的直線段,首先要判斷是否為水平或垂直線;如果是按照水平、垂直線繪制方法繪出;如果不是,就要調(diào)整起始、終止端點,判斷屬于1、2、3、4中的哪一類,然后根據(jù)類別選擇相應(yīng)的繪制方法。DCPoint->SetROP2(R2_COPYPEN);//繪圖方法為直接畫//直線端點由鼠標(biāo)確定后存放在group[0]、group[1]垂直線if(y0==y1)//水平線

x=x0;x0=x1;x1=x;//交換起始、終止點x=y0;y0=y1;y1=x;根據(jù)該算法,對于圓心為(0,0),半徑為R的圓,繪圖的起點為(0,R),d0=3-2R,遞推公式為 xi+1=xi+1,當(dāng)di>0 時,yi+1=yi–1,di+1=di+4(xi-yi)+10;當(dāng) di≤0時,yi+1=yi,di+1=di+4xi+6;結(jié)束條件為 xi>y i。根據(jù)對稱條件,找到一個圓上點(x,y),可以同時確定其他7個點(x,-y),(-x,y),(-x,-y),(y,x),(y,-x),(-y,x),(-y,-x)。對于圓心在任意點(x0,y0)的圓,可以使用上述方法,只是在繪點時,將(x,y)等8個點繪制成(x+x0,y+y0)。實現(xiàn)程序如下:獲得文檔類指針定義當(dāng)前繪圖設(shè)備第二次按鍵保留第二點,用文檔類畫線程序畫圖Bresenham圓if(PressNum==0){//第一次按鍵將第一點保留在mPointOrign

mPointOld=point;//記錄第一點elseif(PressNum==1){//第二次按鍵調(diào)用文檔類畫圓程序畫圖

pDC.SelectStockObject(NULL_BRUSH);//畫空心圓DCPoint->SetROP2(R2_COPYPEN);//繪圖方法為直接畫根據(jù)該算法,對于圓心為(x0,y0),半徑為R的圓,繪圖的起點為(x0,y0+R),d0=0,遞推公式為:當(dāng)di<0時,xi+1=xi+1,yi+1=yi,di+1=di+2(xi-x0)+1;當(dāng)di≥0時,xi+1=xi,yi+1=yi-1,di+1=di-2(yi-y0)+1;結(jié)束條件為yi≤y0。根據(jù)對稱條件,找到一個圓上點(x,y),可以同時確定其他3個點(x,2y0-y),(2x0-x,y),(2x0-x,2y0-y)。在繪點時,每求處一個點(x,y),應(yīng)同時繪出其它3個點。實現(xiàn)程序如下:if(MenuID==3||MenuID==4){//Bresenham圓以及正負(fù)法圓pDoc->BCircle(&ht,mPointOrign,point);ReleaseCapture();}elseif(PressNum==1&&MenuID==4){//第二次按鍵調(diào)用畫圓程序畫圖PressNum=0;pDoc->ZCircle(&ht,mPointOrign,point);ReleaseCapture();}if((MenuID==3||MenuID==4)&&PressNum==1){DCPoint->SetROP2(R2_COPYPEN);//繪圖方法為直接畫CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類指針pDoc->PointNum=0;//初始化CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類指針CClientDCht(this); //定義當(dāng)前繪圖設(shè)備pDoc->Bezier(&ht,1);//繪制Bezier函數(shù)MenuID=6; //將下面的操作改為修改控制點位置PressNum=0;}CView::OnRButtonDown(nFlags,point);}if(MenuID==6&&PressNum==0){//在控制點數(shù)組中,逐個尋找 pDoc->Bezier(&pDC,1);//擦除十字標(biāo)志和舊線pDoc->group[SaveNumber]=point;//記錄新控制點

pDoc->Bezier(&pDC,1);//畫十字標(biāo)志和新曲線

CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類指針pDC.SetROP2(R2_NOT);//設(shè)置異或方式for(inti=0;i<pDoc->PointNum;i++){//消除所有光標(biāo)pDoc->Bezier(&pDC,0);//繪制Bezier函數(shù)MenuID=5; //將下面的操作改回Bezier曲線方式CPointp[1000];//設(shè)置一個數(shù)組存儲完整的Bezier曲線控制點p[i++]=group[j++];//先將第1,2號點存入數(shù)組p[i++]=group[j++];while(j<=PointNum-2)//存入奇、偶號點,生成并存入插入點

for(j=0;j<i-3;j+=3)//控制點分組,分別生成各段曲線

if(mode)//mode=1時,以異或方式畫可擦除的黑色曲線,用于調(diào)整形狀else//mode=0時,畫紅色的正式曲線

dt=1.0/n;//參數(shù)t的間隔,分10段,即用10段直線表示一段曲線pDC->MoveTo(p1);//移到起點for(i=1;i<=n;i++)//用Bezier參數(shù)方程計算曲線上等間隔的10個點

SetPixel(),該函數(shù)原型如下:COLORREFSetPixel(intx,inty,COLORREFcrColor);COLORREFSetPixel(POINTpoint,COLORREFcrColor);不難看出,參數(shù)crColor即代表設(shè)置對應(yīng)坐標(biāo)的像素的顏色,因此,只需將先前程序中的crColor參數(shù)改為我們想要的顏色,就能改變生成的圖形的顏色。程序?qū)崿F(xiàn)//定義數(shù)組,classCcolorDialog:publicCCommonDialog。SetPixel()中的最后一個參數(shù)修改為成員變量CDC::TextOut,CDC::SetTextColor。BOOLTextOut(intx,inty,constCString&str);該函數(shù)用于在坐標(biāo)為(x,y)處顯示文字str。virtualCOLORREFSetTextColor(COLORREFcrColor);插入一個新的對話框模板資源,以攻輸入所需的字符串參數(shù)。使用Ctrl+R插入新對話框資源,如下圖:雙擊設(shè)計好的模板,為對話框資源添加一個類。然后使用Ctrl+W打開類向?qū)?,為三個編輯框添加變量,如下圖所示:給對話框類CDrawCharDlg添加兩個成員變量:classCDrawCharDlg:publicCDialog{//Constructionpublic: CDrawCharDlg(CWnd*pParent=NULL);//standardconstructorpublic: CFontm_fnt;//保存字體 COLORREFm_clrText;//保存顏色//DialogData //{{AFX_DATA(CDrawCharDlg) enum{IDD=IDD_DIALOG_DRAWCHAR}; CString m_strString; int m_nY; int m_nX;…………..}并在構(gòu)造函數(shù)將其初始化:CDrawCharDlg::CDrawCharDlg(CWnd*pParent/*=NULL*/) :CDialog(CDrawCharDlg::IDD,pParent){ //{{AFX_DATA_INIT(CDrawCharDlg) m_strString=_T(""); m_nY=0; m_nX=0; m_clrText=RGB(0,0,0); //}}AFX_DATA_INIT}用Ctrl+W打開類向?qū)?,為“字體”按鈕添加消息響應(yīng)函數(shù):voidCDrawCharDlg::OnButtonFont(){ //TODO:Addyourcontrolnotificationhandlercodehere CFontDialogdlg; if(dlg.DoModal()==IDOK) { m_fnt.DeleteObject(); LOGFONTLogFnt; dlg.GetCurrentFont(&LogFnt);//保存所選字體 m_fnt.CreateFontIndirect(&LogFnt);//創(chuàng)建所選字體 m_clrText=dlg.GetColor();//獲得所選顏色 }}上述函數(shù)中使用的CFontDialog是MFC中自帶的用于選擇字體的對話框。至此,已完成所有數(shù)據(jù)接收的部分,接下來要做的就是將字符按照接收到的信息顯示到屏幕上。首先在視圖類的.cpp文件的開頭添加如下代碼,將對話框的頭文件包含進(jìn)來:#include"stdafx.h"#include".h"#include".h"#include"View.h"#include"DrawCharDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW……………然后為菜單項“字符”添加消息響應(yīng)函數(shù):voidCMyView::OnDrawChar(){ //TODO:Addyourcommandhandlercodehere CDC*pDC=GetDC(); CDrawCharDlgdlg; if(dlg.DoModal()==IDOK) { CFont*pfntOld=pDC->SelectObject(&dlg.m_fnt);//保存舊字體 pDC->SetTextColor(dlg.m_clrText);//設(shè)置顏色 pDC->TextOut(dlg.m_nX,dlg.m_nY,dlg.m_strString);//畫到屏幕上 pDC->SelectObject(pfntOld);//還原舊字體 } ReleaseDC(pDC);}至此,字符的顯示已全部完成。第三章圖形變換CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類指針pDoc->GenerateGraph(&pDC);//調(diào)用文檔類函數(shù)在屏幕上生成圖形group[0].x=100;group[0].y=100;//圖形數(shù)據(jù)準(zhǔn)備DrawGraph(pDC);//畫圖形}if(MenuID==11){//平移mPointOld=point;//記錄第一點//根據(jù)兩點間距計算平移量for(inti=0;i<pDoc->PointNum;i++)//根據(jù)平移量計算新圖形坐標(biāo){ht.MoveTo(mPointOrign);//擦除橡皮筋pDoc->DrawGraph(&ht);//生成新圖形轉(zhuǎn)化為字符串m_wndStatusBar.SetPaneText(2,p1,TRUE);//在第2個區(qū)域顯示x坐標(biāo)sprintf(p1,"%4d",yy);在第3個區(qū)域顯示y坐標(biāo)擦舊線畫新線CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類指針if(MenuID==15){//對稱變換mPointOld=point;//記錄第一點pDoc->Symmetry(mPointOrign,point);//進(jìn)行對稱變換pDoc->DrawGraph(&ht);//生成新圖形擦舊線矩陣1b[0][0]=ca;b[0][1]=sa;b[0][2]=0;//矩陣2a[0][0]=b[0][0]*c[0][0]+b[0][1]*c[1][0]+b[0][2]*c[2][0];//矩陣1、2合并矩陣3c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];//矩陣1、2、3 合并b[0][0]=ca;b[0][1]=-sa;b[0][2]=0;//矩陣4

a[0][0]=b[0][0]*c[0][0]+b[0][1]*c[1][0]+b[0][2]*c[2][0];//矩陣1、2、3、4合并c[0][0]=b[0][0]*a[0][0]+b[0][1]*a[1][0]+b[0][2]*a[2][0];//所有矩陣合并

for(i=0;i<PointNum;i++)//利用復(fù)合矩陣對所有圖形點坐標(biāo)進(jìn)行變換

第四章圖形顯示if(MenuID==20){//種子填充:畫邊界 mPointOld1=point;//記錄第一點PressNum++;ht.MoveTo(mPointOrign);//擦除橡皮筋pDoc->group[0]=mPointOrign;//借助DDA直線函數(shù)畫邊界擦舊線畫新線if(MenuID==20&&PressNum>0){//種子填充

ht.MoveTo(mPointOrign);//擦除橡皮筋ht.LineTo(point);pDoc->group[0]=mPointOld1;//封閉多邊形pDoc->group[1]=mPointOrign;pDoc->DDALine(&ht);PressNum=0;MenuID=21;//改變操作方式為種子點選取ReleaseCapture();if(MenuID==21){//確定種子點,填充

pDoc->SeedFill(&ht,point);PressNum=0;MenuID=20;//設(shè)置決定頂點操作方式}CView::OnLButtonDown(nFlags,point);}intsavex,xleft,xright,pflag,x,y,num;CPointstack_ptr[200];/堆棧pDC->SetROP2(R2_COPYPEN);//繪圖方法為直接畫num=0;//num為堆棧中的種子數(shù)stack_ptr[num++]=seedpoint;while(num>0){x=stack_ptr[--num].x;y=stack_ptr[num].y;pDC->SetPixel(x,y,RGB(255,0,0));savex=x;x++;while(pDC->GetPixel(x,y)!=RGB(255,0,0))//向右填充,直到邊界{pDC->SetPixel(x++,y,RGB(255,0,0));};xright=x-1;x=savex-1;while(pDC->GetPixel(x,y)!=RGB(255,0,0))//向左填充,直到邊界{pDC->SetPixel(x--,y,RGB(255,0,0));};xleft=x+1;x=xleft;y++;//在掃描線下一行搜索未填充區(qū)域pflag=1;while(x<xright){if(pDC->GetPixel(x,y)!=RGB(255,0,0)&&pflag==1){邊界后的第一個未填充區(qū)域像素stack_ptr[num].x=x;stack_ptr[num++].y=y;x++;}if(pDC->GetPixel(x,y)==RGB(255,0,0))pflag=1;//pflag=1表示填充區(qū)域或邊界elsepflag=0;//pflag=0表示未填充區(qū)域x++;}x=xleft;y-=2; pflag=1;//在掃描線上一行搜索未填充區(qū)域while(x<xright){if(pDC->GetPixel(x,y)!=RGB(255,0,0)&&pflag==1){stack_ptr[num].x=x;stack_ptr[num++].y=y;x++;}if(pDC->GetPixel(x,y)==RGB(255,0,0)) pflag=1;elsepflag=0;x++;}}}if(MenuID==22){//邊緣填充選頂點if(MenuID==22){//邊緣填充選點結(jié)束 voidCMy200032590100Doc::EdgeFill(CClientDC*pDC) {inti,xr,x1,y1,x2,y2,y;floatm,x;CPenpen;pen.CreatePen(PS_SOLID,1,RGB(0,255,255));//確定填充顏色,由該顏色與背景//色異或混合而成pDC->SetROP2(R2_XORPEN);//繪圖方法為異或CPen*pOldPen=pDC->SelectObject(&pen);xr=0;for(i=0;i<PointNum;i++)//找出邊界盒右邊界參數(shù){if(xr<group[i].x)xr=group[i].x;}for(i=0;i<PointNum-1;i++)

{x1=group[i].x;x2=group[i+1].x;//取一條邊y1=group[i].y;y2=group[i+1].y;if(y1!=y2){if(y1>y2)//確保(x1,y1)為下端點{y=y1;y1=y2;y2=y; y=x1;x1=x2;x2=y;}m=(float)(x2-x1)/(float)(y2-y1);x=x1;//m為相鄰掃描線之間邊的x增量for(y=y1+1;y<=y2;y++){x+=m;//確定邊緣點pDC->MoveTo((int)x,y);//從邊緣點一直畫到邊界盒右端pDC->LineTo(xr,y);} }}pDC->SelectObject(pOldPen);}1、理論分析掃描線填充算法運用了復(fù)雜的數(shù)據(jù)結(jié)構(gòu),且在填充過程中需要反復(fù)排序,編程難度較大。VC類庫中的函數(shù)CDC::Polygon()實現(xiàn)了掃描線填充算法功能。實際上我們所學(xué)的計算機圖形學(xué)所有算法都能通過引用VC類庫提供的函數(shù)(或函數(shù)組合)加以實現(xiàn)。本節(jié)通過引用函數(shù)CDC::Polygon(),來說明如何應(yīng)用VC類函數(shù)。函數(shù)CDC::Polygon(LPPOINTlpPoints,intnCount)有兩個參數(shù),lpPoints是一個數(shù)組,用來存儲多邊形的頂點,nCount是一個表示頂點數(shù)量的整形數(shù)。按照要求準(zhǔn)備好這兩個參數(shù),就可以調(diào)用函數(shù)了。2、操作說明操作與邊緣填充完全一樣。在選取菜單項后,用鼠標(biāo)左鍵依次選取多邊形頂點;在前一個頂點確定、鼠標(biāo)移動時,用一根橡皮筋表示前一頂點與當(dāng)前點之間的連線,以方便當(dāng)前邊的確定;最后用右鍵結(jié)束選點,程序?qū)⒆詈笠粋€頂點與第一個頂點用線連接起來,以表示還有這樣一條邊,確保多邊形封閉。3、編程實現(xiàn)1)菜單響應(yīng)函數(shù)建立.打開工程項目,依次點擊菜單“查看”、“建立類向?qū)А保霈F(xiàn)窗口。在ClassName:欄中選CMy200032590100View;在ObjectIds:欄中選ID_FILL_SCANLINE;在Messages:欄中選COMMAND;點擊AddFunction按鍵,出現(xiàn)函數(shù)命名窗口,點擊該窗口中的OK按鍵,該函數(shù)在200032590100View.cpp中生成。點擊該窗口中的EditCode按鍵查看、編輯該函數(shù)。加入語句如下:CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類指針pDoc->PointNum=0;//實際上不需要該變量,但為了借鑒邊緣填充的部分功//能,與邊緣填充保持一致if(MenuID==23){pDoc->group[PressNum]=pDoc->group[0];//封閉多邊形ht.MoveTo(pDoc->group[PressNum-1]);//擦除ht.LineTo(pDoc->group[0]);for(i=0;i<PressNum;i++)//擦除ht.LineTo(pDoc->group[i+1]);CPenpen(PS_SOLID,1,RGB(255,0,0));//設(shè)置多邊形邊界顏色(即畫筆)CPen*pOldPen=ht.SelectObject(&pen);CBrushbrush(RGB(0,255,0));//設(shè)置多邊形填充顏色(即畫刷)CBrush*pOldBrush=ht.SelectObject(&brush);ht.SetROP2(R2_COPYPEN); //設(shè)置直接畫方式ht.Polygon(pDoc->group,PressNum);//調(diào)用多邊形掃描線填充函數(shù)ht.SelectObject(pOldPen);//恢復(fù)系統(tǒng)的畫筆、畫刷顏色設(shè)置ht.SelectObject(pOldBrush);PressNum=0;pDoc->PointNum=0;//初始化參數(shù),為下一次操作做準(zhǔn)備ReleaseCapture();}第五章二維裁剪CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類指針#defineXMIN100//定義的窗口參數(shù)符號,符號只要在被使用前定義即可#defineLEFT1//定義的幾個常數(shù)符號code1=encode(x1,y1);//對端點編碼code2=encode(x2,y2);if((code1&code2)!=0)return;//完全不可見if((LEFT&code)!=0)//求線段與窗口左邊的交點elseif((RIGHT&code)!=0)//求線段與窗口右邊的交點elseif((BOTTOM&code)!=0)//求線段與窗口底邊的交點elseif((TOP&code)!=0)//求線段與窗口頂邊的交點CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類指針邊緣填充選頂點if(MenuID==25){//多邊形裁剪pDoc->group[PressNum]=pDoc->group[0];//將第一個頂點作為最后一個頂點//記錄頂點數(shù)量//用第一條窗口邊進(jìn)行裁剪//用第二條窗口邊進(jìn)行裁剪//用第三條窗口邊進(jìn)行裁剪//用第四條窗口邊進(jìn)行裁剪pDC->MoveTo(group[0]);//繪制裁剪多邊形x=XMINif(group[n].x<XMIN&&group[n+1].x<XMIN)//外外,不輸出

if(group[n].x>=XMIN&&group[n+1].x>=XMIN)//里里,輸出后點

if(group[n].x>=XMIN&&group[n+1].x<XMIN)//里外,輸出交點

if(group[n].x<XMIN&&group[n+1].x>=XMIN)//外里,輸出交點、后點y=YMAXif(group[n].y>=YMAX&&group[n+1].y>=YMAX)//外外,不輸出if(group[n].y<YMAX&&group[n+1].y<YMAX)//里里,輸出后點if(group[n].y<YMAX&&group[n+1].y>=YMAX)//里外,輸出交點if(group[n].y>=YMAX&&group[n+1].y<YMAX)//外里,輸出交點、后點x=XMAXif(group[n].x>=XMAX&&group[n+1].x>=XMAX)//外外,不輸出

if(group[n].x<XMAX&&group[n+1].x<XMAX)//里里,輸出后點

if(group[n].x<XMAX&&group[n+1].x>=XMAX)//里外,輸出交點

if(group[n].x>=XMAX&&group[n+1].x<XMAX)//外里,輸出交點、后點

y=YMIN

if(group[n].y<YMIN&&group[n+1].y<YMIN)//外外,不輸出

if(group[n].y>=YMIN&&group[n+1].y>=YMIN)//里里,輸出后點

if(group[n].y>=YMIN&&group[n+1].y<YMIN)//里外,輸出交點

if(group[n].y<YMIN&&group[n+1].y>=YMIN)//外里,輸出交點、后點

圓裁剪與直線裁剪和多邊形裁剪都不一樣,直線裁剪完還是直線,多邊形裁剪完還是多邊形,而圓裁剪完便有可能不再是圓,所以我們需要修改圓的生成算法,讓其能夠自主判斷是否在矩形框內(nèi),若是,則繪出該點像素,若不是,則不繪。在選擇裁剪菜單后,立即生成指定窗口。用鼠標(biāo)左鍵依次確定圓的圓心和圓上一點。然后立即調(diào)用文檔類裁剪函數(shù)對圓進(jìn)行裁剪,并用紅色標(biāo)記裁剪結(jié)果。在畫圓的過程中,依然使用橡皮筋顯示圓的位置。編程實現(xiàn)修改然后在voidCMy::BCircle(*DCPoint,CRect*rc){ intr,d,x,y,x0,y0; DCPoint->SetROP2(R2_COPYPEN);//繪圖方法為直接畫 r=(int)sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));x=0;y=r;d=3-2*r;x0=p1.x;y0=p1.y; while(x<y||x==y) {if(rc->PtInRect(CPoint(x+x0,y+y0))) //判斷點是否在矩形框內(nèi)DCPoint->SetPixel(x+x0,y+y0,);if(rc->PtInRect(CPoint(-x+x0,y+y0))) DCPoint->SetPixel(-x+x0,y+y0,);if(rc->PtInRect(CPoint(x+x0,-y+y0)))DCPoint->SetPixel(x+x0,-y+y0,);if(rc->PtInRect(CPoint(-x+x0,-y+y0)))DCPoint->SetPixel(-x+x0,-y+y0,);if(rc->PtInRect(CPoint(y+x0,x+y0))) DCPoint->SetPixel(y+x0,x+y0,);if(rc->PtInRect(CPoint(-y+x0,x+y0))) DCPoint->SetPixel(-y+x0,x+y0,);if(rc->PtInRect(CPoint(y+x0,-x+y0)))DCPoint->SetPixel(y+x0,-x+y0,);if(rc->PtInRect(CPoint(-y+x0,-

溫馨提示

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

評論

0/150

提交評論