Bezier源代碼說明_第1頁
Bezier源代碼說明_第2頁
Bezier源代碼說明_第3頁
Bezier源代碼說明_第4頁
Bezier源代碼說明_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Bezier 源代碼說明MFC AppWizard本程序是在 win2000 profession+vc6.0 環(huán)境下編寫的。其程序框架是由 自動生成的(單文檔架構(gòu)) 。主要包括以下幾個類模塊。一, CAboutDlg由 AppWizard 自動生成的,其主要對程序進行說明。(未進行修改)二, CBezierApp由 AppWizard 自動生成的,其主要是應(yīng)用程序模塊。(未進行修改)三, CMainFrame由 AppWizard 自動生成的,其主要是程序框架。(未進行修改)四, CBezierDoc由 AppWizard 自動生成的,其主要是程序的文檔模塊。 對其進行的修改主要是:將一些數(shù)

2、據(jù)存放在此類模塊中。 public:boolean bDrawCurve;/ 是否是在畫曲線狀態(tài) boolean bSetPolygon/是否在設(shè)定多邊形COLORREF colorCurve;/ 曲線顏色 COLORREF colorPolygo n; 多邊形顏色 int iCurveWidth;/ 曲線寬度 int iPolygo nWidth;/ 多邊形寬度 double dDeltT; t 的變化量 int iNumPoi ntCoef;/ 多邊形點數(shù)量 int iNumPoi ntCurve;/ 曲線上點數(shù)量 CPoint pPointCurveMAX_CURPOINTNUM; /曲

3、線上各點 CPoint pPointCoefficentsMAX_DEGREE; /多變形各點 CBezier* pBezier;/計算 Beizer曲 線的對象。五, CBezierView由 AppWizard 自動生成的,其主要是程序的視圖模塊。 對其進行的修改主要包括:1, 將菜單 Casteljau 畫法 /生成 Bezier 曲線 的單擊消息映射到下面函數(shù)進行處理: /本函數(shù)主要是根據(jù)設(shè)定的參數(shù),用Casteljau 算法計算出 Bezier 曲線,并將其畫出來。void CBezierView:OnCasteljauBezier()CBezierDoc* pDoc = GetDo

4、cument();ASSERT_VALID(pDoc);/取消設(shè)定多變形狀態(tài)pDoc-bSetPolygon=false;pDoc-bDrawCurve=true;設(shè)定為畫 Bezier曲線狀態(tài)。pDoc-pBezier= new CBezier;/動態(tài)生成計算 Bezier曲線的對象。 /設(shè)定參數(shù)值pDoc-pBezier-SetParameters(pDoc-iNumPointCoef-1,pDoc-pPointCoeffice nts,pDoc-dDeltT);/pDoc-pBezier-CaculateCurve();/計算曲線各點。pDoc-pBezier-CaculateByCas

5、teljau();/取得曲線的的點數(shù)量。 pDoc-iNumPointCurve=pDoc-pBezier-GetPointNum(); /取得各曲線的點。pDoc-pBezier-GetCurvePoints(pDoc-pPointCurve);pDoc-UpdateAIIViews(NULL);更新視圖,從而調(diào)用視圖的On Draw函數(shù) 將Bezier曲線畫出。deletepDoc-pBezier; 釋放計算 Bezier曲線的對象。2, 將菜單 Casteljau 畫法 /設(shè)定多邊形 的單擊消息映射到下面函數(shù)進行處理: /本函數(shù)主要是使程序進入設(shè)定多變形的狀態(tài)。void CBezierV

6、iew:OnCasteljauPolygon()CBezierDoc * pDoc=(CBezierDoc*) GetDocument();/設(shè)定多變形pDoc-bSetPolygo n=true; 置成多變形狀態(tài)。 pDoc-bDrawCurve=false; 不是畫曲線狀態(tài)。/從新計數(shù)pDoc-iNumPointCoef=0; pDoc-UpdateAllViews(NULL);/ 更新視圖3,重載了 OnDraw函數(shù),本函數(shù)在更新視圖時都要被調(diào)用。 其主要根據(jù)是畫多邊形或曲線的裝態(tài)來畫多邊形和曲線。void CBezierView:OnDraw(CDC* pDC)CBezierDoc*

7、pDoc = GetDocument();ASSERT_VALID(pDoc);/保存原來的畫筆。CPen * pPenOrg=pDC-GetCurrentPen();/若是在畫多邊形或曲線狀態(tài),則畫相應(yīng)的多邊形if (pDoc-bSetPolygon|pDoc-bDrawCurve)/設(shè)定多邊形畫筆CPen penPolygon;penPolygon.CreatePen(PS_SOLID,pDoc-iPolygonWidth,pDoc-colorPolygon); pDC-SelectObject(&penPolygon);for(int i=1;iiNumPointCoef;i+)/ 畫多

