計(jì)算機(jī)圖形學(xué)---多邊形裁剪與填充-計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)(共23頁(yè))_第1頁(yè)
計(jì)算機(jī)圖形學(xué)---多邊形裁剪與填充-計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)(共23頁(yè))_第2頁(yè)
計(jì)算機(jī)圖形學(xué)---多邊形裁剪與填充-計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)(共23頁(yè))_第3頁(yè)
計(jì)算機(jī)圖形學(xué)---多邊形裁剪與填充-計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)(共23頁(yè))_第4頁(yè)
計(jì)算機(jī)圖形學(xué)---多邊形裁剪與填充-計(jì)算機(jī)圖形學(xué)課程設(shè)計(jì)(共23頁(yè))_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上課 程 設(shè) 計(jì) 報(bào) 告課程名稱 計(jì)算機(jī)圖形學(xué) 課題名稱 多邊形裁剪與填充 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 班 級(jí) 計(jì)算機(jī)0902 學(xué) 號(hào) 姓 名 指導(dǎo)教師 劉長(zhǎng)松 曹 燚 2012年 10 月 9 日湖南工程學(xué)院課 程 設(shè) 計(jì) 任 務(wù) 書課程名稱 計(jì)算機(jī)圖形學(xué) 課 題 多邊形裁剪與填充 專業(yè)班級(jí) 計(jì)算機(jī)0902 學(xué)生姓名 學(xué) 號(hào) 指導(dǎo)老師 劉長(zhǎng)松 曹 燚 審 批 任務(wù)書下達(dá)日期 2012年 9月 15 日任務(wù)完成日期 2012 年 10月 9 日一、設(shè)計(jì)內(nèi)容與設(shè)計(jì)要求1設(shè)計(jì)內(nèi)容:交互式地實(shí)現(xiàn)多邊形的裁剪和填充。2設(shè)計(jì)要求:1)窗口功能設(shè)計(jì)。 2)實(shí)現(xiàn)鼠標(biāo)畫多邊形與數(shù)據(jù)存儲(chǔ)功

2、能。 3)實(shí)現(xiàn)鼠標(biāo)剪裁窗口選擇功能。4)實(shí)現(xiàn)多邊形裁剪和填充功能。3.算法提示:多邊形裁剪算法分析:基本思想是一次用窗口的一條邊裁剪多邊形,窗口的一條邊以及延長(zhǎng)線構(gòu)成裁剪線,該線把平面分成兩個(gè)部分:可見一側(cè),不可見一側(cè)。用一條裁剪邊對(duì)多邊形進(jìn)行裁剪,得到一個(gè)頂點(diǎn)序列,作為下一條裁剪邊處理過程的輸入點(diǎn)。對(duì)于每一條裁剪邊,只是判斷點(diǎn)在窗口的哪一測(cè)以及求線段與裁剪邊的交點(diǎn)算法應(yīng)隨之改變。多邊形填充算法分析:確定多邊形所占有的最大掃描線數(shù),得到多邊形頂點(diǎn)的最小和最大y值(ymin和ymax),從y=ymin 到 y=ymax, 每次用一條掃描進(jìn)行填充。對(duì)一條掃描線填充的過程可分為四個(gè)步驟: a.求交b

