用MFC绘制各种数学图形,如sin,cos等

合集下载

MFC图形设计

MFC图形设计

例如,若将映射模式设置为MM_LOMETRIC,那么不管在什么设备中调用上述语句,都将显示出20毫米×20毫米的方块。

需要说明的是,在MM_ISOTROPIC模式下,纵横比总是1:1,换句话说,无论比例因子如何变化,圆是圆的;但在MM_ANISOTROPIC映射模式下,x和y的比例因子可以独立地变化,即圆可以被拉扁成椭圆形状。

PDC->Rectangle(CRect(0,0,200,200)); 在某设备环境中绘制出一个高为200个像素,宽为200个像素的方块。

在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,常常可以调用CDC::SetWindowExt (设置窗口大小)和CDE::SetViewportExt(设置视口大小)函数来设置所需要的比例因子。

x比例因子=视口x大小/窗口x的大小y比例因子=视口y大小/窗口y的大小CPoint(点)、CSize(大小)和CRect(矩形)是对Windows的POINT、SIZE和RECT结构的封装,因此它们可以直接使用各自结构的数据成员,如下所示:typedef struct tagPOINT{LONG x; //点的x坐标LONG y; //点的y坐标} POINT;typedef struct tagSIZE {int cx;; //水平大小int cy; //垂直大小} SIZE;typedef struct tagRECT{LONG left; //矩形左上角点的x坐标LONG top; //矩形左上角点的y坐标LONG right; //矩形右下角点的x坐标LONG bottom; //矩形右下角点的y坐标} RECT;1. CPoint、CSize和CRect的构造函数CPoint类带参数的常用构造函数原型如下:CPoint(int initX,int initY);CPoint(POINT initSize);其中,initX和initY分别用来指定CPoint的成员的x和y的值。

MFC基本绘图函数使用方法

MFC基本绘图函数使用方法
计算机图形学
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数 绘制图形如下所示,坐标(100, 150)表示距离左边100,距离顶部 150。
计算机图形学
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数 注意:绘制图形主要调用CDC* pDC方法实现,MFC可以补充 提示函数。
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数
(1)绘制直线
计算机图形学
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数
void CTest01View::OnDraw(CDC* pDC) {
CTest01Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->MoveTo(100,150); pDC->LineTo(300,400); // TODO: add draw code for native data here }
MFC绘图工具类包括CGdiObject、CBitmap、CBrush、 CFont、CPallette、CPen和CRgn等。常用的包括:
(4) CPen:封装了GDI画笔,选作设备上下文的当前画笔, 画笔用于绘制图形边界线;
(5) CPallette:封装了GDI调色板,提供应用程序和显示器 之间的颜色接口;
计算机图形学
一.MFC基本绘图函数使用方法
一. MFC绘图基础知识 CDC类
CDC类派生出CClientDC类、CMetaFileDC类、 CPaintDC类和CWindowDC类。

用MFC绘制各种数学图形,如sin,cos等

用MFC绘制各种数学图形,如sin,cos等

**理工大学C++面向对象课程设计报告院(系):计算机工程学院专业:计算机科学与技术学生姓名:__**班级计算111 学号: 2011070** 题目:设计绘制各种数学图形程序_起迄日期:_2013.6.23~2013.7.5 设计地点:计算机学院机房指导教师: *** 完成日期: 2013 年7月 5 日目录一、需求分析1.选做此课题的目的 (3)2.程序所实现的功能 (3)二、设计内容1.模块图 (3)2.主程序及其主要模块的流程图 (3)3.类图 (4)3.1表达式 (4)3.2 储存运算符的栈 (5)3.3储存运算数的栈 (5)3.4 圆 (5)3.5 椭圆 (6)3.6 三叶玫瑰线 (6)3.7 四叶玫瑰线 (7)3.8 阿基米德螺线 (7)3.9 心形线 (7)4.函数关系图 (8)5.编写程序代码 (9)三、调试分析1.实际完成的情况说明 (12)2.程序的性能分析 (12)3.上机过程中出现的问题及其解决方案 (12)4.程序中可以改进的地方说明 (13)四、用户手册 (13)五、设计总结 (15)六、参考文献 (15)七、附录 (15)一、需求分析1.选作此课题的目的在日常生活中我们常常需要解决一些复杂的数学问题,而这些数学问题的解答往往可以从它的函数图形上很直观、明了的表现出来,这时快捷方便的绘制出该数学函数的图形就显得尤为重要。

所以我们使用Microsoft 提供的MFC 类库来实现数学函数图形的绘制。

2 .程序所实现的功能本程序支持用户输入一般表达式,然后输出其对应的函数图形,例如:一次(二次……)函数,三角函数,双曲余弦,双曲正弦,双曲正切,幂函数,指数函数(以10为底,以e 为底)。

另外,还支持一些供选择的数学图形,例如:圆,椭圆,三叶玫瑰线,四叶玫瑰线,阿基米德螺线,心形线。

二、设计内容1.模块图2. 主程序及主要模块的流程图表达式特殊数学图形圆 主界面椭圆 三叶玫瑰线 阿基米德螺线四叶玫瑰线心形线开始选择图形类型No确定Yes输入表达式或参数图形结束3.类图3.1 表达式CGraphDlgpublic:double Pow(double ,double ); //幂函数求值double Operate(double ,char ,double ); //表达式求值char Precede(char ,char); //判断操作符优先级int In(char ); //判断运算数和运算符void Coordinate(); //求点的集合double Calculate(CString ,double);CGraphDlg(CWnd* pParent = NULL);enum { IDD = IDD_GRAPH_DIALOG };protected:Virtual void DoDataExchange(CDataExchange* pDX); private:ICON m_hIcon;UINT m_num; //点的数量char *m_stop;CPtrArray m_ptrarray; //点的集合变量CComboBox m_type; //图形类型CString m_expression; //表达式3.2存储运算符的栈OPTRpublic:OPTR(); //缺省构造函数int InitOPTR(); //构造一个空栈char GetTop(); //返回栈顶元素int Push(char e); //进栈char Pop(); //出栈virtual ~OPTR(); //析构函数Public:char *base; //栈底指针char *top; //栈顶指针int size; //当前已分配的存储空间3.3存储运算数的栈OPNDpublic:OPND(); //缺省构造函数int InitOPND(); //构造一个空栈double GetTop(); //返回栈顶元素int Push(double e); //进栈double Pop(); //出栈virtual ~OPND(); //析构函数Public:double *base; //栈底指针double *top; //栈顶指针int size; //当前已分配的存储空间3.4 圆circlepublic:afx_msg void OnChangeEdit1();afx_msg void OnChangeEdit2();afx_msg void OnChangeEdit3();afx_msg void OnButton1();circle(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG1 };Public:double m_x; //圆心横坐标double m_y; //圆心纵坐标double m_r; //半径3.5椭圆ellipsepublic:afx_msg void OnChangeEdit1();afx_msg void OnChangeEdit2();afx_msg void OnChangeEdit3();afx_msg void OnChangeEdit4();afx_msg void OnButton1();ellipse(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG2 };Public:double m_x; //椭圆中心横坐标double m_y; //椭圆中心纵坐标double m_lr; //长轴double m_sr; //短轴3.6 三叶玫瑰线sanyiepublic:afx_msg void OnChangeEdit1();afx_msg void OnChangeEdit2();afx_msg void OnButton1();sanyie(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG3 };Public:double m_a; //系数adouble m_b; //角度θ3.7 四叶玫瑰线3.8 阿基米德螺线3.9 心形线siyepublic:afx_msg void OnChangeEdit1();afx_msg void OnChangeEdit2();afx_msg void OnButton1();siye(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG4 }; Public:double m_a; //系数adouble m_b; //角度θajimide public:afx_msg void OnChangeEdit1();afx_msg void OnButton1();ajimide(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG5 }; Public:double m_a; //系数adouble m_b; //角度θxinxingxian public:afx_msg void OnChangeEdit1();afx_msg void OnButton1();xinxingxian(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG6 }; Public:double m_a; //系数a4.函数关系图CGraphDlg::OnButton1() 类circle类ellipse类sanyie类siye 类ajimide类xinxingxianCGraphDlg::OnDrawing()circle::OnButton1()siye::OnButton1()ellipse::OnButton1()sanyie::OnButton1()ajimide::OnButton1()xinxingxian::OnButton1()CGraphDlg::Coordinate()CGraphDlg::Calculate(CString m_expression,double x)OPTR::Push(char ) CGraphDlg::Precede(char s,char c)CGraphDlg::In(char ch)OPND::GetTop()OPND::Pop()OPTR::GetTop()OPND::Push(double e)OPTR::InitOPTR() OPND::InitOPND()OPTR::GetTop()(箭头代表调用)CGraphDlg::Operate(double,char,double )CGraphDlg::Pow(double, double )5. 编写程序代码1.画坐标轴CClientDC dc(this);CRect rect;GetClientRect(&rect) ;dc.SetMapMode(MM_LOMETRIC) ; //设置映射模式;dc.SetWindowOrg(0,0) ; //设置屏幕窗口原点;dc.SetViewportOrg(CPoint(rect.right/2,rect.bottom/2)) ; //设置视口原点CPen pen1(PS_DOT,1,RGB(100,100,100)); //创建笔,并调整坐标颜色CPen *pOldPen = dc.SelectObject(&pen1); //更改笔并保存旧的笔for(int i=-900;i<=900;i+=50){dc.MoveTo (i,500);dc.LineTo (i,-500);}for(int j=-500;j<=500;j+=50){dc.MoveTo (-900,j);dc.LineTo (900,j);}dc.TextOut (10,500,'y'); //标记y轴dc.TextOut (870,0,'x'); //标记x轴dc.TextOut (0,0,'0'); //标记坐标原点dc.TextOut (-8,510,'^');dc.TextOut (900,25,'>');CPen pen(PS_SOLID,1,RGB(0,0,0));//创建笔,并调整坐标颜色pOldPen = dc.SelectObject(&pen);//更改笔并保存旧的笔dc.MoveTo (-900,0); //横坐标dc.LineTo (900,0);dc.MoveTo (0,-500); //纵坐标dc.LineTo (0,500);}2.选择图形类型//默认是表达式RedrawWindow();m_expression="";UpdateData(FALSE);CString text;m_type.GetWindowText(text);if(text=="圆"){circle d_circle;d_circle.DoModal(); //显示画圆的对话框}else if(text=="椭圆"){ellipse d_ellipse;d_ellipse.DoModal(); //显示画椭圆的对话框}else if(text=="三叶玫瑰线"){sanyie d_sanyie;d_sanyie.DoModal(); //显示画三叶玫瑰线的对话框}else if(text=="四叶玫瑰线"){siye d_siye;d_siye.DoModal(); //显示画四叶玫瑰线的对话框}else if(text=="阿基米德螺线"){ajimide d_ajimide;d_ajimide.DoModal(); //显示画阿基米德螺线的对话框}else if(text=="心形线"){xinxingxian d_xinxingxian;d_xinxingxian.DoModal(); //显示画心形线的对话框}3.根据表达式画出图形for(m_num-=1;m_num>0;m_num--) //从点集合中依次取出点并且相连{dc.MoveTo (((CPoint *)m_ptrarray.GetAt(m_num))->x,((CPoint *)m_ptrarray.GetAt(m_num))->y);dc.LineTo (((CPoint *)m_ptrarray.GetAt(m_num-1))->x,((CPoint *)m_ptrarray.GetAt(m_num-1))->y);}4. 画圆dc.Ellipse((m_x-m_r)*50,(m_y+m_r)*50,(m_x+m_r)*50,(m_y-m_r)*50); //调用Ellipse函数5. 画椭圆dc.Ellipse((m_x-m_lr)*50,(m_y+m_sr)*50,(m_x+m_lr)*50,(m_y-m_sr)*50);//调用Ellipse函数6. 画三叶玫瑰线double x=0,y=0;dc.MoveTo (0,0); //从原点开始画for(double p=-3.14;p<=3.14;p+=0.01) //计算点的同时画线{x=m_a*cos(3*(m_b+p))*cos(p);y=m_a*cos(3*(m_b+p))*sin(p);dc.LineTo(50*x,50*y);dc.MoveTo(50*x,50*y);dc.SelectObject(&pen);}7. 画四叶玫瑰线double x=0,y=0;dc.MoveTo (0,0); //从原点开始画for(double p=-3.14;p<=3.14;p+=0.01) //计算点的同时画线{x=m_a*sin(2*(m_b+p))*cos(p);y=m_a*sin(2*(m_b+p))*sin(p);dc.LineTo(50*x,50*y);dc.MoveTo(50*x,50*y);dc.SelectObject(&pen);}8. 画阿基米德螺线double p=-10;double x=0,y=0;x=m_a*p*cos(p);y=m_a*p*sin(p);dc.MoveTo (x*20,20*y);for( p=-10;p<=10;p+=0.01) //计算点的同时画线{x=m_a*p*cos(p);y=m_a*p*sin(p);dc.LineTo(20*x,20*y);dc.MoveTo(20*x,20*y);dc.SelectObject(&pen);}9. 画心形线double x=0,y=0;dc.MoveTo (0,0); //从原点开始画for(double p=-3.14;p<=3.14;p+=0.01) //计算点的同时画线{x=m_a*(1-cos(p))*cos(p);y=m_a*(1-cos(p))*sin(p);dc.LineTo(50*x,50*y);dc.MoveTo(50*x,50*y);dc.SelectObject(&pen);}三、调试分析1.实际完成的情况说明(完成的功能、支持的数据类型等)本程序支持用户选择数学图形类型并输入相应的参数,然后输出其对应的函数图形。

MFC课程设计 绘制曲线

MFC课程设计 绘制曲线

《MFC编程及应用》课程设计报告题目:绘制曲线学号:姓名:指导老师:***时间: 2013.61、设计步骤(1)工程建立建立一个单文档应用程序,命名为简单绘图,在绘制曲线的题目要求上有所扩展,除了绘制二次函数,正弦曲线,余弦曲线,还添加了直线,矩形,椭圆,圆的菜单项,另外有颜色对话框和线型对话框,用于改变颜色,线型和线宽。

响应鼠标右键消息绘制坐标轴。

(2)类中添加的变量a)CCosDialog类:编辑框视图类int m_acos acint m_bcos bcint m_ccos cc(m_acos不是必要的,用作余弦函数的系数,类型都为int形,将变量类型设为double形更好,但并无影响)。

b)CSinDialog类视图类int m_asin asint m_bsin bsint m_csin csc)CFunction类m_afunction am_bfunction bm_cfunction cd)在CLinedialog中定义了编辑框整型变量m_nlinewidth以及单选按钮变量m_nlinestyle,在视图类中分别用m_nLineWidth和m_nLineStyle接收。