8、邊形 pDC-MoveTo(pDoc-pPointCoefficentsi-1); pDC-LineTo(pDoc-pPointCoefficentsi);/畫曲線狀態(tài),則畫曲線if (pDoc-bDrawCurve)/設(shè)定Bezier曲線畫筆CPen penCoeff;penCoeff.CreatePen(PS_SOLID,pDoc-iCurveWidth,pDoc-colorCurve); pDC-SelectObject(&penCoeff);for(int i=1;iiNumPointCurve;i+) 畫Bezier曲線 pDC-MoveTo(pDoc-pPointCurvei-1)

9、; pDC-LineTo(pDoc-pPointCurvei); /還原原來的畫筆。pDC-SelectObject(pPenOrg);4,將菜單 Horner 畫法 /生成 Bezier 曲線 的單擊消息映射到下面函數(shù)進行處理: /本函數(shù)主要是根據(jù)設(shè)定的參數(shù),用Horner 算法計算出 Bezier 曲線,并將其畫出來。void CBezierView:OnHornerBezier()CBezierDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/取消設(shè)定多變形狀態(tài) pDoc-bSetPolygon=false; pDoc-bDrawCurve=tr

10、ue;pDoc-pBezier=new CBezier;/設(shè)定參數(shù) pDoc-pBezier-SetParameters(pDoc-iNumPointCoef-1,pDoc-pPointCoeffice nts,pDoc-dDeltT);計算Bezier曲線pDoc-pBezier-CaculateCurve(); /pDoc-pBezier-CaculateByCasteljau();/得到曲線點數(shù) pDoc-iNumPointCurve=pDoc-pBezier-GetPointNum();/取得曲線各點坐標(biāo) pDoc-pBezier-GetCurvePoints(pDoc-pPointC

11、urve);pDoc-UpdateAllViews(NULL);delete pDoc-pBezier;5,將菜單 Horner 畫法 /設(shè)定多邊形 的單擊消息映射到下面函數(shù)進行處理: /本函數(shù)主要是使程序進入設(shè)定多變形的狀態(tài)。void CBezierView:OnHornerPolygon()CBezierDoc * pDoc=(CBezierDoc*) GetDocument();/設(shè)定多變形pDoc-bSetPolygon=true;pDoc-bDrawCurve=false;/從新計數(shù)pDoc-iNumPointCoef=0; pDoc-UpdateAllViews(NULL); 6,

12、捕捉單擊左鍵事件,其處理函數(shù)如下: /其主要是如果現(xiàn)在的狀態(tài)是畫多邊形,則需要記住單擊的點的坐標(biāo),點的數(shù)量。其作為 Bezier 曲線畫法的輸入?yún)?shù)。void CBezierView:OnLButtonUp(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call defaultCScrollView:OnLButtonUp(nFlags, point);CBezierDoc* pDoc=(CBezierDoc*) GetDocument();/如果是設(shè)定多邊形狀態(tài),則捕捉按鍵坐標(biāo)if (p

13、Doc-bSetPolygon)pDoc-pPointCoefficentspDoc-iNumPointCoef=point; pDoc-iNumPointCoef+; /增加點數(shù)。/立即顯示pDoc-UpdateAllViews(NULL);7,將菜單 設(shè)置 /畫圖設(shè)置 單擊事件消息映射到下面函數(shù) /本函數(shù)主要是調(diào)用設(shè)置對話窗體,記下用戶對畫線顏色和寬度的設(shè)置 /設(shè)定畫圖參數(shù)void CBezierView:OnSetDraw()/ TODO: Add your command handler code hereCBezierDoc* pDoc=(CBezierDoc*)GetDocumen

14、t();CDlgSetting dlgSetting;/初始化設(shè)定對話框參數(shù)。 dlgSetting.m_iCurveWidth=pDoc-iCurveWidth; dlgSetting.m_iPolygonWidth=pDoc-iPolygonWidth;dlgSetting.colorCurve=pDoc-colorCurve;dlgSetting.colorPolygon=pDoc-colorPolygon;if(dlgSetting.DoModal()=IDOK)/設(shè)定各參數(shù)。 pDoc-iPolygonWidth=dlgSetting.m_iPolygonWidth; pDoc-iC

15、urveWidth=dlgSetting.m_iCurveWidth; pDoc-colorCurve=dlgSetting.colorCurve; pDoc-colorPolygon=dlgSetting.colorPolygon;六, CDlgSetting其是用來對畫線參數(shù)進行設(shè)置的模塊。比較簡單。其類體定義如下:/設(shè)定參數(shù)的對話窗類。classCDlgSetting : public CDialog/ Construction public :CDlgSetting(CWnd* pParent = NULL); / standard constructor/ Dialog Data/A

16、FX_DATA(CDlgSetting)enum IDD = IDD_DIALOG_SET ;intm_iCurveWidth; /曲線寬度intm_iPolygonWidth; /多邊形寬度/AFX_DATA public :COLORREF colorPolygo n; 多邊形顏色COLORREF colorCurve;/ 曲線顏色/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CDlgSetting)protected:virtual void DoDataExchange(CDataEx

17、change* pDX); / DDX/DDV support /AFX_VIRTUAL/ Implementation protected:/ Generated message map functions/AFX_MSG(CDlgSetting)afx_msg void OnButtonPenCorlor1();afx_msg void OnButtonPenCorlor2(); /AFX_MSGDECLARE_MESSAGE_MAP();兩個事件函數(shù)如下:/設(shè)定多變形顏色參數(shù)void CDlgSetting:OnButtonPenCorlor1()/ TODO: Add your con

