




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、河北工程大學研究生課程論文報告課程名稱:水利機械計算機輔助設計 課程編號: SZ0104F05 課程類型: 非學位課 考核方式: 考試 學科專業(yè): 水利工程 年 級: 12級 姓 名: 董小雪 學 號: 10076129193 河北工程大學2012 2013學年第2學期研究生課程論文報告課程論文評語:成 績評閱教師簽名評閱日期 年 月 日課程論文題目(居中):說明:1報告請用A4紙,正文字體用5號宋體字。2頁邊距:左、右為2.5cm,上、下為2cm。3裝訂:在報告紙張上方裝訂(裝訂線標志見頁面上方)Bezier曲線一、Bezier曲線的定義給定空間n+1個點的位置矢量Pi(i=0,1,2,n)
2、則Bezier曲線可定義為:其中,Pi構成該Bezier曲線的特征多邊形,Bi,n(t)是n次Bernstein基函數(shù):我們規(guī)定 二、Bezier曲線的性質(zhì)(1)端點性質(zhì)a)曲線端點位置矢量 由Bernstein基函數(shù)的端點性質(zhì)可以推得,當t=0時,P(0)=P0 ;當t=1時,P(1)=Pn。由此可見,Bezier曲線的起點、終點與相應的特征多邊形的起點、終點重合。b) 切矢量 因為,所以當t=0時,P(0)=n(P1-P0),當t=1時,P(1)=n(Pn-Pn-1),這說明Bezier曲線的起點和終點處的切線方向和特征多邊形的第一條邊及最后一條邊的走向一致。c) 二階導矢 當t=0時,
3、當t=1時,上式表明:2階導矢只與相鄰的3個頂點有關。事實上,r 階導矢只與(r+1)個相鄰點有關,與更遠點無關。將、及、代入曲率公式可以得到Bezier曲線在端點的曲率分別為:、d) K階導函數(shù)的差分表示 n次Bezier曲線的k階導數(shù)可用差分公式為: 其中高階向前差分矢量由低階向前差分矢量遞推地定義:(2)對稱性由控制頂點構造出的新Bezier曲線,與原Bezier曲線形狀相同,走向相反。因為: 這個性質(zhì)說明Bezier曲線在起點處有什么幾何性質(zhì),在終點處也有相同的性質(zhì)。(3)凸包性由于,且,這一結果說明當t在0,1區(qū)間變化時,對某一個t值,P(t)是特征多邊形各頂點的加權平均,權因子依次
4、是。在幾何圖形上,意味著Bezier曲線P(t)在 中各點是控制點Pi的凸線性組合,即曲線落在Pi構成的凸包之中,如圖3.1.9所示。(4)幾何不變性這是指某些幾何特性不隨坐標變換而變化的特性。Bezier曲線位置與形狀與其特征多邊形頂點的位置有關,它不依賴坐標系的選擇。(5)變差縮減性若Bezier曲線的特征多邊形是一個平面圖形,則平面內(nèi)任意直線與C(t)的交點個數(shù)不多于該直線與其特征多邊形的交點個數(shù),這一性質(zhì)叫變差縮減性質(zhì)。此性質(zhì)反映了Bezier曲線比其特征多邊形的波動還小,也就是說Bezier曲線比特征多邊形的折線更光順。三、現(xiàn)以三次Bezier曲線為例介紹其計算原理對于三次Bezie
5、r曲線,n=3,有4個控制點p0、p1、p2 、p3 ,則:其中為三次Bezier曲線的調(diào)和函數(shù)。上式的矩陣表示為:現(xiàn)舉例說明使用Bezier方法構造曲線,并對曲線上的相關數(shù)據(jù)進行計算的過程。設給定特征多邊形的4個頂點p0(0,0,0)、 p1(1,1,0) 、p2 (2,1,0) 、p3 (3,0,0) ,試構造一條三次Bezier曲線,并計算參數(shù)時曲線上的值。由上兩式可以得到,三次Bezier曲線的參數(shù)方程為即將 t=0,1/3,1/2,2/3,1 參數(shù)分別代入上式,有:四、Bezier曲線繪制的程序設計1、程序設計功能說明在vc+6.0程序運行的主界面通過菜單及下拉菜單的各功能項選擇Be
6、zier曲線的繪制方法2.程序設計步驟(1)創(chuàng)建工程名稱為“bzier曲線”的單文檔應用程序框架(如圖1)。圖1(2)編輯菜單資源。設計如(圖2)所示的菜單欄。制作對話框及添加相關函數(shù)、程序。如(圖3)圖2圖3(3)添加消息處理函數(shù)。利用ClassWizard為應用程序添加與菜單項相關的消息處理函數(shù),ClassWizard會自動完成有關的函數(shù)聲明。如(圖4)。點擊Add Function,完成添加。圖4(4)添加函數(shù)。在工程中添加應用函數(shù)的方法如下:首先在BezierView.h中聲明需要使用的函數(shù)名稱,然后在BezierView.cpp中定義此函數(shù)。同時實現(xiàn)各個菜單消息處理函數(shù)的既定功能。點
7、擊圖3中的Edit Code選項,進入(圖5)。圖5(5)繪制曲線的代碼為:/ 交互技術View.cpp : implementation of the CMyView class/#include "stdafx.h"#include "交互技術.h"#include "MessageDlg.h"#include "PointDlg.h"#include "交互技術Doc.h"#include "交互技術View.h"#ifdef _DEBUG#define new DEB
8、UG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CMyViewIMPLEMENT_DYNCREATE(CMyView, CView)BEGIN_MESSAGE_MAP(CMyView, CView)/AFX_MSG_MAP(CMyView)ON_COMMAND(ID_DRAW_LINE, OnDrawLine)ON_COMMAND(ID_DRAW_TEXT, OnDrawText)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_COMMAND(ID_DRAW
9、_RECT, OnDrawRect)ON_WM_CREATE()ON_COMMAND(ID_DRAW_BEZIER, OnDrawBezier)/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CMyView constru
10、ction/destructionCMyView:CMyView()/m_dot_number=0; m_draw=false; m_bdoing=false; m_nwidth=1; m_color=RGB(0,0,255); m_pmdc = new CDC; m_pbmp = new CBitmap;CMyView:CMyView()delete m_pmdc; delete m_pbmp;BOOL CMyView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by
11、modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CMyView drawingvoid CMyView:OnDraw(CDC* pDC)CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CBitmap* poldbmp=m_pmdc->SelectObject(m_pbmp);pDC->BitBlt(0,0,m_nmx,m_nmy,m_pmdc,0,0,SRCCOPY);pDC->SelectObject(poldbmp);/ CMyView pri
12、ntingBOOL CMyView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CMyView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CMyView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add clean
13、up after printing/ CMyView diagnostics#ifdef _DEBUGvoid CMyView:AssertValid() constCView:AssertValid();void CMyView:Dump(CDumpContext& dc) constCView:Dump(dc);CMyDoc* CMyView:GetDocument() / non-debug version is inlineASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc);return (CMyDoc*)m_pDocum
14、ent;#endif /_DEBUG/ CMyView message handlersvoid CMyView:OnDrawLine() m_type=1;void CMyView:OnDrawRect() m_type=2;void CMyView:OnDrawText() m_type=3;CDC*pDC=GetDC();CMessageDlg dlg(this);int TextLong;if(dlg.DoModal()=IDOK)str=dlg.m_Text;/得到標注的文字信息TextLong=str.GetLength();/標注文字的長度if(TextLong>0)pDC
15、->TextOut(dot_begin.x,dot_begin.y,str);else pDC->TextOut(dot_begin.x,dot_begin.y,"請輸入文本");ReleaseDC(pDC);void CMyView:OnLButtonDown(UINT nFlags, CPoint point) /SetCapture();/獲取設備環(huán)境CDC* pDC = GetDC() ;/將庫存GDI對象選進設備環(huán)境pDC->SelectStockObject(NULL_BRUSH) ;m_draw=true;/開始繪圖switch(m_type
16、)/根據(jù)圖形類型確定點坐標值case 1:dot_begin=point;/確定直線的始末端點值dot_end=point; break;case 2:if(m_bdoing)/判斷是否處于繪圖狀態(tài)return; m_bdoing=true; SetCapture();/捕獲鼠標輸入 m_pnew=point;/作為獲得繪制矩形,圓角矩形,橢圓各函數(shù)中參數(shù)左上角點,和繪制直線的起始點值。 m_pold=point;/作為獲得繪制矩形,圓角矩形,橢圓各函數(shù)中參數(shù)右下角點,和繪制直線的結束點值。CBitmap* poldbmp;CPen pen; pen.CreatePen(PS_SOLID,m_
17、nwidth,m_color); CPen* poldpen=m_pmdc->SelectObject(&pen);poldbmp=m_pmdc->SelectObject(m_pbmp);m_pmdc->SelectObject(poldpen); m_pmdc->SelectObject(poldbmp);break; case 3:dot_begin=point;break; default:break;ReleaseDC(pDC) ;CView:OnLButtonDown(nFlags, point);void CMyView:OnLButtonUp(U
18、INT nFlags, CPoint point) m_draw=false;CDC* pDC = GetDC() ;/獲取設備環(huán)境CBitmap* poldbmp=m_pmdc->SelectObject(m_pbmp);CPen pen;pen.CreatePen(PS_SOLID,m_nwidth,m_color);CPen* poldpen=m_pmdc->SelectObject(&pen);/將庫存GDI對象選進設備環(huán)境pDC->SelectStockObject(NULL_BRUSH) ;switch(m_type)case 1:dot_end=poin
19、t;pDC->MoveTo(dot_begin.x,dot_begin.y);pDC->LineTo(dot_end.x,dot_end.y);break; case 2: if(m_bdoing) m_bdoing=false;CRect rect(m_pnew,m_pold);m_pmdc->Rectangle(rect);Invalidate(false);/使窗口無效,觸發(fā)OnDraw()函數(shù),把整個內(nèi)存區(qū)域圖形顯示到屏幕上m_pmdc->SelectObject(poldbmp);m_pmdc->SelectObject(poldpen); break;
20、default:break;ReleaseCapture();/釋放鼠標捕獲void CMyView:OnMouseMove(UINT nFlags, CPoint point) CDC* pDC = GetDC() ;CBitmap* poldbmp=m_pmdc->SelectObject(m_pbmp);CPen pen;pen.CreatePen(PS_SOLID,m_nwidth,m_color);CPen* poldpen=pDC->SelectObject(&pen);/設置繪圖模式,并將先前的繪圖模式加以保存CPoint pre_dot, cur_dot ;
21、CStatusBar* pStatus=(CStatusBar*)AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);if(pStatus)char tbuf40;sprintf(tbuf,"(%8d,%8d)",point.x, point.y);/在狀態(tài)條的第二個窗格中輸出當前鼠標的位置pStatus->SetPaneText(1,tbuf); switch(m_type)case 1:if(m_draw)int nDrawmode = pDC->SetROP2(R2_
22、NOT) ;/將庫存GDI對象選進設備環(huán)境pDC->SelectStockObject(NULL_BRUSH) ;pre_dot = dot_end ; cur_dot = point ;/繪制直線pDC->MoveTo(dot_begin.x,dot_begin.y); pDC->LineTo(pre_dot.x,pre_dot.y);pDC->MoveTo(dot_begin.x,dot_begin.y); pDC->LineTo(cur_dot.x,cur_dot.y);dot_end=point;pDC->SetROP2(nDrawmode) ;br
23、eak; case 2:if (m_bdoing)CRect rectold(m_pold,m_pnew);/鼠標移動前的矩形區(qū)域 rectold.NormalizeRect();/使矩形規(guī)格化,不計矩形頂點的相對位置rectold.InflateRect(m_nwidth,m_nwidth);/使原矩形的寬、高分別擴展m_nwidth,m_nwidth個像素pDC->BitBlt(rectold.left,rectold.top,rectold.Width(),rectold.Height(),m_pmdc,rectold.left,rectold.top,SRCCOPY);/把內(nèi)存相
24、對區(qū)域顯示到相對區(qū)域的屏幕上CRect rectnew(m_pold,point);pDC->Rectangle(rectnew); break;default:break; m_pmdc->SelectObject(poldbmp);pDC->SelectObject(poldpen);m_pnew=point;/恢復到先前的繪圖模式ReleaseDC(pDC) ;/釋放掉不再使用的DC ;CView:OnMouseMove(nFlags, point);int CMyView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CVie
25、w:OnCreate(lpCreateStruct) = -1)return -1;m_nmx=GetSystemMetrics(SM_CXSCREEN);m_nmy=GetSystemMetrics(SM_CXSCREEN);CDC* pDC=GetDC();m_pmdc->CreateCompatibleDC(pDC);m_pbmp->CreateCompatibleBitmap(pDC,m_nmx,m_nmy);/創(chuàng)建一個尺寸為m_nmx,m_nmy的與顯示設備環(huán)境兼容的位圖 CBitmap* pOldbitmap=m_pmdc->SelectObject(m_pbmp
26、);/把位圖選入當前設備環(huán)境,同時保存原有位圖CBrush brush;brush.CreateStockObject(WHITE_BRUSH);CRect rect(-1,-1,m_nmx,m_nmy);m_pmdc->FillRect(rect,&brush);m_pmdc->SelectObject(pOldbitmap);ReleaseDC(pDC);return 0;double powi(double v,int k) / 計算vk double temp=1.0; if(k=0 | v=0)return 1; / 00=1 else for(int i=1;i
27、<=k;i+) temp=temp*v; return temp; long fac(int m) /計算m! int i; long temp=1; if(m=0)return 1; / 0!=1 else for(i=2;i<=m;i+) temp=temp*i; return temp; void bezier(CDC *pDC,int px,int py,int n) int x,y,i,j,k=100; double t,t1,u,v; double temp,temp1,temp2,bi; / CDC *pDC=GetDC(); t=1.0/k; pDC->MoveTo(px0,py0); for(j=1;j<k;j+) t1=j*t;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 焦作大學《數(shù)據(jù)挖掘概論》2023-2024學年第二學期期末試卷
- 濟南職業(yè)學院《醫(yī)療器械生物相容性評價》2023-2024學年第二學期期末試卷
- 張家口學院《汽車故障診斷與維修》2023-2024學年第二學期期末試卷
- 山東經(jīng)貿(mào)職業(yè)學院《儀器分析實驗》2023-2024學年第二學期期末試卷
- 對外經(jīng)濟貿(mào)易大學《能源化學與化工》2023-2024學年第二學期期末試卷
- 大學生就業(yè)安全教育
- 濟寧職業(yè)技術學院《行政法(上)》2023-2024學年第二學期期末試卷
- 山東旅游職業(yè)學院《中國古代文學四》2023-2024學年第二學期期末試卷
- 浙江師范大學《會計信息系統(tǒng)》2023-2024學年第二學期期末試卷
- 廈門大學《GMDSS綜合業(yè)務》2023-2024學年第二學期期末試卷
- 監(jiān)控工程驗收單-范本模板
- 浙江開放大學2024年《法律文化》形考作業(yè)1-4答案
- 政治審查表(模板)
- T∕CACM 1107-2018 中醫(yī)治未病實踐指南 亞健康中醫(yī)干預
- 數(shù)字貿(mào)易學 課件 第20、21章 數(shù)字絲綢之路與數(shù)字基礎設施、數(shù)字自由貿(mào)易與數(shù)字貿(mào)易壁壘
- 地理畢業(yè)生實習報告5000字范本2篇
- (完整版)鋁合金門窗施工合同范本
- 新生兒音樂療法課件
- 2023年心理健康知識競賽題庫100題(含答案)
- 2024年國家電投集團海南分公司招聘筆試參考題庫含答案解析
- 【中醫(yī)課件】經(jīng)絡學說
評論
0/150
提交評論