版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課 程 設(shè) 計(jì) 報(bào) 告</p><p> 課程名稱 計(jì)算機(jī)圖形學(xué) </p><p> 課題名稱 多邊形裁剪與填充 </p><p> 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 班 級(jí)
2、 </p><p> 學(xué) 號(hào) </p><p> 姓 名 </p><p> 指導(dǎo)教師 </p><p> 年 月 日</p><
3、p> 一、設(shè)計(jì)內(nèi)容與設(shè)計(jì)要求</p><p><b> 1.設(shè)計(jì)內(nèi)容:</b></p><p> 交互式地實(shí)現(xiàn)多邊形的裁剪和填充。。</p><p><b> 2.設(shè)計(jì)要求:</b></p><p><b> 1)窗口功能設(shè)計(jì)。</b></p>&
4、lt;p> 2)實(shí)現(xiàn)鼠標(biāo)畫多邊形與數(shù)據(jù)存儲(chǔ)功能。</p><p> 3)實(shí)現(xiàn)鼠標(biāo)剪裁窗口選擇功能。</p><p> 4)實(shí)現(xiàn)多邊形裁剪和填充功能。</p><p><b> 3.算法提示:</b></p><p> 多邊形裁剪算法分析:</p><p> 基本思想是一次用窗口的
5、一條邊裁剪多邊形,窗口的一條邊以及延長(zhǎng)線構(gòu)成裁剪線,該線把平面分成兩個(gè)部分:可見一側(cè),不可見一側(cè)。用一條裁剪邊對(duì)多邊形進(jìn)行裁剪,得到一個(gè)頂點(diǎn)序列,作為下一條裁剪邊處理過程的輸入點(diǎn)。</p><p> 對(duì)于每一條裁剪邊,只是判斷點(diǎn)在窗口的哪一測(cè)以及求線段與裁剪邊的交點(diǎn)算法應(yīng)隨之改變。</p><p> 多邊形填充算法分析:</p><p> 確定多邊形所占有的最
6、大掃描線數(shù),得到多邊形頂點(diǎn)的最小和最大y值(ymin和ymax),從y=ymin 到 y=ymax, 每次用一條掃描進(jìn)行填充。對(duì)一條掃描線填充的過程可分為四個(gè)步驟: a.求交b.排序c.交點(diǎn)配對(duì)d.區(qū)間填色。</p><p><b> 二、進(jìn)度安排</b></p><p> 第 3 周 星期一 8:00——12:00</p><p&g
7、t; 星期二 8:00——12:00 </p><p> 星期三 8:00——12:00</p><p> 星期四 8:00——12:00 </p><p> 星期五 8:00——12:00</p><p> 第 4 周 星期一 8:00——12:00</p><p><
8、;b> 附:</b></p><p> 課程設(shè)計(jì)報(bào)告裝訂順序:封面、任務(wù)書、目錄、正文、附件(A4大小的圖紙及程序清單)、評(píng)分。 </p><p> 正文的格式:一級(jí)標(biāo)題用3號(hào)黑體,二級(jí)標(biāo)題用四號(hào)宋體加粗,正文用小四號(hào)宋體;行距為22。</p><p> 正文的內(nèi)容:一、課題的主要功能;二、課題的功能模塊的劃分(要求畫出模塊圖);三、主要
9、功能的實(shí)現(xiàn)(至少要有一個(gè)主要模塊的流程圖);四、程序調(diào)試;五、總結(jié);六、附件(所有程序的原代碼,要求對(duì)程序?qū)懗霰匾淖⑨專?lt;/p><p> 正文總字?jǐn)?shù)要求在5000字以上(不含程序原代碼)。</p><p><b> 一、題目?jī)?nèi)容說明:</b></p><p> 1、交互式地實(shí)現(xiàn)多邊形的裁剪和填充。</p><p&
10、gt;<b> 2、功能要求:</b></p><p><b> 窗口功能設(shè)計(jì)。</b></p><p> 2)實(shí)現(xiàn)鼠標(biāo)畫多邊形與數(shù)據(jù)存儲(chǔ)功能。</p><p> 4)實(shí)現(xiàn)鼠標(biāo)剪裁窗口選擇功能。</p><p> 實(shí)現(xiàn)多邊形裁剪和填充功能。</p><p><
11、b> 二、總體設(shè)計(jì):</b></p><p> 本程序使用MFC實(shí)現(xiàn)多邊形的裁剪和填充繪圖程序。</p><p> 多邊形裁剪算法分析:</p><p> 基本思想是一次用窗口的一條邊裁剪多邊形,窗口的一條邊以及延長(zhǎng)線構(gòu)成裁剪線,改線把平面分成兩個(gè)部分:可見一側(cè),不可見一側(cè)。用一條裁剪邊多多邊形進(jìn)行裁剪,得到一個(gè)頂點(diǎn)序列,作為嚇一條裁剪邊處
12、理過程的輸入點(diǎn)。</p><p> 對(duì)于每一條裁剪邊,只是判斷點(diǎn)在窗口的哪一測(cè)以及求線段與裁剪邊的交點(diǎn)算法應(yīng)隨之改變。</p><p> 僅用一條裁剪邊時(shí),逐次多邊形裁剪框圖:</p><p> 在CGraphics類的CutRectangular(CRect)函數(shù)中實(shí)現(xiàn)對(duì)多邊形的裁剪</p><p> 多邊形填充算法分析:</
13、p><p> 確定多邊形所占有的最大掃描線數(shù),得到多邊形頂點(diǎn)的最小和最大y值(ymin和ymax),從y=ymin 到 y=ymax, 每次用一條掃描進(jìn)行填充。對(duì)一條掃描線填充的過程可分為四個(gè)步驟: a.求交b.排序c.交點(diǎn)配對(duì)d.區(qū)間填色。在CGraphics類中的FillPlogon函數(shù)中實(shí)現(xiàn)多邊形的填充算法。</p><p><b> 三、模塊設(shè)計(jì):</b>&l
14、t;/p><p> 各個(gè)程序函數(shù)的功能,參數(shù),變量的說明:</p><p> MFC應(yīng)用程序框架中類的詳細(xì)解析:</p><p> 1.MainFrm:創(chuàng)建窗口及窗口里的菜單、工具欄、狀態(tài)欄等實(shí)現(xiàn)交互的按鈕。</p><p> 1)函數(shù)int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStru
15、ct){}創(chuàng)建菜單、工具欄、狀欄。</p><p> 2)BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)設(shè)置窗口的大小和初始位置。</p><p> 2.圖像裁剪View:視圖,負(fù)責(zé)內(nèi)存數(shù)據(jù)與用戶的交互,包括數(shù)據(jù)的顯示、菜單的選取,鼠標(biāo)的響應(yīng)。</p><p> void CMyView::OnLB
16、uttonDown(UINT nFlags, CPoint point){}對(duì)鼠標(biāo)按下左鍵的響應(yīng),如果是自定義裁剪的區(qū)域操作就捕獲鼠標(biāo)按下的點(diǎn),畫裁剪區(qū)域,如果是自定義點(diǎn)坐標(biāo)的操作就捕獲鼠標(biāo)的點(diǎn)畫多邊形。</p><p> void CMyView::OnMouseMove(UINT nFlags, CPoint point){}對(duì) 鼠標(biāo) 移動(dòng)的響應(yīng)。用捕獲的點(diǎn)畫出相應(yīng)的矩
17、形裁剪邊框。畫邊框的時(shí)候,先用白色擦出原先的矩形邊框,再用虛線畫出新的舉行邊框</p><p> void CMyView::OnRButtonUp(UINT nFlags, CPoint point){}對(duì)鼠標(biāo)放開左鍵的相應(yīng)。如果是自定義點(diǎn)的坐標(biāo),就獲取新的初始裁減矩形范圍。</p><p> void CMyView::OnLButtonUp(UINT nFlags, CPoint
18、 point){}對(duì)鼠標(biāo)放開左鍵的響應(yīng)</p><p> void CMyView::OnInitialUpdate(){}初始化裁剪區(qū)域和在窗口中畫一個(gè)矩形和一個(gè)五角星。</p><p> void CMyView::OnDraw(CDC* pDC){}重畫窗口,用voidCMyView::OnInitialUpdate{}來啟動(dòng)它,通過消息映射表處理菜單、工具條、快捷鍵和其他用戶消
19、息。定義裁剪矩形區(qū)域,并賦值。當(dāng)自定義多邊形坐標(biāo)時(shí),在各個(gè)點(diǎn)坐標(biāo)處畫一個(gè)小圓,以顯示點(diǎn)的位置。畫出多邊形。</p><p> 3.圖像裁剪DOC:文檔,負(fù)責(zé)內(nèi)存數(shù)據(jù)與磁盤的交互。</p><p> void CMyDoc::OnFillployon(){}</p><p> void CMyDoc::OnUpdateFillployon(CCmdUI* pCm
20、dUI){}</p><p> void CMyDoc::OnCutRect(){}</p><p> void CMyDoc::OnUpdateCutRect(CCmdUI* pCmdUI){}</p><p> 4.CGraphics:實(shí)現(xiàn)多邊形的填充和裁剪。</p><p> 構(gòu)造函數(shù)CGraphics():PointCount
21、(10),Point(NULL){}初始化五角星的頂點(diǎn)坐標(biāo)。</p><p> 析構(gòu)函數(shù)~CGraphics(){}刪除動(dòng)態(tài)生成的Point指針。</p><p> bool DrawPloyon(CDC*);在指定設(shè)備中畫多邊形。</p><p> bool FillPloyon(CDC*);填充多邊形。</p><p> bool
22、 InterCross(CPoint,CPoint,CPoint,CPoint,CPoint&);判斷兩條線段是否相交。</p><p> bool CutRect(CRect);對(duì)多邊形進(jìn)行裁剪。</p><p> bool IsInSquareRgn(CRect,CPoint,int);對(duì)多邊形裁剪時(shí),判斷線段斷點(diǎn)是否在可視一側(cè)。</p><p>
23、 bool SortArray(int*,int);冒泡排序。</p><p><b> 四、詳細(xì)設(shè)計(jì):</b></p><p> 1、創(chuàng)建窗口、菜單、工具欄、狀欄的函數(shù)。</p><p> int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)</p><p&g
24、t;<b> {</b></p><p> if (CFrameWnd::OnCreate(lpCreateStruct) == -1)</p><p> return -1;</p><p> if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE |
25、CBRS_TOP</p><p> | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||</p><p> !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))</p><p><b> {</b></p><
26、;p> TRACE0("Failed to create toolbar\n");</p><p> return -1; // fail to create</p><p><b> }</b></p><p> if (!m_wndStatusBar.Create(this) ||</p&g
27、t;<p> !m_wndStatusBar.SetIndicators(indicators,</p><p> sizeof(indicators)/sizeof(UINT)))</p><p><b> {</b></p><p> TRACE0("Failed to create status bar\n
28、");</p><p> return -1; // fail to create</p><p><b> }</b></p><p> // TODO: Delete these three lines if you don't want the toolbar to</p><p>
29、; // be dockable</p><p> m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);</p><p> EnableDocking(CBRS_ALIGN_ANY);</p><p> DockControlBar(&m_wndToolBar);</p><p> ret
30、urn 0; </p><p><b> }</b></p><p> 2、鼠標(biāo)按下左鍵的響應(yīng)函數(shù)</p><p> void CMyView::OnLButtonDown(UINT nFlags, CPoint point) </p><p><b> {</b></p>&
31、lt;p> //對(duì)鼠標(biāo)按下左鍵的相應(yīng)</p><p> CScrollView::OnLButtonDown(nFlags, point);</p><p> if(m_bDefineRect)</p><p><b> {</b></p><p> //如果是自定義裁減的區(qū)域的操作</p>
32、<p> SetCapture();//捕獲鼠標(biāo)</p><p> m_bCaptured = TRUE;</p><p> CDC *dc=GetDC();</p><p> CRect rect(TopLeft,BottomRight);</p><p> dc->SelectStockObject(WHIT
33、E_PEN);</p><p> dc->Rectangle(rect);</p><p> InvalidateRect(rect,false);</p><p> TopLeft = point;</p><p> ::SetCursor(::LoadCursor(NULL, IDC_CROSS));//設(shè)置鼠標(biāo)樣子為十字形
34、的</p><p><b> }</b></p><p> if(m_bDefinePointV)</p><p><b> {</b></p><p> //如果是自定義點(diǎn)坐標(biāo)的操作</p><p> PointArray.Add(point);</p>
35、;<p> CRect ellipseRect;</p><p> ellipseRect.top = point.y - 5;</p><p> ellipseRect.bottom = point.y + 5;</p><p> ellipseRect.left = point.x - 5;</p><p> el
36、lipseRect.right = point.x + 5;</p><p> InvalidateRect(ellipseRect,true);</p><p><b> }</b></p><p><b> }</b></p><p> 3、鼠標(biāo)移動(dòng)時(shí)的響應(yīng)函數(shù)</p>
37、<p> void CMyView::OnMouseMove(UINT nFlags, CPoint point) </p><p><b> {</b></p><p> CScrollView::OnMouseMove(nFlags, point);</p><p> //對(duì)鼠標(biāo)移動(dòng)時(shí)的相應(yīng)</p><
38、p> if (m_bCaptured) </p><p><b> {</b></p><p> //畫出相應(yīng)的矩形裁減邊框</p><p> CDC *dc=GetDC();</p><p> CRect rect(TopLeft,BottomRight);</p><p>
39、dc->SelectStockObject(WHITE_PEN);</p><p> dc->Rectangle(rect);//用白色擦除原先的矩形邊框</p><p> InvalidateRect(rect,false);</p><p> BottomRight=point;</p><p> CRect newr
40、ect(TopLeft,BottomRight);</p><p><b> CPen pen;</b></p><p> pen.CreatePen(PS_DOT,1,RGB(0,0,0));</p><p> dc->SelectObject(pen);</p><p> dc->Rectangl
41、e(newrect);//用虛線畫出新的矩形邊框</p><p><b> }</b></p><p><b> }</b></p><p> void CMyView::OnLButtonUp(UINT nFlags, CPoint point) </p><p><b> {&
42、lt;/b></p><p> CScrollView::OnLButtonUp(nFlags, point);</p><p> //對(duì)鼠標(biāo)放開左鍵的響應(yīng)</p><p> if (m_bCaptured) </p><p><b> {</b></p><p> ::Relea
43、seCapture();</p><p> m_bCaptured = false;</p><p> m_bDefineRect = false;</p><p><b> }</b></p><p><b> }</b></p><p> void CMyVie
44、w::OnViewDefineRect() </p><p><b> {</b></p><p> //設(shè)置是否自定義裁減區(qū)域</p><p> m_bDefineRect = true;</p><p><b> }</b></p><p> void CMyV
45、iew::OnEditDefinePoint() </p><p><b> {</b></p><p> //設(shè)置是否自定義點(diǎn)的坐標(biāo)</p><p> m_bDefinePointV = true;</p><p><b> }</b></p><p> 4、放
46、開鼠標(biāo)右鍵的響應(yīng)</p><p> void CMyView::OnRButtonUp(UINT nFlags, CPoint point) </p><p><b> {</b></p><p> ////對(duì)鼠標(biāo)放開右鍵的相應(yīng)</p><p> CScrollView::OnRButtonUp(nFlags,
47、point);</p><p> if(m_bDefinePointV)</p><p><b> {</b></p><p> CMyDoc* pDoc = GetDocument();</p><p> ASSERT_VALID(pDoc);</p><p> pDoc->m_
48、grahics.PointCount=PointArray.GetSize();</p><p> if(pDoc->m_grahics.Point)</p><p> delete pDoc->m_grahics.Point;</p><p> pDoc->m_grahics.Point = new CPoint[pDoc->m_gr
49、ahics.PointCount];</p><p> for(int i=0;i<pDoc->m_grahics.PointCount;i++)</p><p> pDoc->m_grahics.Point[i]=PointArray.GetAt(i);//對(duì)Point點(diǎn)坐標(biāo)重新賦值</p><p> PointArray.RemoveAl
50、l();</p><p> m_bDefinePointV=false;</p><p> CRect rect;</p><p> this->GetClientRect(rect);</p><p> InvalidateRect(rect);</p><p> //獲取新的初始裁減矩形范圍<
51、/p><p> int minX = pDoc->m_grahics.Point[0].x , minY = pDoc->m_grahics.Point[0].y;</p><p> int maxX = pDoc->m_grahics.Point[0].x , maxY = pDoc->m_grahics.Point[0].y;</p><p&
52、gt; for(i=1;i<pDoc->m_grahics.PointCount;i++)</p><p><b> {</b></p><p> if(minX > pDoc->m_grahics.Point[i].x)</p><p> minX = pDoc->m_grahics.Point[i].x
53、;</p><p> if(minY > pDoc->m_grahics.Point[i].y)</p><p> minY = pDoc->m_grahics.Point[i].y;</p><p> if(maxX < pDoc->m_grahics.Point[i].x)</p><p> maxX
54、 = pDoc->m_grahics.Point[i].x;</p><p> if(maxY < pDoc->m_grahics.Point[i].y)</p><p> maxY = pDoc->m_grahics.Point[i].y;</p><p><b> }</b></p><p&
55、gt; TopLeft = CPoint(minX,minY);</p><p> BottomRight = CPoint(maxX,maxY);</p><p><b> }</b></p><p><b> }</b></p><p><b> 5、初始化函數(shù)</b&
56、gt;</p><p> void CMyView::OnInitialUpdate()</p><p><b> {</b></p><p> CScrollView::OnInitialUpdate();</p><p> CSize sizeTotal;</p><p> size
57、Total.cx = sizeTotal.cy = 100;</p><p> SetScrollSizes(MM_TEXT, sizeTotal);</p><p> CMyDoc* pDoc = GetDocument();</p><p> ASSERT_VALID(pDoc);</p><p> //設(shè)置初始的裁減區(qū)域<
58、/p><p> int minX = pDoc->m_grahics.Point[0].x , minY = pDoc->m_grahics.Point[0].y;</p><p> int maxX = pDoc->m_grahics.Point[0].x , maxY = pDoc->m_grahics.Point[0].y;</p><p&
59、gt; for(int i=1;i<pDoc->m_grahics.PointCount;i++)</p><p><b> {</b></p><p> if(minX > pDoc->m_grahics.Point[i].x)</p><p> minX = pDoc->m_grahics.Point[
60、i].x;</p><p> if(minY > pDoc->m_grahics.Point[i].y)</p><p> minY = pDoc->m_grahics.Point[i].y;</p><p> if(maxX < pDoc->m_grahics.Point[i].x)</p><p>
61、maxX = pDoc->m_grahics.Point[i].x;</p><p> if(maxY < pDoc->m_grahics.Point[i].y)</p><p> maxY = pDoc->m_grahics.Point[i].y;</p><p><b> }</b></p>&l
62、t;p> TopLeft = CPoint(minX,minY);</p><p> BottomRight = CPoint(maxX,maxY);</p><p><b> }</b></p><p> 6、重畫窗口的函數(shù),是MFC自動(dòng)生成的,我們可以在里面添加自己的代碼,用來實(shí)現(xiàn)消息映射表處理菜單、工具條、快捷鍵和其他用戶消
63、息。</p><p> void CMyView::OnDraw(CDC* pDC)</p><p><b> {</b></p><p> CMyDoc* pDoc = GetDocument();</p><p> ASSERT_VALID(pDoc);</p><p> // TO
64、DO: add draw code for native data here</p><p> int left,top,right,buttom;</p><p> left=min(TopLeft.x,BottomRight.x);</p><p> right=max(TopLeft.x,BottomRight.x);</p><p&
65、gt; top=min(TopLeft.y,BottomRight.y);</p><p> buttom=max(TopLeft.y,BottomRight.y);</p><p> CRect rect(left,top,right,buttom);</p><p> //定義裁減矩形區(qū)域,并賦值</p><p> CPen p
66、enDot,penSolid;</p><p> penDot.CreatePen(PS_DOT,1,RGB(0,0,0));</p><p> pDC->SelectObject(penDot);</p><p> pDC->Rectangle(rect);</p><p> //用虛線畫出裁減矩形區(qū)域</p>
67、;<p> penSolid.CreatePen(PS_SOLID,1,RGB(0,0,0));</p><p> pDC->SelectObject(penSolid);</p><p> if(PointArray.GetSize())</p><p><b> {</b></p><p>
68、; //當(dāng)自定義多邊形點(diǎn)坐標(biāo)時(shí),在各個(gè)點(diǎn)坐標(biāo)處畫一個(gè)小圓,以顯示點(diǎn)的位置</p><p><b> int i;</b></p><p> for(i=0;i<PointArray.GetSize();i++)</p><p><b> {</b></p><p> pDC->
69、MoveTo(PointArray.GetAt(i));</p><p> CRect ellipseRect;</p><p> ellipseRect.top = PointArray.GetAt(i).y - 5;</p><p> ellipseRect.bottom = PointArray.GetAt(i).y + 5;</p>&l
70、t;p> ellipseRect.left = PointArray.GetAt(i).x - 5;</p><p> ellipseRect.right = PointArray.GetAt(i).x + 5;</p><p> pDC->Ellipse(ellipseRect);</p><p><b> }</b>&l
71、t;/p><p><b> }</b></p><p> if(pDoc->bCutRect) </p><p><b> {</b></p><p> //判斷是否裁減,若是,則根據(jù)裁減區(qū)域進(jìn)行裁減</p><p> pDoc->m_grahics.Cut
72、Rect(rect);</p><p> pDoc->bCutRect=false;</p><p><b> }</b></p><p> pDoc->m_grahics.DrawPloyon(pDC);</p><p><b> //畫出多邊形</b></p>
73、<p> if(pDoc->bFillPloyon)</p><p><b> {</b></p><p> //判斷是否填充,根據(jù)需要進(jìn)行相應(yīng)的操作</p><p> pDoc->m_grahics.FillPloyon(pDC);</p><p> pDoc->bFillPloy
74、on=false;</p><p><b> }</b></p><p><b> }</b></p><p> 7、在指定的pDC設(shè)備中,畫多邊形</p><p> bool CGraphics::DrawPloyon(CDC* pDC)</p><p><b
75、> {</b></p><p> if(PointCount < 3)</p><p> return false;</p><p> //若多邊形小于三個(gè)點(diǎn)則返回</p><p> pDC->MoveTo(Point[0]);</p><p> for(int i=1;i&l
76、t;PointCount;i++)</p><p><b> {</b></p><p> pDC->LineTo(Point[i]);</p><p><b> }</b></p><p> pDC->LineTo(Point[0]);</p><p>
77、; //在pDC中畫出多邊形</p><p> return true;</p><p><b> }</b></p><p> 8、填充多邊形函數(shù),重量級(jí)的函數(shù)</p><p> //在指定的pDC設(shè)備中,填充多邊形</p><p> bool CGraphics::FillPloy
78、on(CDC* pDC)</p><p><b> {</b></p><p> if(PointCount < 3)</p><p> return false;</p><p> //若多邊形小于三個(gè)點(diǎn)則返回</p><p> int minX = Point[0].x , m
79、inY = Point[0].y;</p><p> int maxX = Point[0].x , maxY = Point[0].y;</p><p> for(int i=1;i<PointCount;i++)</p><p><b> {</b></p><p> if(minX > Poin
80、t[i].x)</p><p> minX = Point[i].x;</p><p> if(minY > Point[i].y)</p><p> minY = Point[i].y;</p><p> if(maxX < Point[i].x)</p><p> maxX = Point[i
81、].x;</p><p> if(maxY < Point[i].y)</p><p> maxY = Point[i].y;</p><p><b> }</b></p><p> //獲取多邊形中所有坐標(biāo)點(diǎn)的最大值和最小值,作為掃描線循環(huán)的范圍</p><p> CUIntAr
82、ray myArray;</p><p><b> int x,y;</b></p><p> for(y=minY;y<maxY;y++)</p><p><b> {</b></p><p> //掃描線從minY開始到maxY</p><p> for(
83、i=0;i<PointCount;i++)</p><p><b> {</b></p><p> //對(duì)每條邊進(jìn)行循環(huán)</p><p> CPoint PointCross;</p><p> int beforeI=BeforeIndex(i),afterI=AfterIndex(i);</p&g
84、t;<p> //判斷是否跟線段相交</p><p> if(InterCross(Point[beforeI],Point[i],CPoint(minX,y),CPoint(maxX,y),PointCross))</p><p><b> {</b></p><p> //若是存在交點(diǎn),則進(jìn)行相應(yīng)的判斷,即判斷x的坐標(biāo)
85、取兩次、一次還是不取</p><p> if(PointCross==Point[i])</p><p><b> {</b></p><p> if((Point[beforeI].y > PointCross.y) && (Point[afterI].y > PointCross.y))</p>
86、<p><b> {</b></p><p> myArray.Add(PointCross.x);</p><p> myArray.Add(PointCross.x);</p><p> //邊頂點(diǎn)的y值大于交點(diǎn)的y值,x坐標(biāo)取兩次</p><p><b> }</b>&
87、lt;/p><p><b> else</b></p><p> if((Point[beforeI].y - PointCross.y) * (Point[afterI].y - PointCross.y) < 0)</p><p> myArray.Add(PointCross.x);//邊頂點(diǎn)的y值在交點(diǎn)的y值之間,即一個(gè)頂點(diǎn)
88、的y值大于交點(diǎn)的y值,而另一個(gè)小于,相應(yīng)的x坐標(biāo)取一次</p><p><b> else</b></p><p> if(PointCross.y==Point[afterI].y)</p><p> myArray.Add(PointCross.x); </p><p><b> }<
89、;/b></p><p><b> else </b></p><p> if(PointCross==Point[beforeI])</p><p><b> {</b></p><p><b> continue;</b></p><p&g
90、t;<b> }</b></p><p><b> else</b></p><p> myArray.Add(PointCross.x);//當(dāng)交點(diǎn)不在線段的頂點(diǎn)時(shí),x坐標(biāo)只取一次</p><p><b> }</b></p><p><b> }<
91、;/b></p><p> int *scanLineX,num=myArray.GetSize();</p><p> scanLineX = new int[num];</p><p> for(i=0;i<num;i++)</p><p> scanLineX[i]=myArray.GetAt(i);//獲取掃描線x
92、值,以構(gòu)成填充區(qū)間</p><p> myArray.RemoveAll();</p><p> SortArray(scanLineX,num);//對(duì)scanLine(掃描線x坐標(biāo)進(jìn)行排序)</p><p> for(i=0;i<num;i=i+2)</p><p><b> {</b></p&g
93、t;<p> if(i+1>=num)</p><p><b> break;</b></p><p> for(x=scanLineX[i];x<scanLineX[i+1];x++)//x值配對(duì)填充</p><p> pDC->SetPixelV(CPoint(x,y),RGB(255,0,0));/
94、/將填充區(qū)間相應(yīng)點(diǎn)的顏色設(shè)置成紅色</p><p><b> }</b></p><p> Sleep(1);//CPU暫停1ms,以體現(xiàn)出多邊形是以掃描線的方式,一條一條的填充的</p><p> delete scanLineX;</p><p><b> }</b></p>
95、<p> return true;</p><p><b> }</b></p><p> 9、裁剪多邊形的函數(shù),重量級(jí)的函數(shù)</p><p> bool CGraphics::CutRect(CRect rect)</p><p><b> {</b></p>
96、<p> CPoint rectPoint[4];</p><p> rectPoint[0].x = rect.left;</p><p> rectPoint[0].y = rect.top;</p><p> rectPoint[1].x = rect.right;</p><p> rectPoint[1].y
97、= rect.top;</p><p> rectPoint[3].x = rect.left;</p><p> rectPoint[3].y = rect.bottom;</p><p> rectPoint[2].x = rect.right;</p><p> rectPoint[2].y = rect.bottom;<
98、/p><p> //獲取裁減矩形的四個(gè)點(diǎn)的坐標(biāo),第一個(gè)點(diǎn)為左上,第二個(gè)點(diǎn)為右上,第三個(gè)點(diǎn)為右下,第四個(gè)點(diǎn)為左下</p><p><b> int i;</b></p><p> CArray<CPoint,CPoint&> myArray;//裁減后,保存的多邊形的依次各點(diǎn)的坐標(biāo)</p><p>
99、 for(int rectNum=0;rectNum<4;rectNum++)</p><p><b> {</b></p><p> //對(duì)裁減矩形的四條邊進(jìn)行循環(huán)</p><p> for(i=0;i<PointCount;i++)</p><p><b> {</b><
100、;/p><p> //對(duì)每條邊進(jìn)行循環(huán)</p><p> CPoint PointCross;</p><p> int beforeI=BeforeIndex(i),afterI=AfterIndex(i);</p><p> int afterrectNum = ((rectNum == 3)?0:rectNum+1);</p&
101、gt;<p> //判斷是否跟線段相交</p><p> if(InterCross(Point[beforeI],Point[i],rectPoint[rectNum],rectPoint[afterrectNum],PointCross))</p><p><b> {</b></p><p> if(PointCro
102、ss==Point[i])</p><p><b> {</b></p><p> myArray.Add(Point[i]);//交點(diǎn)在線段上,直接添加點(diǎn)坐標(biāo)在保存多邊形的數(shù)組中</p><p><b> }</b></p><p><b> else </b><
103、;/p><p> if(PointCross==Point[beforeI])</p><p><b> {</b></p><p> if(IsInSquareRgn(rect,Point[i],rectNum))</p><p> myArray.Add(Point[i]);//判斷是否可視,若是,則添加點(diǎn)坐標(biāo)&
104、lt;/p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> myArray.Add(PointCross);//跟線段相交,但交點(diǎn)不在頂點(diǎn)上,添加交點(diǎn)坐標(biāo)</p><p&g
105、t; if(IsInSquareRgn(rect,Point[i],rectNum))</p><p> myArray.Add(Point[i]);//判斷是否可視,若是,則添加點(diǎn)坐標(biāo)</p><p><b> }</b></p><p><b> }</b></p><p><b&
106、gt; else</b></p><p> if(IsInSquareRgn(rect,Point[i],rectNum))</p><p> myArray.Add(Point[i]);//線段不相交,但需判斷是否可視,若是,則添加點(diǎn)坐標(biāo)</p><p><b> }</b></p><p> P
107、ointCount=myArray.GetSize();</p><p><b> if(Point)</b></p><p> delete Point;</p><p> Point = new CPoint[PointCount];</p><p> for(i=0;i<PointCount;i++)
108、</p><p> Point[i]=myArray.GetAt(i);//重新賦予點(diǎn)坐標(biāo)的值</p><p> myArray.RemoveAll();</p><p><b> }</b></p><p> return true;</p><p><b> }</b
109、></p><p> 10、判斷判斷兩條線段是否相交的函數(shù)</p><p> bool CGraphics::InterCross(CPoint objectP1,CPoint objectP2,CPoint scanP1,CPoint scanP2,CPoint& coordinate)</p><p><b> {</b>
110、;</p><p> //objectP1、objectP2是一條線段的頂點(diǎn)坐標(biāo),而scanP1、scanP2是另一條線段的頂點(diǎn)坐標(biāo)</p><p> if(objectP1 == objectP2)</p><p> return false;//若objectP1、objectP2相等,則構(gòu)不成線段,退出</p><p> if(
111、scanP1 == scanP2)</p><p> return false;//若scanP1、scanP2等,則構(gòu)不成線段,退出</p><p> if( ( objectP1.y - objectP2.y ) * ( scanP1.x - scanP2.x )</p><p> == ( scanP1.y - scanP2.y ) * ( object
112、P1.x - objectP2.x))</p><p><b> {</b></p><p> //對(duì)斜率相等的情況下的處理</p><p> if((objectP1.y-objectP2.y)*(scanP1.x-objectP1.x)==(objectP1.x-objectP2.x)*(scanP1.y-objectP1.y))&l
113、t;/p><p><b> {</b></p><p> //判斷兩條線段是不是同一條線段</p><p> coordinate=objectP2;</p><p> return true;</p><p><b> }</b></p><p&g
114、t;<b> else</b></p><p> return false;</p><p><b> }</b></p><p> if(objectP1.x == objectP2.x)</p><p><b> {</b></p><p>
115、; //當(dāng)?shù)谝粭l線段斜率不存在是的,處理辦法</p><p> double x,y;</p><p> x = objectP1.x;</p><p> y = (scanP1.y-scanP2.y)*1.0/(scanP1.x-scanP2.x)*(objectP1.x-scanP1.x)+scanP1.y;</p><p>
116、y = (float)((int)(y+0.5));</p><p> if(((objectP1.y-y)*(y-objectP2.y)>=0) && ((objectP1.x-x)*(x-objectP2.x)>=0))</p><p><b> {</b></p><p> //判斷交點(diǎn)是不是在該兩條線段
117、上</p><p> coordinate.x = objectP1.x;</p><p> coordinate.y = (int)(y+0.5);</p><p> return true;</p><p><b> }</b></p><p> return false;</
118、p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if(scanP1.x == scanP2.x)</p><p><b> {</b><
119、;/p><p> //當(dāng)?shù)诙l線段斜率不存在是的,處理辦法</p><p> double x,y;</p><p> x = scanP1.x;</p><p> y = (objectP1.y-objectP2.y)*1.0/(objectP1.x-objectP2.x)*(scanP1.x-objectP1.x)+objectP1.
120、y;</p><p> y = (float)((int)(y+0.5));</p><p> if(((objectP1.y-y)*(y-objectP2.y)>=0) && ((objectP1.x-x)*(x-objectP2.x)>=0))</p><p><b> {</b></p>&
121、lt;p> //判斷交點(diǎn)是不是在該兩條線段上</p><p> coordinate.x = scanP1.x;</p><p> coordinate.y = (int)(y+0.5);</p><p> return true;</p><p><b> }</b></p><p&
122、gt; return false;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> //兩條線段斜率都存在時(shí)的處理辦法</p><p> double
123、k1,k2;</p><p> k1 = ( objectP1.y - objectP2.y ) * 1.0 / ( objectP1.x - objectP2.x);</p><p> k2 = ( scanP1.y - scanP2.y ) * 1.0 / ( scanP1.x - scanP2.x );</p><p> //k1,k2為計(jì)算的兩線段的斜
124、率</p><p> double x,y;</p><p> x = (scanP1.y-objectP1.y-k2*scanP1.x+k1*objectP1.x)/(k1-k2);</p><p> y = (k1*k2*scanP1.x-k1*k2*objectP1.x+k2*objectP1.y-k1*scanP1.y)/(k2-k1);</p&
125、gt;<p> x=(float)((int)(x+0.5));</p><p> y = (float)((int)(y+0.5));</p><p> if(((objectP1.y-y)*(y-objectP2.y)>=0) && ((objectP1.x-x)*(x-objectP2.x)>=0))</p><p&
126、gt;<b> {</b></p><p> //判斷交點(diǎn)是不是在該兩條線段上</p><p> coordinate.x = (int)(x+0.5);</p><p> coordinate.y = (int)(y+0.5);</p><p> return true;</p><p&g
127、t;<b> }</b></p><p> return false;</p><p><b> }</b></p><p><b> }</b></p><p> return true;</p><p><b> }</b
128、></p><p><b> 11、冒泡排序函數(shù)</b></p><p> bool CGraphics::SortArray(int* iArray,int iLength)</p><p><b> {</b></p><p><b> //冒泡排序</b>&
129、lt;/p><p> int i,j,iTemp;</p><p> bool bFlag;</p><p> for(i=0;i<iLength;i++)</p><p><b> {</b></p><p> bFlag=true;</p><p> fo
130、r(j=0;j<iLength-i-1;j++)</p><p><b> {</b></p><p> if(iArray[j] > iArray[j+1])</p><p><b> {</b></p><p> iTemp=iArray[j];</p><
131、;p> iArray[j]=iArray[j+1];</p><p> iArray[j+1]=iTemp;</p><p> bFlag=false;</p><p><b> }</b></p><p><b> }</b></p><p><b&g
132、t; if(bFlag)</b></p><p><b> break;</b></p><p><b> }</b></p><p> return true;</p><p><b> }</b></p><p> 12、對(duì)多
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 線段與多邊形的裁剪題庫
- 圓與橢圓對(duì)多邊形裁剪算法研究.pdf
- 多邊形的掃描轉(zhuǎn)換與區(qū)域填充
- 計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)報(bào)告---多邊形剪裁和填充圖形軟件設(shè)計(jì)
- 家裝快速建模軟件中任意多邊形裁剪及紋理填充的研究與實(shí)現(xiàn).pdf
- 一種任意多邊形的裁剪算法.pdf
- 11.3.1 多邊形
- 多邊形練習(xí)
- 多邊形裁剪算法在電力系統(tǒng)中的應(yīng)用
- 5.1 多邊形(1)
- 11.3.1--多邊形
- 11.3.1 多邊形-(4945)
- 11.3.1 多邊形2
- 正多邊形與圓教案
- 大熊《生活中的多邊形 多邊形的面積》ppt課件
- 多邊形內(nèi)角和教學(xué)設(shè)計(jì)
- 多邊形內(nèi)角和
- 4.3 相似多邊形
- 11.3.1 多邊形1
- 多邊形課件1
評(píng)論
0/150
提交評(píng)論