3、.排序c.交點(diǎn)配對(duì)d.區(qū)間填色。二、進(jìn)度安排第 3 周 星期一 8:0012:00星期二 8:0012:00 星期三 8:0012:00 星期四 8:0012:00 星期五 8:0012:00第 4 周 星期一 8:0012:00附:課程設(shè)計(jì)報(bào)告裝訂順序:封面、任務(wù)書、目錄、正文、附件(A4大小的圖紙及程序清單)、評(píng)分。 正文的格式:一級(jí)標(biāo)題用3號(hào)黑體,二級(jí)標(biāo)題用四號(hào)宋體加粗,正文用小四號(hào)宋體;行距為22。正文的內(nèi)容:一、課題的主要功能;二、課題的功能模塊的劃分(要求畫出模塊圖);三、主要功能的實(shí)現(xiàn)(至少要有一個(gè)主要模塊的流程圖);四、程序調(diào)試;五、總結(jié);六、附件(所有程序的原代碼,要求對(duì)程序

4、寫出必要的注釋)。正文總字?jǐn)?shù)要求在5000字以上(不含程序原代碼)。一、題目?jī)?nèi)容說(shuō)明:1、交互式地實(shí)現(xiàn)多邊形的裁剪和填充。2、功能要求:1) 窗口功能設(shè)計(jì)。 2)實(shí)現(xiàn)鼠標(biāo)畫多邊形與數(shù)據(jù)存儲(chǔ)功能。 4)實(shí)現(xiàn)鼠標(biāo)剪裁窗口選擇功能。5) 實(shí)現(xiàn)多邊形裁剪和填充功能。二、總體設(shè)計(jì):本程序使用MFC實(shí)現(xiàn)多邊形的裁剪和填充繪圖程序。多邊形裁剪算法分析:基本思想是一次用窗口的一條邊裁剪多邊形,窗口的一條邊以及延長(zhǎng)線構(gòu)成裁剪線,改線把平面分成兩個(gè)部分:可見一側(cè),不可見一側(cè)。用一條裁剪邊多多邊形進(jìn)行裁剪,得到一個(gè)頂點(diǎn)序列,作為嚇一條裁剪邊處理過程的輸入點(diǎn)。對(duì)于每一條裁剪邊,只是判斷點(diǎn)在窗口的哪一測(cè)以及求線段與裁剪

5、邊的交點(diǎn)算法應(yīng)隨之改變。僅用一條裁剪邊時(shí),逐次多邊形裁剪框圖:在CGraphics類的CutRectangular(CRect)函數(shù)中實(shí)現(xiàn)對(duì)多邊形的裁剪多邊形填充算法分析:確定多邊形所占有的最大掃描線數(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)多邊形的填充算法。三、模塊設(shè)計(jì):各個(gè)程序函數(shù)的功能,參數(shù),變量的說(shuō)明:MFC應(yīng)用程序框架中類的詳細(xì)解析:1MainFrm:創(chuàng)建窗口及窗口里的菜單

6、、工具欄、狀態(tài)欄等實(shí)現(xiàn)交互的按鈕。1)函數(shù)int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)創(chuàng)建菜單、工具欄、狀欄。2)BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)設(shè)置窗口的大小和初始位置。2圖像裁剪View:視圖,負(fù)責(zé)內(nèi)存數(shù)據(jù)與用戶的交互,包括數(shù)據(jù)的顯示、菜單的選取,鼠標(biāo)的響應(yīng)。1. void CMyView:OnLButtonDown(UINT nFlags, CPoint point)對(duì)鼠標(biāo)按下左鍵的響應(yīng),如果是自定義裁剪的區(qū)域操作就捕獲鼠標(biāo)按下的點(diǎn),畫裁剪區(qū)域,如果是

7、自定義點(diǎn)坐標(biāo)的操作就捕獲鼠標(biāo)的點(diǎn)畫多邊形。2. void CMyView:OnMouseMove(UINT nFlags, CPoint point)對(duì) 鼠標(biāo) 移動(dòng)的響應(yīng)。用捕獲的點(diǎn)畫出相應(yīng)的矩形裁剪邊框。畫邊框的時(shí)候,先用白色擦出原先的矩形邊框,再用虛線畫出新的舉行邊框3. void CMyView:OnRButtonUp(UINT nFlags, CPoint point)對(duì)鼠標(biāo)放開左鍵的相應(yīng)。如果是自定義點(diǎn)的坐標(biāo),就獲取新的初始裁減矩形范圍。4. void CMyView:OnLButtonUp(UINT nFlags, CPoint point)對(duì)鼠標(biāo)放開左鍵的響應(yīng)5. void CM

