版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第一章VC編程基礎(chǔ)(3)用同樣的方法,將鼠標(biāo)右鍵響應(yīng)函數(shù)、鼠標(biāo)移動(dòng)響應(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ù)中最后一個(gè)語(yǔ)句前增加下列語(yǔ)句: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個(gè)區(qū)域顯示x坐標(biāo)m_wndStatusBar.SetPaneText(3,p1,TRUE);//在第3個(gè)區(qū)域顯示y坐標(biāo)獲得文檔類(lèi)指針CClientDCht(this); //定義當(dāng)前繪圖設(shè)備if(MenuID==1){//DDA直線//第一次按鍵將第一點(diǎn)保留在文檔類(lèi)數(shù)組中pDoc->group[PressNum]=point;//第二次按鍵保留第二點(diǎn),用文檔類(lèi)畫(huà)線pDoc->group[PressNum]=point;PressNum=0;//程序畫(huà)圖
//定義數(shù)組,public:voidDDALine(CClientDC*DCPoint);//定義函數(shù)CPenpen(0,0,RGB(255,0,0));//定義一支新筆CPen*pOldPen=DCPoint->SelectObject(&pen);//繪圖設(shè)備選新筆,//同時(shí)保留舊筆DCPoint->SetROP2(R2_COPYPEN);//繪圖方法為直接畫(huà)DCPoint->MoveTo(group[0]); //抬筆到第一點(diǎn),第一點(diǎn)由鼠標(biāo)事先確定,//存放在group[0]DCPoint->LineTo(group[1]); //畫(huà)到第二點(diǎn),第二點(diǎn)由鼠標(biāo)事先確定,//存放在group[1]DCPoint->SelectObject(pOldPen); //恢復(fù)舊筆}mPointOrign=point;mPointOld=point;;//記錄第一點(diǎn)pDC.SetROP2(R2_NOT);//設(shè)置異或方式pDC.MoveTo(mPointOrign);pDC.LineTo(mPointOld);//擦舊線pDC.MoveTo(mPointOrign);pDC.LineTo(point);//畫(huà)新線
第二章圖形生成1、理論分析1,xi第六種直線是垂直線,要求x0=x1,y0<y1。繪制程序如下:for(y=y0;y<=y1;y++){setpixel(x0,y,RGB(255,0,0));}對(duì)于一條任意給定的直線段,首先要判斷是否為水平或垂直線;如果是按照水平、垂直線繪制方法繪出;如果不是,就要調(diào)整起始、終止端點(diǎn),判斷屬于1、2、3、4中的哪一類(lèi),然后根據(jù)類(lèi)別選擇相應(yīng)的繪制方法。DCPoint->SetROP2(R2_COPYPEN);//繪圖方法為直接畫(huà)//直線端點(diǎn)由鼠標(biāo)確定后存放在group[0]、group[1]垂直線if(y0==y1)//水平線
x=x0;x0=x1;x1=x;//交換起始、終止點(diǎn)x=y0;y0=y1;y1=x;根據(jù)該算法,對(duì)于圓心為(0,0),半徑為R的圓,繪圖的起點(diǎn)為(0,R),d0=3-2R,遞推公式為 xi+1=xi+1,當(dāng)di>0 時(shí),yi+1=yi–1,di+1=di+4(xi-yi)+10;當(dāng) di≤0時(shí),yi+1=yi,di+1=di+4xi+6;結(jié)束條件為 xi>y i。根據(jù)對(duì)稱(chēng)條件,找到一個(gè)圓上點(diǎn)(x,y),可以同時(shí)確定其他7個(gè)點(diǎn)(x,-y),(-x,y),(-x,-y),(y,x),(y,-x),(-y,x),(-y,-x)。對(duì)于圓心在任意點(diǎn)(x0,y0)的圓,可以使用上述方法,只是在繪點(diǎn)時(shí),將(x,y)等8個(gè)點(diǎn)繪制成(x+x0,y+y0)。實(shí)現(xiàn)程序如下:獲得文檔類(lèi)指針定義當(dāng)前繪圖設(shè)備第二次按鍵保留第二點(diǎn),用文檔類(lèi)畫(huà)線程序畫(huà)圖Bresenham圓if(PressNum==0){//第一次按鍵將第一點(diǎn)保留在mPointOrign
mPointOld=point;//記錄第一點(diǎn)elseif(PressNum==1){//第二次按鍵調(diào)用文檔類(lèi)畫(huà)圓程序畫(huà)圖
pDC.SelectStockObject(NULL_BRUSH);//畫(huà)空心圓DCPoint->SetROP2(R2_COPYPEN);//繪圖方法為直接畫(huà)根據(jù)該算法,對(duì)于圓心為(x0,y0),半徑為R的圓,繪圖的起點(diǎn)為(x0,y0+R),d0=0,遞推公式為:當(dāng)di<0時(shí),xi+1=xi+1,yi+1=yi,di+1=di+2(xi-x0)+1;當(dāng)di≥0時(shí),xi+1=xi,yi+1=yi-1,di+1=di-2(yi-y0)+1;結(jié)束條件為yi≤y0。根據(jù)對(duì)稱(chēng)條件,找到一個(gè)圓上點(diǎn)(x,y),可以同時(shí)確定其他3個(gè)點(diǎn)(x,2y0-y),(2x0-x,y),(2x0-x,2y0-y)。在繪點(diǎn)時(shí),每求處一個(gè)點(diǎn)(x,y),應(yīng)同時(shí)繪出其它3個(gè)點(diǎn)。實(shí)現(xiàn)程序如下:if(MenuID==3||MenuID==4){//Bresenham圓以及正負(fù)法圓pDoc->BCircle(&ht,mPointOrign,point);ReleaseCapture();}elseif(PressNum==1&&MenuID==4){//第二次按鍵調(diào)用畫(huà)圓程序畫(huà)圖PressNum=0;pDoc->ZCircle(&ht,mPointOrign,point);ReleaseCapture();}if((MenuID==3||MenuID==4)&&PressNum==1){DCPoint->SetROP2(R2_COPYPEN);//繪圖方法為直接畫(huà)CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類(lèi)指針pDoc->PointNum=0;//初始化CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類(lèi)指針CClientDCht(this); //定義當(dāng)前繪圖設(shè)備pDoc->Bezier(&ht,1);//繪制Bezier函數(shù)MenuID=6; //將下面的操作改為修改控制點(diǎn)位置PressNum=0;}CView::OnRButtonDown(nFlags,point);}if(MenuID==6&&PressNum==0){//在控制點(diǎn)數(shù)組中,逐個(gè)尋找 pDoc->Bezier(&pDC,1);//擦除十字標(biāo)志和舊線pDoc->group[SaveNumber]=point;//記錄新控制點(diǎn)
pDoc->Bezier(&pDC,1);//畫(huà)十字標(biāo)志和新曲線
CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類(lèi)指針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è)置一個(gè)數(shù)組存儲(chǔ)完整的Bezier曲線控制點(diǎn)p[i++]=group[j++];//先將第1,2號(hào)點(diǎn)存入數(shù)組p[i++]=group[j++];while(j<=PointNum-2)//存入奇、偶號(hào)點(diǎn),生成并存入插入點(diǎn)
for(j=0;j<i-3;j+=3)//控制點(diǎn)分組,分別生成各段曲線
if(mode)//mode=1時(shí),以異或方式畫(huà)可擦除的黑色曲線,用于調(diào)整形狀else//mode=0時(shí),畫(huà)紅色的正式曲線
dt=1.0/n;//參數(shù)t的間隔,分10段,即用10段直線表示一段曲線pDC->MoveTo(p1);//移到起點(diǎn)for(i=1;i<=n;i++)//用Bezier參數(shù)方程計(jì)算曲線上等間隔的10個(gè)點(diǎn)
SetPixel(),該函數(shù)原型如下:COLORREFSetPixel(intx,inty,COLORREFcrColor);COLORREFSetPixel(POINTpoint,COLORREFcrColor);不難看出,參數(shù)crColor即代表設(shè)置對(duì)應(yīng)坐標(biāo)的像素的顏色,因此,只需將先前程序中的crColor參數(shù)改為我們想要的顏色,就能改變生成的圖形的顏色。程序?qū)崿F(xiàn)//定義數(shù)組,classCcolorDialog:publicCCommonDialog。SetPixel()中的最后一個(gè)參數(shù)修改為成員變量CDC::TextOut,CDC::SetTextColor。BOOLTextOut(intx,inty,constCString&str);該函數(shù)用于在坐標(biāo)為(x,y)處顯示文字str。virtualCOLORREFSetTextColor(COLORREFcrColor);插入一個(gè)新的對(duì)話框模板資源,以攻輸入所需的字符串參數(shù)。使用Ctrl+R插入新對(duì)話框資源,如下圖:雙擊設(shè)計(jì)好的模板,為對(duì)話框資源添加一個(gè)類(lèi)。然后使用Ctrl+W打開(kāi)類(lèi)向?qū)В瑸槿齻€(gè)編輯框添加變量,如下圖所示:給對(duì)話框類(lèi)CDrawCharDlg添加兩個(gè)成員變量: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打開(kāi)類(lèi)向?qū)В瑸椤白煮w”按鈕添加消息響應(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中自帶的用于選擇字體的對(duì)話框。至此,已完成所有數(shù)據(jù)接收的部分,接下來(lái)要做的就是將字符按照接收到的信息顯示到屏幕上。首先在視圖類(lèi)的.cpp文件的開(kāi)頭添加如下代碼,將對(duì)話框的頭文件包含進(jìn)來(lái):#include"stdafx.h"#include".h"#include".h"#include"View.h"#include"DrawCharDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW……………然后為菜單項(xiàng)“字符”添加消息響應(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);//畫(huà)到屏幕上 pDC->SelectObject(pfntOld);//還原舊字體 } ReleaseDC(pDC);}至此,字符的顯示已全部完成。第三章圖形變換CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類(lèi)指針pDoc->GenerateGraph(&pDC);//調(diào)用文檔類(lèi)函數(shù)在屏幕上生成圖形group[0].x=100;group[0].y=100;//圖形數(shù)據(jù)準(zhǔn)備DrawGraph(pDC);//畫(huà)圖形}if(MenuID==11){//平移mPointOld=point;//記錄第一點(diǎn)//根據(jù)兩點(diǎn)間距計(jì)算平移量for(inti=0;i<pDoc->PointNum;i++)//根據(jù)平移量計(jì)算新圖形坐標(biāo){ht.MoveTo(mPointOrign);//擦除橡皮筋pDoc->DrawGraph(&ht);//生成新圖形轉(zhuǎn)化為字符串m_wndStatusBar.SetPaneText(2,p1,TRUE);//在第2個(gè)區(qū)域顯示x坐標(biāo)sprintf(p1,"%4d",yy);在第3個(gè)區(qū)域顯示y坐標(biāo)擦舊線畫(huà)新線CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類(lèi)指針if(MenuID==15){//對(duì)稱(chēng)變換mPointOld=point;//記錄第一點(diǎn)pDoc->Symmetry(mPointOrign,point);//進(jìn)行對(duì)稱(chēng)變換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ù)合矩陣對(duì)所有圖形點(diǎn)坐標(biāo)進(jìn)行變換
第四章圖形顯示if(MenuID==20){//種子填充:畫(huà)邊界 mPointOld1=point;//記錄第一點(diǎn)PressNum++;ht.MoveTo(mPointOrign);//擦除橡皮筋pDoc->group[0]=mPointOrign;//借助DDA直線函數(shù)畫(huà)邊界擦舊線畫(huà)新線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;//改變操作方式為種子點(diǎn)選取ReleaseCapture();if(MenuID==21){//確定種子點(diǎn),填充
pDoc->SeedFill(&ht,point);PressNum=0;MenuID=20;//設(shè)置決定頂點(diǎn)操作方式}CView::OnLButtonDown(nFlags,point);}intsavex,xleft,xright,pflag,x,y,num;CPointstack_ptr[200];/堆棧pDC->SetROP2(R2_COPYPEN);//繪圖方法為直接畫(huà)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){邊界后的第一個(gè)未填充區(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){//邊緣填充選頂點(diǎn)if(MenuID==22){//邊緣填充選點(diǎn)結(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)為下端點(diǎn){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;//確定邊緣點(diǎn)pDC->MoveTo((int)x,y);//從邊緣點(diǎn)一直畫(huà)到邊界盒右端pDC->LineTo(xr,y);} }}pDC->SelectObject(pOldPen);}1、理論分析掃描線填充算法運(yùn)用了復(fù)雜的數(shù)據(jù)結(jié)構(gòu),且在填充過(guò)程中需要反復(fù)排序,編程難度較大。VC類(lèi)庫(kù)中的函數(shù)CDC::Polygon()實(shí)現(xiàn)了掃描線填充算法功能。實(shí)際上我們所學(xué)的計(jì)算機(jī)圖形學(xué)所有算法都能通過(guò)引用VC類(lèi)庫(kù)提供的函數(shù)(或函數(shù)組合)加以實(shí)現(xiàn)。本節(jié)通過(guò)引用函數(shù)CDC::Polygon(),來(lái)說(shuō)明如何應(yīng)用VC類(lèi)函數(shù)。函數(shù)CDC::Polygon(LPPOINTlpPoints,intnCount)有兩個(gè)參數(shù),lpPoints是一個(gè)數(shù)組,用來(lái)存儲(chǔ)多邊形的頂點(diǎn),nCount是一個(gè)表示頂點(diǎn)數(shù)量的整形數(shù)。按照要求準(zhǔn)備好這兩個(gè)參數(shù),就可以調(diào)用函數(shù)了。2、操作說(shuō)明操作與邊緣填充完全一樣。在選取菜單項(xiàng)后,用鼠標(biāo)左鍵依次選取多邊形頂點(diǎn);在前一個(gè)頂點(diǎn)確定、鼠標(biāo)移動(dòng)時(shí),用一根橡皮筋表示前一頂點(diǎn)與當(dāng)前點(diǎn)之間的連線,以方便當(dāng)前邊的確定;最后用右鍵結(jié)束選點(diǎn),程序?qū)⒆詈笠粋€(gè)頂點(diǎn)與第一個(gè)頂點(diǎn)用線連接起來(lái),以表示還有這樣一條邊,確保多邊形封閉。3、編程實(shí)現(xiàn)1)菜單響應(yīng)函數(shù)建立.打開(kāi)工程項(xiàng)目,依次點(diǎn)擊菜單“查看”、“建立類(lèi)向?qū)А?,出現(xiàn)窗口。在ClassName:欄中選CMy200032590100View;在ObjectIds:欄中選ID_FILL_SCANLINE;在Messages:欄中選COMMAND;點(diǎn)擊AddFunction按鍵,出現(xiàn)函數(shù)命名窗口,點(diǎn)擊該窗口中的OK按鍵,該函數(shù)在200032590100View.cpp中生成。點(diǎn)擊該窗口中的EditCode按鍵查看、編輯該函數(shù)。加入語(yǔ)句如下:CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類(lèi)指針pDoc->PointNum=0;//實(shí)際上不需要該變量,但為了借鑒邊緣填充的部分功//能,與邊緣填充保持一致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è)置多邊形邊界顏色(即畫(huà)筆)CPen*pOldPen=ht.SelectObject(&pen);CBrushbrush(RGB(0,255,0));//設(shè)置多邊形填充顏色(即畫(huà)刷)CBrush*pOldBrush=ht.SelectObject(&brush);ht.SetROP2(R2_COPYPEN); //設(shè)置直接畫(huà)方式ht.Polygon(pDoc->group,PressNum);//調(diào)用多邊形掃描線填充函數(shù)ht.SelectObject(pOldPen);//恢復(fù)系統(tǒng)的畫(huà)筆、畫(huà)刷顏色設(shè)置ht.SelectObject(pOldBrush);PressNum=0;pDoc->PointNum=0;//初始化參數(shù),為下一次操作做準(zhǔn)備ReleaseCapture();}第五章二維裁剪CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類(lèi)指針#defineXMIN100//定義的窗口參數(shù)符號(hào),符號(hào)只要在被使用前定義即可#defineLEFT1//定義的幾個(gè)常數(shù)符號(hào)code1=encode(x1,y1);//對(duì)端點(diǎn)編碼code2=encode(x2,y2);if((code1&code2)!=0)return;//完全不可見(jiàn)if((LEFT&code)!=0)//求線段與窗口左邊的交點(diǎn)elseif((RIGHT&code)!=0)//求線段與窗口右邊的交點(diǎn)elseif((BOTTOM&code)!=0)//求線段與窗口底邊的交點(diǎn)elseif((TOP&code)!=0)//求線段與窗口頂邊的交點(diǎn)CMy200032590100Doc*pDoc=GetDocument();//獲得文檔類(lèi)指針邊緣填充選頂點(diǎn)if(MenuID==25){//多邊形裁剪pDoc->group[PressNum]=pDoc->group[0];//將第一個(gè)頂點(diǎn)作為最后一個(gè)頂點(diǎn)//記錄頂點(diǎn)數(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)//里里,輸出后點(diǎn)
if(group[n].x>=XMIN&&group[n+1].x<XMIN)//里外,輸出交點(diǎn)
if(group[n].x<XMIN&&group[n+1].x>=XMIN)//外里,輸出交點(diǎn)、后點(diǎn)y=YMAXif(group[n].y>=YMAX&&group[n+1].y>=YMAX)//外外,不輸出if(group[n].y<YMAX&&group[n+1].y<YMAX)//里里,輸出后點(diǎn)if(group[n].y<YMAX&&group[n+1].y>=YMAX)//里外,輸出交點(diǎn)if(group[n].y>=YMAX&&group[n+1].y<YMAX)//外里,輸出交點(diǎn)、后點(diǎn)x=XMAXif(group[n].x>=XMAX&&group[n+1].x>=XMAX)//外外,不輸出
if(group[n].x<XMAX&&group[n+1].x<XMAX)//里里,輸出后點(diǎn)
if(group[n].x<XMAX&&group[n+1].x>=XMAX)//里外,輸出交點(diǎn)
if(group[n].x>=XMAX&&group[n+1].x<XMAX)//外里,輸出交點(diǎn)、后點(diǎn)
y=YMIN
if(group[n].y<YMIN&&group[n+1].y<YMIN)//外外,不輸出
if(group[n].y>=YMIN&&group[n+1].y>=YMIN)//里里,輸出后點(diǎn)
if(group[n].y>=YMIN&&group[n+1].y<YMIN)//里外,輸出交點(diǎn)
if(group[n].y<YMIN&&group[n+1].y>=YMIN)//外里,輸出交點(diǎn)、后點(diǎn)
圓裁剪與直線裁剪和多邊形裁剪都不一樣,直線裁剪完還是直線,多邊形裁剪完還是多邊形,而圓裁剪完便有可能不再是圓,所以我們需要修改圓的生成算法,讓其能夠自主判斷是否在矩形框內(nèi),若是,則繪出該點(diǎn)像素,若不是,則不繪。在選擇裁剪菜單后,立即生成指定窗口。用鼠標(biāo)左鍵依次確定圓的圓心和圓上一點(diǎn)。然后立即調(diào)用文檔類(lèi)裁剪函數(shù)對(duì)圓進(jìn)行裁剪,并用紅色標(biāo)記裁剪結(jié)果。在畫(huà)圓的過(guò)程中,依然使用橡皮筋顯示圓的位置。編程實(shí)現(xiàn)修改然后在voidCMy::BCircle(*DCPoint,CRect*rc){ intr,d,x,y,x0,y0; DCPoint->SetROP2(R2_COPYPEN);//繪圖方法為直接畫(huà) 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))) //判斷點(diǎn)是否在矩形框內(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度大數(shù)據(jù)處理技術(shù)外包勞務(wù)合同3篇
- 二零二五年度公司與會(huì)計(jì)簽訂的企業(yè)財(cái)務(wù)預(yù)算編制合同3篇
- 二零二五年度地質(zhì)災(zāi)害鉆孔監(jiān)測(cè)承包合同3篇
- 2025年度戶(hù)外活動(dòng)搭車(chē)安全免責(zé)及活動(dòng)組織者責(zé)任合同3篇
- 2025年度招聘服務(wù)與員工背景調(diào)查合同3篇
- 2025年度房屋拆除工程拆除物運(yùn)輸及處理合同3篇
- 2025年度自然災(zāi)害受損建筑物拆除與重建援助合同3篇
- 公墓墓位買(mǎi)賣(mài)與墓園墓碑雕刻服務(wù)協(xié)議3篇
- 二零二五年度家庭式兼職煮飯衛(wèi)生協(xié)議2篇
- 2024純電動(dòng)物流專(zhuān)用車(chē)租賃合同
- 【小米公司財(cái)務(wù)共享服務(wù)中心的構(gòu)建與運(yùn)行探究8200字(論文)】
- 成人癌性疼痛護(hù)理-中華護(hù)理學(xué)會(huì)團(tuán)體標(biāo)準(zhǔn)2019
- 勞動(dòng)保障監(jiān)察條例
- 2023年建筑繼續(xù)教育考試:安全員繼續(xù)教育真題模擬匯編(共830題)
- 冷卻塔驗(yàn)收表
- 外科科主任工作計(jì)劃
- 施工圖設(shè)計(jì)提資管控細(xì)則
- 人教部編版八年級(jí)語(yǔ)文上冊(cè)名著導(dǎo)讀《紅星照耀中國(guó)》復(fù)習(xí)素材
- 【個(gè)人簡(jiǎn)歷】大學(xué)生職業(yè)生涯規(guī)劃書(shū)10篇
- 患者滿意度調(diào)查分析
- 印刷公司績(jī)效考核KPI指標(biāo)庫(kù)
評(píng)論
0/150
提交評(píng)論