




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、河北工程大学研究生课程论文报告课程名称:水利机械计算机辅助设计 课程编号: SZ0104F05 课程类型: 非学位课 考核方式: 考试 学科专业: 水利工程 年 级: 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基函数:我们规定 二、Bezier曲线的性质(1)端点性质a)曲线端点位置矢量 由Bernstein基函数的端点性质可以推得,当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阶导函数的差分表示 n次Bezier曲线的k阶导数可用差分公式为: 其中高阶向前差分矢量由低阶向前差分矢量递推地定义:(2)对称性由控制顶点构造出的新Bezier曲线,与原Bezier曲线形状相同,走向相反。因为: 这个性质说明Bezier曲线在起点处有什么几何性质,在终点处也有相同的性质。(3)凸包性由于,且,这一结果说明当t在0,1区间变化时,对某一个t值,P(t)是特征多边形各顶点的加权平均,权因子依次
4、是。在几何图形上,意味着Bezier曲线P(t)在 中各点是控制点Pi的凸线性组合,即曲线落在Pi构成的凸包之中,如图3.1.9所示。(4)几何不变性这是指某些几何特性不随坐标变换而变化的特性。Bezier曲线位置与形状与其特征多边形顶点的位置有关,它不依赖坐标系的选择。(5)变差缩减性若Bezier曲线的特征多边形是一个平面图形,则平面内任意直线与C(t)的交点个数不多于该直线与其特征多边形的交点个数,这一性质叫变差缩减性质。此性质反映了Bezier曲线比其特征多边形的波动还小,也就是说Bezier曲线比特征多边形的折线更光顺。三、现以三次Bezier曲线为例介绍其计算原理对于三次Bezie
5、r曲线,n=3,有4个控制点p0、p1、p2 、p3 ,则:其中为三次Bezier曲线的调和函数。上式的矩阵表示为:现举例说明使用Bezier方法构造曲线,并对曲线上的相关数据进行计算的过程。设给定特征多边形的4个顶点p0(0,0,0)、 p1(1,1,0) 、p2 (2,1,0) 、p3 (3,0,0) ,试构造一条三次Bezier曲线,并计算参数时曲线上的值。由上两式可以得到,三次Bezier曲线的参数方程为即将 t=0,1/3,1/2,2/3,1 参数分别代入上式,有:四、Bezier曲线绘制的程序设计1、程序设计功能说明在vc+6.0程序运行的主界面通过菜单及下拉菜单的各功能项选择Be
6、zier曲线的绘制方法2.程序设计步骤(1)创建工程名称为“bzier曲线”的单文档应用程序框架(如图1)。图1(2)编辑菜单资源。设计如(图2)所示的菜单栏。制作对话框及添加相关函数、程序。如(图3)图2图3(3)添加消息处理函数。利用ClassWizard为应用程序添加与菜单项相关的消息处理函数,ClassWizard会自动完成有关的函数声明。如(图4)。点击Add Function,完成添加。图4(4)添加函数。在工程中添加应用函数的方法如下:首先在BezierView.h中声明需要使用的函数名称,然后在BezierView.cpp中定义此函数。同时实现各个菜单消息处理函数的既定功能。点
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();/获取设备环境CDC* pDC = GetDC() ;/将库存GDI对象选进设备环境pDC->SelectStockObject(NULL_BRUSH) ;m_draw=true;/开始绘图switch(m_type
16、)/根据图形类型确定点坐标值case 1:dot_begin=point;/确定直线的始末端点值dot_end=point; break;case 2:if(m_bdoing)/判断是否处于绘图状态return; m_bdoing=true; SetCapture();/捕获鼠标输入 m_pnew=point;/作为获得绘制矩形,圆角矩形,椭圆各函数中参数左上角点,和绘制直线的起始点值。 m_pold=point;/作为获得绘制矩形,圆角矩形,椭圆各函数中参数右下角点,和绘制直线的结束点值。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() ;/获取设备环境CBitmap* poldbmp=m_pmdc->SelectObject(m_pbmp);CPen pen;pen.CreatePen(PS_SOLID,m_nwidth,m_color);CPen* poldpen=m_pmdc->SelectObject(&pen);/将库存GDI对象选进设备环境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);/使窗口无效,触发OnDraw()函数,把整个内存区域图形显示到屏幕上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);/在状态条的第二个窗格中输出当前鼠标的位置pStatus->SetPaneText(1,tbuf); switch(m_type)case 1:if(m_draw)int nDrawmode = pDC->SetROP2(R2_
22、NOT) ;/将库存GDI对象选进设备环境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);/鼠标移动前的矩形区域 rectold.NormalizeRect();/使矩形规格化,不计矩形顶点的相对位置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);/把内存相
24、对区域显示到相对区域的屏幕上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);/创建一个尺寸为m_nmx,m_nmy的与显示设备环境兼容的位图 CBitmap* pOldbitmap=m_pmdc->SelectObject(m_pbmp
26、);/把位图选入当前设备环境,同时保存原有位图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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医院规范用工合同范本
- 与物业签订广告合同范本
- 浠水购房合同范本
- 银行居间付款合同范本
- 修建乡村公路合同范本
- 医院日常装饰维修合同范本
- 协调服务合同范本
- 公房买给个人合同范本
- 上海吊车租用合同范本
- 北京绿化合同范本
- 2024年江苏农牧科技职业学院单招职业适应性测试题库及参考答案
- 患者转运意外应急预案
- 大学生国防教育教案第四章现代战争
- 人教版初中化学实验目录(总表)
- AS9100航空航天质量管理体系-要求培训教材
- 第2课+古代希腊罗马【中职专用】《世界历史》(高教版2023基础模块)
- Q-GDW 11711-2017 电网运行风险预警管控工作规范
- 《桃树下的小白兔》课件
- 电工仪表与测量(第六版)中职技工电工类专业全套教学课件
- 强调句(完整版)-高三英语市公开课一等奖省赛课获奖课件
- 2022年4月自考00277行政管理学试题及答案含解析
评论
0/150
提交评论