e)在视图类中定义m_nDrawType,直线、矩形、椭圆、圆是分别赋值1、2、3、4,然后在鼠标消息中用switch语句分别响应。

(3)设计思想及需处理的消息的详细代码a)首先绘制坐标轴;void CMy***********View::OnRButtonDown(UINT nFlags, CPoint point){ CRect rc ;GetClientRect(&rc) ;// 获取窗口客户区的坐标CClientDC dc(this);dc.MoveTo(rc.right/4,rc.bottom/2) ;dc.LineTo(rc.right*3/4,rc.bottom/2) ;dc.MoveTo(rc.right/2,rc.bottom*2/3) ;dc.LineTo(rc.right/2,rc.bottom/3) ;//Crect类的两个数据成员,right、bottom指矩形区域右下角的横纵坐标}b)设计对话框IDD_COS,并用CCosDialog类管理,然后在菜单项下用OnCos() 函数响应;void CMy***********View::OnCos(){ CcosDialog dlg;if(dlg.DoModal()==IDOK){ this->ac=dlg.m_acos;this->bc=dlg.m_bcos;this->cc=dlg.m_ccos;CClientDC dc(this);CRect rect;this->GetClientRect (&rect);dc.SetViewportOrg (rect.CenterPoint ());/* CRect类的成员函数CenterPoint (),返回返回矩形区域中心的坐标 */CPen pen(m_nLineStyle,m_nLineWidth,m_clr);dc.SelectObject(&pen);dc.MoveTo(0,-50*ac*cos(cc));for(double x = 0,y;x <300;x+=1){ y = -50*ac*cos(bc*x/30+cc);dc.LineTo (x,y);Sleep(10);}画二次函数和正弦函数的思想与此类似,可以举一反三。

用C++实现数学函数图形绘制

用C++实现数学函数图形绘制
【Key words】
Mathematic functions drawingfigures template array tripline
信息与计算科学 99-1
毕业论文
第 2页
用 VC++实现数学函数图形绘制
目录
用 VC++实现数学函数图形绘制........................................................................ 1
参考文献.................................................................................................................................. 18
附录...............................................................................................................................................20
随着软件工程技术的不断发展,应用面向对象的编程技术已经成为当今软件 开发的重要手段之一,尤其是 VC++的出现,大大推进了面向对象与可视化编程 技 模板数组 三次样条
信息与计算科学 99-1
毕业论文
第 1页
用 VC++实现数学函数图形绘制
【Abstract】
Visual C++ is one of the object oriented and visual software developer ,which is more mature than others . MFC is a class warehouse which is supplied by Microsoft ,and it contains a great deal of defined classes .we can transfer the corresponded class if necessary ,or give a fresh definition according our needs . Exactly based on MFC this kind of character, we try to design out the function mold which have the function to pack the class and be independent ------Mold for creating Function data, Mold for outputting the function curve, mold piece of born mold piece be sent by Cpoint Array rared by template CArray.The first mold is to make out sets for the function and get data we need which will be sent to the defined array,so now the array have the data that is to be got by the second mold.From whole project,we can see the independence of each mold,and exactly we may increase and decrease functions if necessary,we even can use different DC and GDI to realize the customed exportation method by which we can have a new view of the function curve. So, the function of the project can be extended freely.after repeatedly debugging and examining,we achieve our purpose.The most important thing we are trying is to find a way to connect the VC++ and the figures of mathmetic functions.This is not only a exploration to VC++,but also a attempt for realizing diversifing the mathmetic functions.

第九章 使用MFC实现真实感图形绘制

第九章 使用MFC实现真实感图形绘制
第二步,将三维几何描述转换为二维投影图。这可以通过对场景的投影变 换来完成。
第三步,确定场景中的所有可见面,这需要使用隐藏面消除算法将被其他 物体遮挡的不可见面消去。
第四步,计算场景中可见面的颜色,严格地说,就是根据基于光学物理的 光照明模型计算可见面投射到观察者眼中的光亮度大小和色彩分量,并将它转 换成适合图形设备的颜色值,从而确定投影画面上每一象素的颜色,最终生成 图形。
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,通力根1保过据护管生高线产中敷工资设艺料技高试术中卷0资不配料仅置试可技卷以术要解是求决指,吊机对顶组电层在气配进设置行备不继进规电行范保空高护载中高与资中带料资负试料荷卷试下问卷高题总中2体2资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况1卷中下安,与全要过,加度并强工且看作尽护下可1都关能可于地以管缩正路小常高故工中障作资高;料中对试资于卷料继连试电接卷保管破护口坏进处范行理围整高,核中或对资者定料对值试某,卷些审弯异核扁常与度高校固中对定资图盒料纸位试,置卷编.工保写况护复进层杂行防设自腐备动跨与处接装理地置,线高尤弯中其曲资要半料避径试免标卷错高调误等试高,方中要案资求,料技编试术写5、卷交重电保底要气护。设设装管备备置线4高、调动敷中电试作设资气高,技料课中并3术试、件资且中卷管中料拒包试路调试绝含验敷试卷动线方设技作槽案技术,、以术来管及避架系免等统不多启必项动要方高式案中,;资为对料解整试决套卷高启突中动然语过停文程机电中。气高因课中此件资,中料电管试力壁卷高薄电中、气资接设料口备试不进卷严行保等调护问试装题工置,作调合并试理且技利进术用行,管过要线关求敷运电设行力技高保术中护。资装线料置缆试做敷卷到设技准原术确则指灵:导活在。。分对对线于于盒调差处试动,过保当程护不中装同高置电中高压资中回料资路试料交卷试叉技卷时术调,问试应题技采,术用作是金为指属调发隔试电板人机进员一行,变隔需压开要器处在组理事在;前发同掌生一握内线图部槽 纸故内资障,料时强、,电设需回备要路制进须造行同厂外时家部切出电断具源习高高题中中电资资源料料,试试线卷卷缆试切敷验除设报从完告而毕与采,相用要关高进技中行术资检资料查料试和,卷检并主测且要处了保理解护。现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷数,其具体含义将会在介绍 光照模型时说明。

mfc cchartctrl 绘制曲线

mfc cchartctrl 绘制曲线

《深度探析MFC CChartCtrl绘制曲线》1. 引言在软件开发中,数据可视化是一个非常重要的部分,而曲线图作为其中的重要形式之一,为用户提供了直观、易懂的数据展示方式。

而在MFC框架中,CChartCtrl作为数据可视化的控件,具有绘制曲线的功能,本文将围绕这一主题展开深入探讨。

2. 概述MFC CChartCtrlMFC CChartCtrl是MFC库中的一个控件,可以方便地用于绘制曲线图,它提供了丰富的功能和灵活的接口,能够满足不同数据展示需求。

在使用CChartCtrl时,首先需要了解其基本的绘制原理和使用方法。

3. 绘制曲线基本原理在使用MFC CChartCtrl绘制曲线时,首先需要准备好数据源,然后通过CChartCtrl提供的接口将数据源与控件进行绑定,最后进行渲染即可。

在具体的绘制过程中,还可以通过设置不同的属性,如线条颜色、粗细、点的形状等,来实现不同的曲线展示效果。

4. 使用MFC CChartCtrl绘制简单曲线接下来,我们来具体演示如何使用MFC CChartCtrl来绘制一条简单的曲线。

我们准备好曲线的数据源,然后创建一个CChartCtrl控件,并将数据源与控件进行关联,最后进行渲染。

在此过程中,我们还可以设置曲线的样式、颜色等属性,使曲线展示更加美观。

5. MFC CChartCtrl绘制高级曲线除了简单曲线外,MFC CChartCtrl还支持绘制高级曲线,比如带有标识点、双轴曲线等。

在使用CChartCtrl绘制高级曲线时,需要更加灵活地控制数据源和属性设置,以满足复杂曲线展示的需求。

6. 总结与展望通过本文的学习,我们对MFC CChartCtrl绘制曲线的原理、基本用法以及高级应用有了更深入的了解。

未来,在实际开发中,我们可以根据具体的需求,灵活运用CChartCtrl控件,实现更加丰富多样的曲线展示效果。

7. 个人观点与理解作为一名MFC开发工程师,我个人认为MFC CChartCtrl是一个非常强大、实用的控件,它为我们提供了便捷的数据可视化解决方案。

实验四 MFC图形绘制编程实验

实验四 MFC图形绘制编程实验

实验四 MFC图形绘制编程实验一、实验目的(1) 熟悉Visual C++ 6.0开发环境;(2) 掌握MFC消息映射的操作步骤;(2) 掌握MFC图形输出的方法;(3) 理解设备环境、画笔、画刷的概念,掌握常用的绘图函数。

二、实验内容请编写程序,要求如下:(1) 定义一支黄色画笔,绘制一条线段;(1) 定义一支紫色画笔,绘制一条多段线;(3) 定义一支红色画笔,绘制一个正方形,并用适当的画刷填充图形内部;(4) 定义一支绿色画笔,绘制一个圆,并用适当的画刷填充图形内部;(5) 定义一支蓝色画笔,绘制一个正六边形,并用适当的画刷填充图形内部。

三、实验报告1.列出图形绘制程序代码清单:(1)在头文件Demo.h中:#include "afxwin.h"class CDemoWnd:public CFrameWnd{public:CDemoWnd();~CDemoWnd();public:LRESULT OnPaint(WPARAM wParam,LPARAM lParam);DECLARE_MESSAGE_MAP()public:int m_nX0;int m_nY0;int m_nX1;int m_nY1;};class CDemoApp:public CWinApp{public:BOOL InitInstance();};CDemoApp ThisApp;(2)在源文件Demo.cpp中:#include "tpd1.h"CDemoWnd::CDemoWnd(){m_nX0 = 0;m_nY0 = 0;m_nX1 = 0;m_nY1 = 0;}CDemoWnd::~CDemoWnd(){}BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd)ON_MESSAGE(WM_PAINT,OnPaint)END_MESSAGE_MAP()LRESULT CDemoWnd::OnPaint(WPARAM wParam,LPARAM lParam) {CPaintDC dc(this);CPen Pen1,*pOldPen1;Pen1.CreatePen(PS_SOLID,10,RGB(255,255,0));pOldPen1=dc.SelectObject(&Pen1);dc.SelectObject(&Pen1);dc.MoveTo(10,10);dc.LineTo(100,100);CPen Pen2,*pOldPen2;Pen2.CreatePen(PS_SOLID,4,RGB(255,0,255));pOldPen2=dc.SelectObject(&Pen2);dc.SelectObject(&Pen2);POINT pt1[]={{100,10},{10,180},{200,150}};dc.Polyline(pt1,3);CPen Pen3,*pOldPen3;dc.SelectStockObject(BLACK_BRUSH);Pen3.CreatePen(PS_SOLID,4,RGB(255,0,0));pOldPen3=dc.SelectObject(&Pen3);dc.SelectObject(&Pen3);dc.Rectangle(300,50,400,150);CPen Pen4,*pOldPen4;dc.SelectStockObject(GRAY_BRUSH);Pen4.CreatePen(PS_SOLID,4,RGB(0,255,0));pOldPen4=dc.SelectObject(&Pen4);dc.SelectObject(&Pen4);dc.Ellipse(500,200,700,400);CPen Pen5,*pOldPen5;Pen5.CreatePen(PS_SOLID,4,RGB(0,0,255));pOldPen5=dc.SelectObject(&Pen5);dc.SelectStockObject(DKGRAY_BRUSH);dc.SelectObject(&Pen5);POINT pt2[]={{250,250},{400,250},{475,379},{400,509},{250,509},{175,379}};dc.Polygon(pt2,6);return 0;}BOOL CDemoApp::InitInstance(){CDemoWnd *pMainWnd = new CDemoWnd();pMainWnd->Create(NULL,"Demo Mini-MFC");pMainWnd->ShowWindow(m_nCmdShow);pMainWnd->UpdateWindow();m_pMainWnd = pMainWnd;return TRUE;}2、程序运行结果:3、总结在MFC 程序中绘制图形的基本操作步骤:(1)获取图形设备接口。

mfc项目中使用三角函数

mfc项目中使用三角函数

mfc项目中使用三角函数MFC(Microsoft Foundation Classes)是一种基于C++的开发框架,用于开发Windows应用程序。

在MFC项目中,我们经常需要使用三角函数来进行各种数学计算和图形绘制。

三角函数是数学中的重要概念,包括正弦函数、余弦函数和正切函数。

在本文中,我们将介绍在MFC项目中如何使用三角函数,并结合实际案例详细说明其应用。

我们来了解一下三角函数的基本概念。

正弦函数(sine function)是一个周期函数,表示一个角的对边与斜边的比值;余弦函数(cosine function)也是一个周期函数,表示一个角的邻边与斜边的比值;正切函数(tangent function)是一个周期函数,表示一个角的对边与邻边的比值。

在数学中,我们通常用sin、cos和tan 来表示这三个函数。

在MFC项目中,我们经常需要使用三角函数来进行角度转换、图形变换和动画效果等计算。

例如,我们可以使用正弦函数来模拟物体的上下抖动效果,通过改变正弦函数的参数来控制抖动的幅度和频率。

同样地,余弦函数可以用来模拟物体的左右摆动效果,而正切函数则可以用来实现物体沿着曲线运动的效果。

三角函数还可以用来进行图形绘制。

在MFC中,我们可以使用GDI(Graphics Device Interface)来绘制各种图形,包括直线、矩形、圆形等。

而三角函数可以帮助我们计算出图形的坐标点,从而实现各种复杂的图形效果。

例如,我们可以使用正弦函数来绘制波浪线,通过改变正弦函数的参数来控制波浪的振幅和周期。

同样地,余弦函数可以用来绘制螺旋线,而正切函数则可以用来绘制椭圆曲线。

除了图形绘制,三角函数在计算机图形学中还有许多其他应用。

例如,我们可以使用正弦函数来模拟光线的折射和反射效果,通过改变正弦函数的参数来控制折射和反射的角度。

同样地,余弦函数可以用来计算两个向量之间的夹角,而正切函数则可以用来计算两个点之间的斜率。

用C++实现数学函数图形绘制

用C++实现数学函数图形绘制
2.1 总体结构的设计...........................................................................................................5 2.2 基本结构的设计...........................................................................................................6 2.3 面临的问题...................................................................................................................6 2.4 解决问题的方法...........................................................................................................6 三、实现三次样条函数绘图.................................................................................................. 10 3.1 函数定义.....................................................................................................................10 3.2 边界条件.....................................................................................................................10 3.3 函数表达式.................................................................................................................11 3.4 算法.............................................................................................................................12 3.5 程序实现.....................................................................................................................12 3.6 效果.............................................................................................................................14 四、结论...................................................................................................................................16

基于MFC的简单画图程序实验

基于MFC的简单画图程序实验

简单画图程序【实验目的】本实验目的是通过构建基于MFC的windows画图程序,使学生:(1) 理解MFC应用程序的运行机制(2) 掌握使用MFC构建Windows应用程序的基本结构及编程的基本方法(3) 理解和掌握MFC应用程序消息处理机制及应用(4) 掌握类向导(ClassWizard)的使用【实验要求】(1) 必须做好实验原理的预习。

(2) 需要对提供的程序代码进行分析,并明确实验时还应在何处添加哪些语句。

【实验环境】Microsoft Windows XPMicrosoft Visual C++ 6.01 基本功能描述1) 在单文档菜单中,在菜单行中可插入一个菜单项,命名为绘图,在下拉菜单中可分别设置绘制的图形形状,如直线、矩形及椭圆,线宽选项,有1-5可供选择,还可以设置线色以及填充色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择的图形。

