画一三叶玫瑰线使一个小五角星在曲线上移动

上传人:xiao****1972 文档编号:84827420 上传时间:2019-03-05 格式:DOC 页数:8 大小:99.16KB
返回 下载 相关 举报
画一三叶玫瑰线使一个小五角星在曲线上移动_第1页
第1页 / 共8页
画一三叶玫瑰线使一个小五角星在曲线上移动_第2页
第2页 / 共8页
画一三叶玫瑰线使一个小五角星在曲线上移动_第3页
第3页 / 共8页
画一三叶玫瑰线使一个小五角星在曲线上移动_第4页
第4页 / 共8页
画一三叶玫瑰线使一个小五角星在曲线上移动_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《画一三叶玫瑰线使一个小五角星在曲线上移动》由会员分享,可在线阅读,更多相关《画一三叶玫瑰线使一个小五角星在曲线上移动(8页珍藏版)》请在金锄头文库上搜索。

1、 沈阳理工大学 机械工程学院面向对象的程序设计C+课程设计 姓名:李锐凯 学号:1182000212 专业:机械设计及理论 日期:2012年7月6日星期五 面向对象的程序设计C+一 题目内容题目:编制曲线轨迹动画程序要求:画一三叶玫瑰线,使一个小五角星在曲线上移动。键盘输入a和 用对话框由键盘输入,按回车键程序结束(功能延伸:数据的保存与显示)二功能说明及分析:通过分析题目要求,可以得到要做的工作有:三叶玫瑰线的绘制,五角星的绘制,五角星的运动,对话框数据的输入,回车键结束程序,数据的保存与显示这六部分。接下来来逐个解决。1.三叶玫瑰线的绘制:由于VC+6.0没有直接绘制三叶玫瑰线的函数,所以

2、选择函数SetPixel()来完成。 功能: 函数SetPixel()在屏幕上画一个像素点。用法: 函数调用方式为void putpixel(int x,int y,int color);说明: 参数x,y为像素点的坐标,color是该像素点的颜色,它可以是颜色符号名,也可以是整型色彩值。像素点坐标:由于题目给出的是三叶玫瑰线的极坐标形式,转化为直角坐标系下的像素点。R=a*cos(3*t),x=R*cos(t)+px;,y=R*sin(t)+py。R为三叶玫瑰线的半径,a为通过对话框输入的数据,t为角度的变化,px,py为三叶玫瑰线中心点的坐标,x,y极为直角坐标系下的像素点。综上所述,再利

3、用for循环就能够实现三叶玫瑰线的绘制。图12. 五角星的绘制:由于五角星有十个顶点,因此需要求得这十个坐标点,而这十个点又可以分为外围的五个点,内侧的五个点。如果通过函数MoveTo(),LineTo()来画五角星,则显得程序很繁琐。所以我选择数组对象以及函数Polygon()来完成。定义一个POINT pts【10】的数组对象来存储五角星的十个顶点。3.五角星的运动:五角星的运动过程分为三个部分,绘图,擦除,重绘。第一步绘图需要得到三叶玫瑰线的像素点坐标,由于三叶玫瑰线的坐标值是不断变化的,同时也就实现了五角星的运动。但是又必须有擦除这一环节,如果不擦除,则屏幕则会变成如图1所示: 图2但

4、是又不能一边画一边擦除,必须要有一个时间间隔,要不然屏幕就不会显示图形。于是我选择函数Sleep(100),这样就解决了上面的问题。但是又同时有出现了新的问题,就是图形的闪烁问题,通过查找资料,运用双缓存技术可以解决这个问题,由于篇幅所限,这里就不在赘述。4. 对话框数据的输入:建立一个基于单文档的应用程序,操作平台为Windows 和VC+6.0。插入一个对话框,添加Edit控件,关联变量。从键盘输入数据,为三叶玫瑰线的数据a。考虑到玫瑰线的特殊性,a的数据类型选择为double 。当然也可以关联三叶玫瑰线的中心点的坐标,以及五角星的大小等。 对话框变量的传递我用了两种方法解决,一种是全局变

5、量的方法,另一种是在CView类里面添加消息响应函数来传递。但是再做大型程序的时候,建议不要使用全局变量,而是建立一个专门来传递数据的类来提高程序的效率。图3下面的方法为在CView类里面添加消息响应函数的代码void CMy626View:OnRose() / TODO: Add your command handler code hereCMyDlg dlg; dlg.m_na=m_a;if(dlg.DoModal()m_a=dlg.m_na;return;5. 回车键结束程序:这需要添加WM_CHAR消息句柄来解决。回车键的ASCII码十进制为13,十六进制为0x0d,退出程序要用到ex

6、it(0)。但当本程序在运行,敲入回车键后,需要在for循环结束之后才能执行结束程序。void CMy626View:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) / TODO: Add your message handler code here and/or call defaultif(0x0d=nChar)exit(0);CView:OnChar(nChar, nRepCnt, nFlags); 6. 数据的保存与显示:文件保存涉及到CAchive类的使用。void CMy626View:OnWrite() / TODO: Add your

7、 command handler code hereCFile file(1.txt,CFile:modeCreate | CFile:modeWrite);CArchive ar(&file,CArchive:store); extern double m_aa;CString str(http:/www.sunxin.org);arm_aa;strResult.Format(%f,m_aa);MessageBox(strResult);三 程序流程图 对话框输入数据a当tSetBkColor(RGB(255,255,255);extern double m_aa;double a,t,R,

8、x,y;const double PI = 3.14159;a=m_aa; double b=0.1,px=450,py=300,r=15,m_fAngle=0,m_fRadius=50;if(a)for(t=0;t=3.141492653;t+=0.01) R=a*cos(3*t); x=R*cos(t)+px; y=R*sin(t)+py; CClientDC dc(this); for(i=0;i1000;i+) dc.SetPixel(x,y,RGB(255,255,0); POINT pts10;float theta1=18+m_fAngle; float theta2=54+m_

9、fAngle; for (int j=0;j5;j+) /求最外边的五个顶点的坐标 pts2*j.x=x+m_fRadius*cos(theta1+j*72)*PI/180); pts2*j.y=y-m_fRadius*sin(theta1+j*72)*PI/180); for (j=0;j5;j+) /求靠里面边的五个顶点的坐标 float r=m_fRadius*sin(18*PI/180)/sin(54*PI/180); pts2*j+1.x=x+r*cos(theta2+j*72)*PI/180); pts2*j+1.y=y-r*sin(theta2+j*72)*PI/180);dc.Polygon(pts, 10);Sleep(50);CPen pen(PS_SOLID ,1,RGB(255,255,255); dc.SelectObject(&pen); dc.Polygon(pts, 10); dc.SetPixel(x,y,RGB(255,255,0);六参考文献1.计算机图形学实用技术(第二版).陈元琰,张睿哲,吴东.清华大学出版社2.掌握Visual C+MFC程序设计与剖析.胡源哲。清华大学出版社3.C程序设计(第三版).谭浩强.清华大学出版社4.C+程序设计语言.裘宗燕译.机械工业出版社5.面向对象程序设计语言C+.陈文宇.机械工业出版

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号