8、yView:OnInitialUpdate()初始化裁剪區(qū)域和在窗口中畫一個(gè)矩形和一個(gè)五角星。6. void CMyView:OnDraw(CDC* pDC)重畫窗口,用voidCMyView:OnInitialUpdate來(lái)啟動(dòng)它,通過消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。定義裁剪矩形區(qū)域,并賦值。當(dāng)自定義多邊形坐標(biāo)時(shí),在各個(gè)點(diǎn)坐標(biāo)處畫一個(gè)小圓,以顯示點(diǎn)的位置。畫出多邊形。3圖像裁剪DOC:文檔,負(fù)責(zé)內(nèi)存數(shù)據(jù)與磁盤的交互。1、 void CMyDoc:OnFillployon()2、 void CMyDoc:OnUpdateFillployon(CCmdUI* pCmdUI)3、

9、 void CMyDoc:OnCutRect()4、 void CMyDoc:OnUpdateCutRect(CCmdUI* pCmdUI)4.CGraphics:實(shí)現(xiàn)多邊形的填充和裁剪。1、 構(gòu)造函數(shù)CGraphics():PointCount(10),Point(NULL)初始化五角星的頂點(diǎn)坐標(biāo)。2、 析構(gòu)函數(shù)CGraphics()刪除動(dòng)態(tài)生成的Point指針。3、 bool DrawPloyon(CDC*);在指定設(shè)備中畫多邊形。4、 bool FillPloyon(CDC*);填充多邊形。5、 bool InterCross(CPoint,CPoint,CPoint,CPoint,CP

10、oint&);判斷兩條線段是否相交。6、 bool CutRect(CRect);對(duì)多邊形進(jìn)行裁剪。7、 bool IsInSquareRgn(CRect,CPoint,int);對(duì)多邊形裁剪時(shí),判斷線段斷點(diǎn)是否在可視一側(cè)。8、 bool SortArray(int*,int);冒泡排序。四、詳細(xì)設(shè)計(jì):1、創(chuàng)建窗口、菜單、工具欄、狀欄的函數(shù)。int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CFrameWnd:OnCreate(lpCreateStruct) = -1)return -1;if (!m_wndToolBa

11、r.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)TRACE0("Failed to create toolbarn");return -1; / fail to createif (!m_wndStatusBar.Create(this) |!m_wndStatusBar.SetIndic

12、ators(indicators, sizeof(indicators)/sizeof(UINT)TRACE0("Failed to create status barn");return -1; / fail to create/ TODO: Delete these three lines if you don't want the toolbar to/ be dockablem_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&

13、m_wndToolBar);return 0; 2、鼠標(biāo)按下左鍵的響應(yīng)函數(shù)void CMyView:OnLButtonDown(UINT nFlags, CPoint point) /對(duì)鼠標(biāo)按下左鍵的相應(yīng)CScrollView:OnLButtonDown(nFlags, point);if(m_bDefineRect) /如果是自定義裁減的區(qū)域的操作SetCapture();/捕獲鼠標(biāo)m_bCaptured = TRUE;CDC *dc=GetDC();CRect rect(TopLeft,BottomRight);dc->SelectStockObject(WHITE_PEN);dc-

14、>Rectangle(rect);InvalidateRect(rect,false);TopLeft = point;:SetCursor(:LoadCursor(NULL, IDC_CROSS);/設(shè)置鼠標(biāo)樣子為十字形的if(m_bDefinePointV)/如果是自定義點(diǎn)坐標(biāo)的操作PointArray.Add(point);CRect ellipseRect;ellipseRect.top = point.y - 5;ellipseRect.bottom = point.y + 5;ellipseRect.left = point.x - 5;ellipseRect.right =

15、 point.x + 5;InvalidateRect(ellipseRect,true);3、鼠標(biāo)移動(dòng)時(shí)的響應(yīng)函數(shù)void CMyView:OnMouseMove(UINT nFlags, CPoint point) CScrollView:OnMouseMove(nFlags, point);/對(duì)鼠標(biāo)移動(dòng)時(shí)的相應(yīng)if (m_bCaptured) /畫出相應(yīng)的矩形裁減邊框CDC *dc=GetDC();CRect rect(TopLeft,BottomRight);dc->SelectStockObject(WHITE_PEN);dc->Rectangle(rect);/用白色擦

16、除原先的矩形邊框InvalidateRect(rect,false);BottomRight=point;CRect newrect(TopLeft,BottomRight);CPen pen;pen.CreatePen(PS_DOT,1,RGB(0,0,0);dc->SelectObject(pen);dc->Rectangle(newrect);/用虛線畫出新的矩形邊框 void CMyView:OnLButtonUp(UINT nFlags, CPoint point) CScrollView:OnLButtonUp(nFlags, point);/對(duì)鼠標(biāo)放開左鍵的響應(yīng) if

17、 (m_bCaptured) :ReleaseCapture(); m_bCaptured = false;m_bDefineRect = false;void CMyView:OnViewDefineRect() /設(shè)置是否自定義裁減區(qū)域m_bDefineRect = true;void CMyView:OnEditDefinePoint() /設(shè)置是否自定義點(diǎn)的坐標(biāo)m_bDefinePointV = true;4、放開鼠標(biāo)右鍵的響應(yīng)void CMyView:OnRButtonUp(UINT nFlags, CPoint point) /對(duì)鼠標(biāo)放開右鍵的相應(yīng)CScrollView:OnRBu

18、ttonUp(nFlags, point);if(m_bDefinePointV)CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDoc->m_grahics.PointCount=PointArray.GetSize();if(pDoc->m_grahics.Point)delete pDoc->m_grahics.Point;pDoc->m_grahics.Point = new CPointpDoc->m_grahics.PointCount;for(int i=0;i<pDoc->m_grahi

19、cs.PointCount;i+)pDoc->m_grahics.Pointi=PointArray.GetAt(i);/對(duì)Point點(diǎn)坐標(biāo)重新賦值PointArray.RemoveAll();m_bDefinePointV=false;CRect rect;this->GetClientRect(rect);InvalidateRect(rect);/獲取新的初始裁減矩形范圍int minX = pDoc->m_grahics.Point0.x , minY = pDoc->m_grahics.Point0.y;int maxX = pDoc->m_grahic

20、s.Point0.x , maxY = pDoc->m_grahics.Point0.y;for(i=1;i<pDoc->m_grahics.PointCount;i+)if(minX > pDoc->m_grahics.Pointi.x)minX = pDoc->m_grahics.Pointi.x;if(minY > pDoc->m_grahics.Pointi.y)minY = pDoc->m_grahics.Pointi.y;if(maxX < pDoc->m_grahics.Pointi.x)maxX = pDoc-&

21、gt;m_grahics.Pointi.x;if(maxY < pDoc->m_grahics.Pointi.y)maxY = pDoc->m_grahics.Pointi.y;TopLeft = CPoint(minX,minY);BottomRight = CPoint(maxX,maxY);5、初始化函數(shù)void CMyView:OnInitialUpdate()CScrollView:OnInitialUpdate();CSize sizeTotal;sizeTotal.cx = sizeTotal.cy = 100;SetScrollSizes(MM_TEXT, s

22、izeTotal);CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/設(shè)置初始的裁減區(qū)域int minX = pDoc->m_grahics.Point0.x , minY = pDoc->m_grahics.Point0.y;int maxX = pDoc->m_grahics.Point0.x , maxY = pDoc->m_grahics.Point0.y;for(int i=1;i<pDoc->m_grahics.PointCount;i+)if(minX > pDoc->m_grahic

23、s.Pointi.x)minX = pDoc->m_grahics.Pointi.x;if(minY > pDoc->m_grahics.Pointi.y)minY = pDoc->m_grahics.Pointi.y;if(maxX < pDoc->m_grahics.Pointi.x)maxX = pDoc->m_grahics.Pointi.x;if(maxY < pDoc->m_grahics.Pointi.y)maxY = pDoc->m_grahics.Pointi.y;TopLeft = CPoint(minX,minY

24、);BottomRight = CPoint(maxX,maxY);6、重畫窗口的函數(shù),是MFC自動(dòng)生成的,我們可以在里面添加自己的代碼,用來(lái)實(shí)現(xiàn)消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。void CMyView:OnDraw(CDC* pDC)CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereint left,top,right,buttom;left=min(TopLeft.x,BottomRight.x);right=max(TopLeft.x,Bot

25、tomRight.x);top=min(TopLeft.y,BottomRight.y);buttom=max(TopLeft.y,BottomRight.y);CRect rect(left,top,right,buttom);/定義裁減矩形區(qū)域,并賦值CPen penDot,penSolid;penDot.CreatePen(PS_DOT,1,RGB(0,0,0);pDC->SelectObject(penDot);pDC->Rectangle(rect);/用虛線畫出裁減矩形區(qū)域penSolid.CreatePen(PS_SOLID,1,RGB(0,0,0);pDC->

26、SelectObject(penSolid);if(PointArray.GetSize()/當(dāng)自定義多邊形點(diǎn)坐標(biāo)時(shí),在各個(gè)點(diǎn)坐標(biāo)處畫一個(gè)小圓,以顯示點(diǎn)的位置int i;for(i=0;i<PointArray.GetSize();i+)pDC->MoveTo(PointArray.GetAt(i);CRect ellipseRect;ellipseRect.top = PointArray.GetAt(i).y - 5;ellipseRect.bottom = PointArray.GetAt(i).y + 5;ellipseRect.left = PointArray.GetA

27、t(i).x - 5;ellipseRect.right = PointArray.GetAt(i).x + 5;pDC->Ellipse(ellipseRect);if(pDoc->bCutRect) /判斷是否裁減,若是,則根據(jù)裁減區(qū)域進(jìn)行裁減pDoc->m_grahics.CutRect(rect);pDoc->bCutRect=false;pDoc->m_grahics.DrawPloyon(pDC);/畫出多邊形if(pDoc->bFillPloyon)/判斷是否填充,根據(jù)需要進(jìn)行相應(yīng)的操作pDoc->m_grahics.FillPloyon

28、(pDC);pDoc->bFillPloyon=false;7、在指定的pDC設(shè)備中,畫多邊形bool CGraphics:DrawPloyon(CDC* pDC)if(PointCount < 3)return false;/若多邊形小于三個(gè)點(diǎn)則返回pDC->MoveTo(Point0);for(int i=1;i<PointCount;i+)pDC->LineTo(Pointi);pDC->LineTo(Point0);/在pDC中畫出多邊形return true;8、填充多邊形函數(shù),重量級(jí)的函數(shù)/在指定的pDC設(shè)備中,填充多邊形bool CGraphi

29、cs:FillPloyon(CDC* pDC)if(PointCount < 3)return false;/若多邊形小于三個(gè)點(diǎn)則返回int minX = Point0.x , minY = Point0.y;int maxX = Point0.x , maxY = Point0.y;for(int i=1;i<PointCount;i+)if(minX > Pointi.x)minX = Pointi.x;if(minY > Pointi.y)minY = Pointi.y;if(maxX < Pointi.x)maxX = Pointi.x;if(maxY &

30、lt; Pointi.y)maxY = Pointi.y;/獲取多邊形中所有坐標(biāo)點(diǎn)的最大值和最小值,作為掃描線循環(huán)的范圍CUIntArray myArray;int x,y;for(y=minY;y<maxY;y+)/掃描線從minY開始到maxYfor(i=0;i<PointCount;i+)/對(duì)每條邊進(jìn)行循環(huán)CPoint PointCross;int beforeI=BeforeIndex(i),afterI=AfterIndex(i);/判斷是否跟線段相交if(InterCross(PointbeforeI,Pointi,CPoint(minX,y),CPoint(maxX,

31、y),PointCross)/若是存在交點(diǎn),則進(jìn)行相應(yīng)的判斷,即判斷x的坐標(biāo)取兩次、一次還是不取if(PointCross=Pointi)if(PointbeforeI.y > PointCross.y) && (PointafterI.y > PointCross.y)myArray.Add(PointCross.x);myArray.Add(PointCross.x);/邊頂點(diǎn)的y值大于交點(diǎn)的y值,x坐標(biāo)取兩次elseif(PointbeforeI.y - PointCross.y) * (PointafterI.y - PointCross.y) < 0

32、)myArray.Add(PointCross.x);/邊頂點(diǎn)的y值在交點(diǎn)的y值之間,即一個(gè)頂點(diǎn)的y值大于交點(diǎn)的y值,而另一個(gè)小于,相應(yīng)的x坐標(biāo)取一次elseif(PointCross.y=PointafterI.y)myArray.Add(PointCross.x); else if(PointCross=PointbeforeI)continue;elsemyArray.Add(PointCross.x);/當(dāng)交點(diǎn)不在線段的頂點(diǎn)時(shí),x坐標(biāo)只取一次int *scanLineX,num=myArray.GetSize();scanLineX = new intnum;for(i=0;i<

33、num;i+)scanLineXi=myArray.GetAt(i);/獲取掃描線x值,以構(gòu)成填充區(qū)間myArray.RemoveAll();SortArray(scanLineX,num);/對(duì)scanLine(掃描線x坐標(biāo)進(jìn)行排序)for(i=0;i<num;i=i+2)if(i+1>=num)break;for(x=scanLineXi;x<scanLineXi+1;x+)/x值配對(duì)填充pDC->SetPixelV(CPoint(x,y),RGB(255,0,0);/將填充區(qū)間相應(yīng)點(diǎn)的顏色設(shè)置成紅色 Sleep(1);/CPU暫停1ms,以體現(xiàn)出多邊形是以掃描線的

34、方式,一條一條的填充的delete scanLineX;return true;9、裁剪多邊形的函數(shù),重量級(jí)的函數(shù)bool CGraphics:CutRect(CRect rect)CPoint rectPoint4;rectPoint0.x = rect.left;rectPoint0.y = rect.top;rectPoint1.x = rect.right;rectPoint1.y = rect.top;rectPoint3.x = rect.left;rectPoint3.y = rect.bottom;rectPoint2.x = rect.right;rectPoint2.y =

35、 rect.bottom;/獲取裁減矩形的四個(gè)點(diǎn)的坐標(biāo),第一個(gè)點(diǎn)為左上,第二個(gè)點(diǎn)為右上,第三個(gè)點(diǎn)為右下,第四個(gè)點(diǎn)為左下int i;CArray<CPoint,CPoint&> myArray;/裁減后,保存的多邊形的依次各點(diǎn)的坐標(biāo)for(int rectNum=0;rectNum<4;rectNum+)/對(duì)裁減矩形的四條邊進(jìn)行循環(huán)for(i=0;i<PointCount;i+)/對(duì)每條邊進(jìn)行循環(huán)CPoint PointCross;int beforeI=BeforeIndex(i),afterI=AfterIndex(i);int afterrectNum =

36、(rectNum = 3)?0:rectNum+1);/判斷是否跟線段相交if(InterCross(PointbeforeI,Pointi,rectPointrectNum,rectPointafterrectNum,PointCross)if(PointCross=Pointi)myArray.Add(Pointi);/交點(diǎn)在線段上,直接添加點(diǎn)坐標(biāo)在保存多邊形的數(shù)組中else if(PointCross=PointbeforeI)if(IsInSquareRgn(rect,Pointi,rectNum)myArray.Add(Pointi);/判斷是否可視,若是,則添加點(diǎn)坐標(biāo)elsemyA

37、rray.Add(PointCross);/跟線段相交,但交點(diǎn)不在頂點(diǎn)上,添加交點(diǎn)坐標(biāo)if(IsInSquareRgn(rect,Pointi,rectNum)myArray.Add(Pointi);/判斷是否可視,若是,則添加點(diǎn)坐標(biāo)elseif(IsInSquareRgn(rect,Pointi,rectNum)myArray.Add(Pointi);/線段不相交,但需判斷是否可視,若是,則添加點(diǎn)坐標(biāo)PointCount=myArray.GetSize();if(Point)delete Point;Point = new CPointPointCount;for(i=0;i<Poin

38、tCount;i+)Pointi=myArray.GetAt(i);/重新賦予點(diǎn)坐標(biāo)的值myArray.RemoveAll();return true;10、判斷判斷兩條線段是否相交的函數(shù)bool CGraphics:InterCross(CPoint objectP1,CPoint objectP2,CPoint scanP1,CPoint scanP2,CPoint& coordinate)/objectP1、objectP2是一條線段的頂點(diǎn)坐標(biāo),而scanP1、scanP2是另一條線段的頂點(diǎn)坐標(biāo)if(objectP1 = objectP2)return false;/若objec

39、tP1、objectP2相等,則構(gòu)不成線段,退出if(scanP1 = scanP2)return false;/若scanP1、scanP2等,則構(gòu)不成線段,退出if( ( objectP1.y - objectP2.y ) * ( scanP1.x - scanP2.x )= ( scanP1.y - scanP2.y ) * ( objectP1.x - objectP2.x)/對(duì)斜率相等的情況下的處理if(objectP1.y-objectP2.y)*(scanP1.x-objectP1.x)=(objectP1.x-objectP2.x)*(scanP1.y-objectP1.y)/

40、判斷兩條線段是不是同一條線段coordinate=objectP2;return true;elsereturn false;if(objectP1.x = objectP2.x)/當(dāng)?shù)谝粭l線段斜率不存在是的,處理辦法double x,y;x = objectP1.x;y = (scanP1.y-scanP2.y)*1.0/(scanP1.x-scanP2.x)*(objectP1.x-scanP1.x)+scanP1.y;y = (float)(int)(y+0.5);if(objectP1.y-y)*(y-objectP2.y)>=0) && (objectP1.x-

41、x)*(x-objectP2.x)>=0)/判斷交點(diǎn)是不是在該兩條線段上coordinate.x = objectP1.x;coordinate.y = (int)(y+0.5);return true;return false;elseif(scanP1.x = scanP2.x)/當(dāng)?shù)诙l線段斜率不存在是的,處理辦法double x,y;x = scanP1.x;y = (objectP1.y-objectP2.y)*1.0/(objectP1.x-objectP2.x)*(scanP1.x-objectP1.x)+objectP1.y;y = (float)(int)(y+0.5)

42、;if(objectP1.y-y)*(y-objectP2.y)>=0) && (objectP1.x-x)*(x-objectP2.x)>=0)/判斷交點(diǎn)是不是在該兩條線段上coordinate.x = scanP1.x;coordinate.y = (int)(y+0.5);return true;return false;else/兩條線段斜率都存在時(shí)的處理辦法double k1,k2;k1 = ( objectP1.y - objectP2.y ) * 1.0 / ( objectP1.x - objectP2.x);k2 = ( scanP1.y - scanP2.y ) * 1.0 / ( scanP1.x - scanP2.x );/k1,k2為計(jì)算的兩線段的斜率double x,y;x = (scanP1.y-objectP1.y-k2*scanP1.x+k1*objectP1.x)/(k1-k2);y = (k1*k2*scanP1.x-k1*k2*objectP1.x+k2*objectP1.y-k1*scanP1.y)/(k2-k1);x=(float)(int)(x+0.5);y = (float)(int)(y+0.5);

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論