2) 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形则绘制完毕。

3) 增添工具栏,设置绘制的图形形状,线色以及填充色,可更方便地选择相应的功能。

2 设计思路1) 对需要用到的变量进行初始化。

2) 选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。

选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。

3) 鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。

4) 选择图形或其它属性,可进行下一次绘制。

图1 程序流程图3 软件设计3.1 设计步骤1)创建单文档创建一个MFC AppWizard[exe]工程,命名为“yinshuyan”,如图2所示,并创建单文档,如图3所示。

基于MFC的三角形面积和周长计算程序

基于MFC的三角形面积和周长计算程序

基于MFC的三角形面积和周长计算程序三角形是几何学中简单的多边形之一,具有三个边和三个角。

计算三角形的面积和周长是几何学中的基本问题之一、在基于MFC的三角形面积和周长计算程序中,我们将使用MFC框架的图形用户界面来实现用户输入三角形的边长,计算三角形的面积和周长,并在界面上显示结果。

首先,我们需要创建一个MFC对话框应用程序项目。

使用Visual Studio创建一个新的MFC对话框应用程序项目,命名为"TriangleCalculator"。

在创建项目的过程中,请确保勾选"基于对话框"选项。

创建项目后,我们需要在对话框中添加一些控件来实现用户输入和显示计算结果。