18、trol notification handler code here CColorDialog dlgColor(colorPolygon);if(dlgColor.DoModal()=IDOK) colorPolygon=dlgColor.GetColor();/設(shè)定曲線顏色參數(shù)。void CDlgSetting:OnButtonPenCorlor2()/ TODO: Add your control notification handler code here CColorDialog dlgColor(colorCurve); if(dlgColor.DoModal()=IDOK) c

19、olorCurve=dlgColor.GetColor();七, CBezier本模塊是此程序的核心模塊,其主要是將 Bezier 曲線算法封裝成一個類模塊。 1,其類體定義如下:本類主要用來計算Bezier曲線。classCBezierprivate:int mDegreeBezier曲線的次數(shù)CPoint* m_pPointCoefficients;/Bezier曲線的系數(shù)double m_dDeltT;/t的變化量(其來控制點的密集度)CPoi nt* m_pPoi ntCurve;/ 曲線上的點int m_iNumOfPoint; /曲線上的點數(shù)量public:void Caculat

20、eByCasteljau()/ 通過 Casteljai算法來計算。void GetCurvePoi nts(CPoi nt* poi ntArray);/ 取得曲線上各點。int GetPoi ntNum();取得曲線上的點數(shù)。void CaculateCurve()/ 通過 Horner算法進行計算。void SetParametersnt iDegree,CPoi nt* pPoi ntCoefficie nts,double dDeltT);/設(shè) 定初始參數(shù)CBezier();virtual CBezier();private:CPoi nt Hornbez(double t);/Ho

21、rner算法中用來計算曲線坐標(biāo)的函數(shù),具體參見 課本。CPoi nt Decasdouble t);/Casteljau算法中用來計算曲線坐標(biāo)的函數(shù),具體參見課本。;2,其主要的接口如下:/類構(gòu)造函數(shù),主要是進行參數(shù)初始化CBezier:CBezier()/初始化參數(shù) m_dDeltT=0.0;m_iDegree=0; m_pPointCoefficients=NULL;m_pPointCurve=NULL; m_iNumOfPoint=0; /析構(gòu)函數(shù),主要是釋放所分配的內(nèi)存。CBezier:CBezier()/釋放空間delete m_pPointCoefficients;delete m

22、_pPointCurve;/設(shè)定參數(shù)接口,主要是將畫Bezier曲線的一些信息傳入對象體內(nèi)。/設(shè)定Bezier曲線的初始參數(shù)void CBezier:SetParameternt iDegree, CPoi nt *pPoi ntCoefficie nts, double dDeltT) m_iDegree=iDegree;/為系數(shù)分配空間this-m_pPointCoefficients=new CPointiDegree+1;for(int i=0;im_dDeltT=dDeltT;/用Horner算法進行計算Bezier曲線。/通過Horner算法進行計算。void CBezier:Ca

23、culateCurve() /為曲線上的點分配空間this-m_pPoi ntCurve=new CPoi nti nt(1.0/m_dDeltT)+100; 分配多一點空間。/將開始節(jié)點放入m_pPointCurve0=m_pPointCoefficients0;mNu mOfPoi nt+;增加曲線節(jié)點數(shù)。循環(huán)計算Bezier曲線上各點for(double t=m_dDeltT;tm_iNumOfPoint+;/將最后一個點加入曲線中this-m_pPointCurvem_iNumOfPoint= this-m_pPointCoefficientsm_iDegreeJthis-m_iNum

24、OfPoint+;用Horner算法計算時需要調(diào)用的函數(shù)/利用Hornber算法計算Bezier曲線上點坐標(biāo)(參照課本)CPoint CBezier:Hornbez(double t)double t1=1-t;double fact=1.0;int n_choose_i=1;double aux_X=this-m_pPointCoefficients0.x*t1;double aux_Y=this-m_pPointCoefficients0.y*t1;for(int i=1;im_iDegree;i+) fact=fact*t; n_choose_i=n_choose_i*(m_iDegre

25、e-i+1)/i;aux_X=(aux_X+fact*n_choose_i*m_pPointCoefficientsi.x)*t1; aux_Y=(aux_Y+fact*n_choose_i*m_pPointCoefficientsi.y)*t1; aux_X=aux_X+fact*t*m_pPointCoefficientsm_iDegree.x; aux_Y=aux_Y+fact*t*m_pPointCoefficientsm_iDegree.y;CPoint point;point.x=int(aux_X),point.y=int(aux_Y);return point;返回計算后Bezier曲線的節(jié)點數(shù)。/返回曲線的點數(shù)int CBezier:GetPointNum()return m_iNumOfPoint;返回Bezier曲線各節(jié)點之值。/返回曲線各點之值void CBezier:G

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論