打开"TriangleCalculatorDlg.h"文件,并在对话框类中添加以下成员变量:```cppclass CTriangleCalculatorDlg : public CDialogEx//...private:double m_sideA;double m_sideB;double m_sideC;double m_area;double m_perimeter;CEdit m_editSideA;CEdit m_editSideB;CEdit m_editSideC;CStatic m_staticArea;CStatic m_staticPerimeter;};```然后打开"TriangleCalculatorDlg.cpp"文件,在OnInitDialog(方法中添加以下代码来初始化控件和变量,并注册控件的相关事件处理函数:```cppBOOL CTriangleCalculatorDlg::OnInitDialogCDialogEx::OnInitDialog(;//...//初始化控件和变量m_editSideA.Attach(GetDlgItem(IDC_EDIT_SIDE_A)->GetSafeHwnd();m_editSideB.Attach(GetDlgItem(IDC_EDIT_SIDE_B)->GetSafeHwnd();m_editSideC.Attach(GetDlgItem(IDC_EDIT_SIDE_C)->GetSafeHwnd();m_staticArea.Attach(GetDlgItem(IDC_STATIC_AREA)->GetSafeHwnd();m_staticPerimeter.Attach(GetDlgItem(IDC_STATIC_PERIMETER)-> GetSafeHwnd();//注册事件处理函数m_editSideA.SetEventMask(ENM_CHANGE);m_editSideA.SetSel(0, -1);m_editSideA.Clear(;m_editSideB.SetEventMask(ENM_CHANGE);m_editSideB.SetSel(0, -1);m_editSideB.Clear(;m_editSideC.SetEventMask(ENM_CHANGE);m_editSideC.SetSel(0, -1);m_editSideC.Clear(;return TRUE;```接下来,我们需要为用户输入的三角形边长添加事件处理函数。

MFC处理绘图

MFC处理绘图

(一)简单的图形输出1 、点: pDC->SetPixel(C point(200,200),RGB(255,0,0,)); // 在 [200 , 200] 的位置画一个红点2 、线: pDC->MoveTo(0,0); // 直线起点的坐标为( 0 , 0 )pDC->LineTo(100,100) // 从起点( 0 , 0 )到终点( 100 , 100 )画一条直线3 、矩形: Crect rect(0,0,100,100);pDC->Rectangle(&rect); // 画一个长 100 ,宽 100 的矩形4 、圆和椭圆:Crect rect(0,0,100,100);pDC->Ellipse(&rect);Crect rect(0,0,50,100);pDC->Ellipse(&rect);5 、多边形:CPoint poly[4];poly[0]=CPoint(0,0);poly[1]=CPoint(50,50);poly[2]=Cpoint(50,100);poly[3]=Cpoint(0,50);pDC->Polygon(poly,4);(二)库存对象库存对象是由操作系统维护的用于绘制屏幕的常用对象,包括库存画笔、画刷、字体等。

使用SelectStockObject() 函数可以直接选择库存对象,修改系统默认值。

例如,在视图中选用画笔和画刷库存对象来画图。

Void Cexam3_3View::OnDraw(CDC*pDC){Cexam3_2Doc*pDoc=GetDocument();CRect rect;Rect.SetRect(Cpoint(0,0),Cpoint(200,200));pDC->SelectStockObject(WHITE_PEN); // 选用白色画笔pDC->SelectStockObject(GRAY_BRUSH);// 选用灰色画刷pDC->Rectangle(rect);pDC->MoveTo(0,0);pDC->LineTo(200,200);pDC->MoveTo(0,200);pDC->LineTo(200,0);}(三)创建和使用自定义画刷和画笔1 、创建 CPen 的的方法:•定义时直接创建Cpen MyPen(PS_SOLID,2,RGB(255,0,0));(2) 定义 Cpen 对象,再调用 CreatePen() 函数Cpen pen;Pen.CreatePen(PS_SOLID,2,RGB(255,0,0));2 、创建画刷的方法:(1)创建实心画刷的 CreateSolidBrush() 函数Cbrush bs;Bs.CreateSolidBrush(RGB(255,0,0));(2)创建带阴影的画刷的 CreateHatchBrush() 函数Bs.CreateHatchBrush(HS_CROSS,RGB(255,0,0));// 创建一个带十字阴影的红色画刷(3)创建位图画刷的 CreatePatternBrush() 函数本函数的应用如下:CbitMap bmp;Bmp.LoadBitMap(IDB_MYBITMAP);Cbrush bs;Bs.CreatePatternBrush(&bmp);例4_3、在视图中绘制三个图形,一个用阴影风格的画刷画的椭圆形,一个用深兰色实心画刷画的圆角矩形,一个用浅灰色画刷画的饼形。

mfc简单绘图程序

mfc简单绘图程序

M F C简单的绘图程序-—王帅目录摘要 (2)关键字 (2)1 引言 (2)设计目的 ............................................................................................................... 错误!未定义书签。

2 功能说明 (2)2。

1菜单栏...................................................................................................... 错误!未定义书签。

2.1.1图形 (3)2.1。

2画笔 (4)2.1.3画硬币 (4)2。

2工具栏 (5)2.3状态栏 (5)3 功能的实现 (5)3。

1 视图设计 (5)3。

2 编辑资源 (6)3.3 编程思路及各个函数的实现 (7)(1)思路 (7)(2)代码的实现 (7)1.为基本形状创建一个基类 (8)2.基本形状类的创建 (8)2.1矩形类的创建及定义 (8)2.2圆形类的创建及定义 (10)2。

3正五边形类的创建及定义 (11)2。

4正三角形类的创建及定义 (14)2。

5椭圆类的创建及定义 (16)2。

6正四边形类的创建及的定义 (17)2.7正六边形类的创建及定义 (18)2。

8直线类的创建及定义 (19)3。

各基本形状类在CMyDraw2_0类中的调用和绘图的实现 (20)3。

1矩形类的调用与与绘图的实现 (20)3.2圆形类的调用 (24)3。

3正三角形类的调用 (25)3.4基本类型调用的剩余代码 (26)4。

画笔的使用、颜色及大小的调整 (29)5。

画硬币 (35)6.工具栏中的自定义控件 (38)7。

状态栏中的显示 (39)4程序功能的测试 (41)5最后总结 (42)摘要:本绘图程序能够进行基本图形的绘画,如直线,圆,矩形,三角形等等,并且在此基础上添加了多边形的绘画,如正五边形等。

【计算机图形学课程】一.MFC基本绘图函数使用方法

【计算机图形学课程】一.MFC基本绘图函数使用方法

【计算机图形学课程】⼀.MFC基本绘图函数使⽤⽅法这是最近我《计算机图形学》课程实践编程课介绍的相关知识,主要是想通过MFC C++绘图,让学⽣体会下图形学相关的编程及简单的图形绘制,同时⾮常佩服学⽣的想象⼒,他们做得真的不错。

希望这篇基础⽂章对你有所帮助吧!尤其是有这门课程的学⽣或编程爱好者,如果⽂章存在错误或不⾜之处,还请海涵。

参考书籍:孔令德·《计算机图形学基础教程(Visual C++版)》学⽣绘制的图形还是⾮常有创新的,表⽰很满意,哈哈哈~⼀. MFC绘图基础知识 CDC类PS:这部分主要引⼊孔令德⽼师的知识,这篇⽂章以后⾯的编程为主。

VC++具有强⼤的绘图功能,虽然基于对话框的应⽤我推荐⼤家使⽤C# Winform程序,但是计算机图形和图像的基础知识,还是强烈推荐使⽤VC++ MFC实现。

这有助于让你深⼊的理解图形变换、图像处理等知识。

在Windows平台下,GDI(Graphics Device Interface)图形设备接⼝被抽象为上下⽂CDC类(Device Context,DC)。

Windows平台直接接收图形数据信息的不是显⽰器和打印机等硬件设备,⽽是CDC对象。

MFC中,CDC类定义设备上下⽂对象的基类,封装了所需的成员函数,调⽤CDC类的成员函数,绘制和打印图形及⽂字。

CDC类派⽣出CClientDC类、CMetaFileDC类、CPaintDC类和CWindowDC类,请读者⾃⾏学习,同时推荐阅读原书。

MFC常⽤CPoint、CRect、CSize等数据类型。

(1) CPoint类:存放点坐标(x,y);(2) CRect类:存放矩形左上顶点和右下⾓顶点的坐标(top、left、right、bottom),其中(top,left)为矩形的左上⾓点,(right,bottom)为矩形的右下⾓点;(3) CSzie类:存放矩形的宽度和⾼度的坐标(cx,cy),其中cx为矩形的宽度,cy为矩形的⾼度。

简单的MFC画正弦曲线

简单的MFC画正弦曲线

简单的MFC画正弦曲线展开全文MFC 单文档如何画正弦曲线1.画笔类,CPen,创建画笔类的对象后,需要调用CreatePen(......)函数创建画笔。

然后将其选入设备描述表中。

pDC->SelectObject(.......);2.设置起点坐标。

在这里调用一个函数来设置坐标原点。

pDC->SetViewportOrg(100,255);3.调用LineTo(point),MoveTo(Point)函数画图。

4.删除创建的画笔对象。

pen.DeleteObject();以下是今天所写的画正弦函数的图像。

创建一个单文档的应用程序。

并且在VIEW类中的OnDraw(。

)函数里面做消息响应。

由于调用了sin()函数,所以要把math.h头文件包含进来。

#include "math.h"void CDrawSinXView::OnDraw(CDC* pDC){CDrawSinXDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here//建立画笔CPen pen_Zuobixi,pen_sinx;pen_Zuobixi.CreatePen(PS_SOLID,4,RGB(0,0,0));pen_sinx.CreatePen(PS_SOLID,2,RGB(0,0,255));pDC->SelectObject(&pen_Zuobixi);//指定原点pDC->SetViewportOrg(100,255);pDC->SetT extColor(RGB(255,0,0));//绘制横坐标CString sPIText[]={"-1/2π","","1/2π","π","3/2π","2π","5/2π","3π","7/2π","4π","9/2π"," 5π"};int n=-1;int nTemp=0;while (nTemp<=660){pDC->LineT o(60*n,0);pDC->LineT o(60*n,-5);pDC->MoveTo(60*n,0);pDC->TextOut(60*n-sPIText[n+1].GetLength()*3,16,sPIText[n+1]);n++;nTemp +=60;}pDC->MoveTo(0,0);CString strTemp;//绘制纵坐标for(n=-4,nTemp = 0;nTemp<=180;n++,nTemp+=60){pDC->LineT o(0,60*n);pDC->LineT o(5,60*n);pDC->MoveTo(0,60*n);strTemp.Format("%d",-n);pDC->TextOut(10,60*n,strTemp);}double y,radian;pDC->SelectObject(&pen_sinx);for(int x=-60;x<600;x++){//弧度=X坐标/曲线宽度*角系数*π//Y坐标=振幅*曲线宽度*sin(弧度) radian =x/((double)60*2)*PI;y=sin(radian)*2*60;pDC->MoveTo((int)x,(int)y); pDC->LineT o((int)x,(int)y);}pen_sinx.DeleteObject();pen_Zuobixi.DeleteObject();}。

实验一 MFC基本绘图

实验一 MFC基本绘图

数学与计算科学系学生实验报告实验课程名称:计算机图形学实验内容:实验一 MFC基本绘图系别:年级:专业班:学生姓名:学号:开课时间:年下学期一、实验要求1. 按照教材第40页2.2节所介绍的操作步骤,熟悉MFC应用程序的创建过程,并完成第50页的例2-5。

2.在上面程序的基础上,通过设置不同的画笔和画刷,至少实现8个不同图形的绘制,如:椭圆、矩形、实线、虚线、位图显示、五角星(多边形)、圆弧、扇形、Bezier曲线等等。

二、实验过程1.启动Visval 6.0++,创建MFC单文档工程。

2. 在MFC的OnDraw(CDC* pDC)中“ // TODO: add draw code for native data here”下进行编程。

3.建立直角坐标系,并标出x,y轴和原点O。

4.在坐标系里画图。

5.用图片填充背景时要先将图片导入MFCresources中。

6.画五角星时在头文件中加入以下代码:#include "math.h"#define PI 3.1415926#define Round(d) int(floor(d+0.5))三、程序代码void CMywork1View::OnDraw(CDC* pDC){CMywork1Doc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereCRect rect;//定义矩阵GetClientRect(&rect);//获得客户区矩阵pDC->SetMapMode(MM_ANISOTROPIC);//设置映射模式pDC->SetWindowExt(100,100);//设置窗口pDC->SetViewportExt(100,100);//设置视区:x轴水平向右为正,y轴垂直向上为正pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);//设置客户区中心为坐标系原点rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);//客户区矩阵校正//建立坐标系CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(0,255,0));//画实线,选择绿色画笔pOldPen=pDC->SelectObject(&NewPen);pDC->MoveTo(-rect.right,0); //自定义坐标轴pDC->LineTo(rect.right,0);pDC->MoveTo(0,-rect.bottom);pDC->LineTo(0,rect.bottom);pDC->MoveTo(rect.right,0); //画x轴的箭头pDC->LineTo(rect.right-10,-7);pDC->MoveTo(rect.right,0); //画x轴的箭头pDC->LineTo(rect.right-10,7);pDC->MoveTo(0,-rect.bottom); //画y轴的箭头pDC->LineTo(7,10-rect.bottom);pDC->MoveTo(0,-rect.bottom); //画y轴的箭头pDC->LineTo(-7,10-rect.bottom);pDC->TextOut(rect.right-15,5,"x"); //显示x轴pDC->TextOut(25,15-rect.bottom,"y"); //显示y轴pDC->TextOut(-15,10,"O"); //显示原点//直线---画实线1CPoint A(50,50),B(450,300);CPen NewPen1,*pOldPen1;NewPen1.CreatePen(PS_SOLID,1,RGB(0,225,225));//画实线,选择青色画笔pOldPen1=pDC->SelectObject(&NewPen1);pDC->MoveTo(A);pDC->LineTo(B);pDC->SelectObject(pOldPen1);pDC->TextOut(50,50,'A');pDC->TextOut(450,300,'B');pDC->TextOut(200,200,"实线");//直线---画虚线2CPoint C(300,150),D(600,100);CPen NewPen2,*pOldPen2;NewPen2.CreatePen(PS_DASH,1,RGB(225,0,0));//画虚线,选择红色画笔pOldPen2=pDC->SelectObject(&NewPen2);pDC->MoveTo(C);pDC->LineTo(D);pDC->SelectObject(pOldPen2);pDC->TextOut(300,150,'C');pDC->TextOut(600,100,'D');pDC->TextOut(450,100,"虚线");//画椭圆3rect.DeflateRect(100,50);CBrush * pOldBrush3;pOldBrush3=(CBrush *)pDC->SelectStockObject(NULL_BRUSH);//选择透明画刷pDC->Ellipse(rect);//绘制椭圆pDC->SelectObject(pOldBrush3);//画圆角矩形4CBrush NewBrush4,*pOldBrush4;NewBrush4.CreateSolidBrush(RGB(255,0,0));pOldBrush4=pDC->SelectObject(&NewBrush4);pDC->RoundRect(-400,-200,-50,-40,40,20);pDC->SelectObject(pOldPen);pDC->SelectObject(pOldBrush4);//画Bezier样条9CPoint pp[7];pp[0]=CPoint(20,-200);pp[1]=CPoint(90,-70);pp[2]=CPoint(220,-30);pp[3]=CPoint(250,-160);double a=(pp[3].y-pp[2].y)/(pp[3].x-pp[2].x);double x=270,y=a*(x-pp[3].x)+pp[3].y;pp[4]=CPoint(Round(x),Round(y));pp[5]=CPoint(480,-130);pp[6]=CPoint(400,-25);for(int j=0;j<7;j++){if(0==j)pDC->MoveTo(pp[j]);elsepDC->LineTo(pp[j]);pDC->Ellipse(pp[j].x-5,pp[j].y-5,pp[j].x+5,pp[j].y+5);//黑色实心圆绘制控制点}CPen NewPen9,*pOldPen9;NewPen9.CreatePen(PS_SOLID,3,RGB(255,0,0));//红色画笔绘制样条pOldPen9=pDC->SelectObject(&NewPen9);pDC->PolyBezier(pp,7);//绘制Bezier样条pDC->SelectObject(pOldPen9);pDC->TextOut(280,-100,"Bezier曲线");//绘制五角星6CPen penBlue(PS_SOLID,5,RGB(0,0,255));//定义五个像素宽的蓝色画笔CPen *pOldPen6=pDC->SelectObject(&penBlue);CBrush brushRed(RGB(255,0,0));//定义红色画笔CBrush * pOldBrush6=pDC->SelectObject(&brushRed);pDC->SetPolyFillMode(WINDING);//设置填充模式int r=200;//正五边形外接圆的半径CPoint p[5];//定义正五边形顶点数组double Beta=2*PI/5;//定义每个顶点的圆心角double Alpha=PI/10;//定义起始角for(int i=0;i<5;i++){p[i].x=Round(r*cos(i*Beta+Alpha));//计算正五边形顶点坐标p[i].y=Round(r*sin(i*Beta+Alpha));}CPoint v[5];//定义五角星顶点数组v[0]=p[0];v[1]=p[2];v[2]=p[4];v[3]=p[1];v[4]=p[3];//转储顶点pDC->Polygon(v,5);//绘制五角星pDC->SelectObject(pOldPen6);//恢复画笔pDC->SelectObject(pOldBrush6);//恢复画刷//画扇形7CBitmap NewBitmap7; CBrush NewBrush7,*pOldBrush7;NewBrush7.CreatePatternBrush(&NewBitmap7);//将背景图作为画刷填充扇形pOldBrush7=pDC->SelectObject(&NewBrush7);CPen *pOldPen7;pOldPen7=(CPen*)pDC->SelectStockObject(NULL_PEN);CPoint ld,rt,sp,ep;ld=CPoint(500,150),rt=CPoint(100,300);//第一个扇形的位置sp=CPoint(-100,-300),ep=CPoint(-500,-150);pDC->Pie(CRect(ld,rt),sp,ep);//画扇形函数CBrush Brush7;Brush7.CreateSolidBrush(RGB(0,255,255));//为下面的的扇形配青色pDC->SelectObject(&Brush7);ld=CPoint(-400,-170),rt=CPoint(-300,-130);//第二个扇形的位置sp=CPoint(-200,-100),ep=CPoint(-500,-100);pDC->Pie(CRect(ld,rt),sp,ep);//画获取像素图8srand((unsigned)time(NULL));//随机变量(随时间变化)COLORREF crColor;int m,n;for(n=50;n<100;n++)for(m=-100;m<-50;m++)pDC->SetPixelV(m,n,RGB(rand()%256,rand()%256,rand()%256));//生成随机像素点for(n=50;n<100;n++)for(m=-100;m<-50;m++){crColor=pDC->GetPixel(m,n);//获取原矩形区域的像素点pDC->SetPixelV(m-200,n+50,crColor);//用获取的像素点在y-90的位置生成原图}}四、实验结果。

第九章 使用MFC实现真实感图形绘制

第九章 使用MFC实现真实感图形绘制

第九章使用MFC实现真实感图形绘制真实感图形绘制是计算机图形学的一个重要组成部分。

它综合利用数学、物理学、计算机科学和其他学科知识在计算机图形设备上生成象彩色照片那样的真实感图形。

要用计算机图形设备绘制场景的真实感图形,就必须首先在计算机中建立该场景的模型,用这个模型来反映场景的特点和属性。

这一模型通常是由一批几何数据及数据之间的拓扑关系来表示的,这就是造型技术,它是真实感图形绘制技术的重要组成部分。

有了三维场景的模型,并给定了观察点和观察方向以后,就可以通过几何变换和投影变换在屏幕上显示该三维场景的二维图像。

为了使二维图像具有立体感,并尽可能逼真地显示出该物体在现实世界中被观察到的形象,就需要运用适当的光照模型,来模拟场景在现实世界中受到各种光源照射时的效果,这就是真实感图形的画面绘制技术,也就是真实感图形的生成技术。

用计算机在图形设备上生成连续色调的真实感图形大致可以分为以下四步:第一步,用数学方法建立所需三维场景的几何描述,并将它们输入至计算机。

这部分工作可由三维立体造型或曲面造型系统来完成。

场景的几何描述直接影响了图形的复杂性和图形绘制的计算耗费,因此选择合理的、有效的数据表示和输入手段是非常重要的。

第二步,将三维几何描述转换为二维投影图。

这可以通过对场景的投影变换来完成。

第三步,确定场景中的所有可见面,这需要使用隐藏面消除算法将被其他物体遮挡的不可见面消去。

第四步,计算场景中可见面的颜色,严格地说,就是根据基于光学物理的光照明模型计算可见面投射到观察者眼中的光亮度大小和色彩分量,并将它转换成适合图形设备的颜色值,从而确定投影画面上每一象素的颜色,最终生成图形。

前三步的相关知识在前面已经进行了介绍,本章将重点介绍如何通过MFC 编程的方式,利用光照模型计算场景中可见面的光亮度和颜色,并绘制最终的真实感图形。

实际上,现在OpenGL和DirectX等图形函数库提供了很多支持真实感图形绘制的函数,使用它们可以更轻松的完成真实感图形绘制。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

**理工大学C++面向对象课程设计报告院(系):计算机工程学院专业:计算机科学与技术学生姓名:__**班级计算111 学号: 2011070** 题目:设计绘制各种数学图形程序_起迄日期:_2013.6.23~2013.7.5 设计地点:计算机学院机房指导教师: *** 完成日期: 2013 年7月 5 日目录一、需求分析1.选做此课题的目的 (3)2.程序所实现的功能 (3)二、设计内容1.模块图 (3)2.主程序及其主要模块的流程图 (3)3.类图 (4)3.1表达式 (4)3.2 储存运算符的栈 (5)3.3储存运算数的栈 (5)3.4 圆 (5)3.5 椭圆 (6)3.6 三叶玫瑰线 (6)3.7 四叶玫瑰线 (7)3.8 阿基米德螺线 (7)3.9 心形线 (7)4.函数关系图 (8)5.编写程序代码 (9)三、调试分析1.实际完成的情况说明 (12)2.程序的性能分析 (12)3.上机过程中出现的问题及其解决方案 (12)4.程序中可以改进的地方说明 (13)四、用户手册 (13)五、设计总结 (15)六、参考文献 (15)七、附录 (15)一、需求分析1.选作此课题的目的在日常生活中我们常常需要解决一些复杂的数学问题,而这些数学问题的解答往往可以从它的函数图形上很直观、明了的表现出来,这时快捷方便的绘制出该数学函数的图形就显得尤为重要。

所以我们使用Microsoft 提供的MFC 类库来实现数学函数图形的绘制。

2 .程序所实现的功能本程序支持用户输入一般表达式,然后输出其对应的函数图形,例如:一次(二次……)函数,三角函数,双曲余弦,双曲正弦,双曲正切,幂函数,指数函数(以10为底,以e 为底)。

另外,还支持一些供选择的数学图形,例如:圆,椭圆,三叶玫瑰线,四叶玫瑰线,阿基米德螺线,心形线。

二、设计内容1.模块图2. 主程序及主要模块的流程图表达式特殊数学图形圆 主界面椭圆 三叶玫瑰线 阿基米德螺线四叶玫瑰线心形线开始选择图形类型No确定Yes输入表达式或参数图形结束3.类图3.1 表达式CGraphDlgpublic:double Pow(double ,double ); //幂函数求值double Operate(double ,char ,double ); //表达式求值char Precede(char ,char); //判断操作符优先级int In(char ); //判断运算数和运算符void Coordinate(); //求点的集合double Calculate(CString ,double);CGraphDlg(CWnd* pParent = NULL);enum { IDD = IDD_GRAPH_DIALOG };protected:Virtual void DoDataExchange(CDataExchange* pDX); private:ICON m_hIcon;UINT m_num; //点的数量char *m_stop;CPtrArray m_ptrarray; //点的集合变量CComboBox m_type; //图形类型CString m_expression; //表达式3.2存储运算符的栈OPTRpublic:OPTR(); //缺省构造函数int InitOPTR(); //构造一个空栈char GetTop(); //返回栈顶元素int Push(char e); //进栈char Pop(); //出栈virtual ~OPTR(); //析构函数Public:char *base; //栈底指针char *top; //栈顶指针int size; //当前已分配的存储空间3.3存储运算数的栈OPNDpublic:OPND(); //缺省构造函数int InitOPND(); //构造一个空栈double GetTop(); //返回栈顶元素int Push(double e); //进栈double Pop(); //出栈virtual ~OPND(); //析构函数Public:double *base; //栈底指针double *top; //栈顶指针int size; //当前已分配的存储空间3.4 圆circlepublic:afx_msg void OnChangeEdit1();afx_msg void OnChangeEdit2();afx_msg void OnChangeEdit3();afx_msg void OnButton1();circle(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG1 };Public:double m_x; //圆心横坐标double m_y; //圆心纵坐标double m_r; //半径3.5椭圆ellipsepublic:afx_msg void OnChangeEdit1();afx_msg void OnChangeEdit2();afx_msg void OnChangeEdit3();afx_msg void OnChangeEdit4();afx_msg void OnButton1();ellipse(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG2 };Public:double m_x; //椭圆中心横坐标double m_y; //椭圆中心纵坐标double m_lr; //长轴double m_sr; //短轴3.6 三叶玫瑰线sanyiepublic:afx_msg void OnChangeEdit1();afx_msg void OnChangeEdit2();afx_msg void OnButton1();sanyie(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG3 };Public:double m_a; //系数adouble m_b; //角度θ3.7 四叶玫瑰线3.8 阿基米德螺线3.9 心形线siyepublic:afx_msg void OnChangeEdit1();afx_msg void OnChangeEdit2();afx_msg void OnButton1();siye(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG4 }; Public:double m_a; //系数adouble m_b; //角度θajimide public:afx_msg void OnChangeEdit1();afx_msg void OnButton1();ajimide(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG5 }; Public:double m_a; //系数adouble m_b; //角度θxinxingxian public:afx_msg void OnChangeEdit1();afx_msg void OnButton1();xinxingxian(CWnd* pParent = NULL);enum { IDD = IDD_DIALOG6 }; Public:double m_a; //系数a4.函数关系图CGraphDlg::OnButton1() 类circle类ellipse类sanyie类siye 类ajimide类xinxingxianCGraphDlg::OnDrawing()circle::OnButton1()siye::OnButton1()ellipse::OnButton1()sanyie::OnButton1()ajimide::OnButton1()xinxingxian::OnButton1()CGraphDlg::Coordinate()CGraphDlg::Calculate(CString m_expression,double x)OPTR::Push(char ) CGraphDlg::Precede(char s,char c)CGraphDlg::In(char ch)OPND::GetTop()OPND::Pop()OPTR::GetTop()OPND::Push(double e)OPTR::InitOPTR() OPND::InitOPND()OPTR::GetTop()(箭头代表调用)CGraphDlg::Operate(double,char,double )CGraphDlg::Pow(double, double )5. 编写程序代码1.画坐标轴CClientDC dc(this);CRect rect;GetClientRect(&rect) ;dc.SetMapMode(MM_LOMETRIC) ; //设置映射模式;dc.SetWindowOrg(0,0) ; //设置屏幕窗口原点;dc.SetViewportOrg(CPoint(rect.right/2,rect.bottom/2)) ; //设置视口原点CPen pen1(PS_DOT,1,RGB(100,100,100)); //创建笔,并调整坐标颜色CPen *pOldPen = dc.SelectObject(&pen1); //更改笔并保存旧的笔for(int i=-900;i<=900;i+=50){dc.MoveTo (i,500);dc.LineTo (i,-500);}for(int j=-500;j<=500;j+=50){dc.MoveTo (-900,j);dc.LineTo (900,j);}dc.TextOut (10,500,'y'); //标记y轴dc.TextOut (870,0,'x'); //标记x轴dc.TextOut (0,0,'0'); //标记坐标原点dc.TextOut (-8,510,'^');dc.TextOut (900,25,'>');CPen pen(PS_SOLID,1,RGB(0,0,0));//创建笔,并调整坐标颜色pOldPen = dc.SelectObject(&pen);//更改笔并保存旧的笔dc.MoveTo (-900,0); //横坐标dc.LineTo (900,0);dc.MoveTo (0,-500); //纵坐标dc.LineTo (0,500);}2.选择图形类型//默认是表达式RedrawWindow();m_expression="";UpdateData(FALSE);CString text;m_type.GetWindowText(text);if(text=="圆"){circle d_circle;d_circle.DoModal(); //显示画圆的对话框}else if(text=="椭圆"){ellipse d_ellipse;d_ellipse.DoModal(); //显示画椭圆的对话框}else if(text=="三叶玫瑰线"){sanyie d_sanyie;d_sanyie.DoModal(); //显示画三叶玫瑰线的对话框}else if(text=="四叶玫瑰线"){siye d_siye;d_siye.DoModal(); //显示画四叶玫瑰线的对话框}else if(text=="阿基米德螺线"){ajimide d_ajimide;d_ajimide.DoModal(); //显示画阿基米德螺线的对话框}else if(text=="心形线"){xinxingxian d_xinxingxian;d_xinxingxian.DoModal(); //显示画心形线的对话框}3.根据表达式画出图形for(m_num-=1;m_num>0;m_num--) //从点集合中依次取出点并且相连{dc.MoveTo (((CPoint *)m_ptrarray.GetAt(m_num))->x,((CPoint *)m_ptrarray.GetAt(m_num))->y);dc.LineTo (((CPoint *)m_ptrarray.GetAt(m_num-1))->x,((CPoint *)m_ptrarray.GetAt(m_num-1))->y);}4. 画圆dc.Ellipse((m_x-m_r)*50,(m_y+m_r)*50,(m_x+m_r)*50,(m_y-m_r)*50); //调用Ellipse函数5. 画椭圆dc.Ellipse((m_x-m_lr)*50,(m_y+m_sr)*50,(m_x+m_lr)*50,(m_y-m_sr)*50);//调用Ellipse函数6. 画三叶玫瑰线double x=0,y=0;dc.MoveTo (0,0); //从原点开始画for(double p=-3.14;p<=3.14;p+=0.01) //计算点的同时画线{x=m_a*cos(3*(m_b+p))*cos(p);y=m_a*cos(3*(m_b+p))*sin(p);dc.LineTo(50*x,50*y);dc.MoveTo(50*x,50*y);dc.SelectObject(&pen);}7. 画四叶玫瑰线double x=0,y=0;dc.MoveTo (0,0); //从原点开始画for(double p=-3.14;p<=3.14;p+=0.01) //计算点的同时画线{x=m_a*sin(2*(m_b+p))*cos(p);y=m_a*sin(2*(m_b+p))*sin(p);dc.LineTo(50*x,50*y);dc.MoveTo(50*x,50*y);dc.SelectObject(&pen);}8. 画阿基米德螺线double p=-10;double x=0,y=0;x=m_a*p*cos(p);y=m_a*p*sin(p);dc.MoveTo (x*20,20*y);for( p=-10;p<=10;p+=0.01) //计算点的同时画线{x=m_a*p*cos(p);y=m_a*p*sin(p);dc.LineTo(20*x,20*y);dc.MoveTo(20*x,20*y);dc.SelectObject(&pen);}9. 画心形线double x=0,y=0;dc.MoveTo (0,0); //从原点开始画for(double p=-3.14;p<=3.14;p+=0.01) //计算点的同时画线{x=m_a*(1-cos(p))*cos(p);y=m_a*(1-cos(p))*sin(p);dc.LineTo(50*x,50*y);dc.MoveTo(50*x,50*y);dc.SelectObject(&pen);}三、调试分析1.实际完成的情况说明(完成的功能、支持的数据类型等)本程序支持用户选择数学图形类型并输入相应的参数,然后输出其对应的函数图形。

相关文档
最新文档