点在凸多边形内外的判定.docx
- 文档编号:26891939
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:17
- 大小:221.72KB
点在凸多边形内外的判定.docx
《点在凸多边形内外的判定.docx》由会员分享,可在线阅读,更多相关《点在凸多边形内外的判定.docx(17页珍藏版)》请在冰豆网上搜索。
点在凸多边形内外的判定
课程设计(论文)任务书
软件学院学 院 软件+桥梁工程专 业2 班
一、课程设计(论文)题目 点在凸多边形内外判定
二、课程设计(论文)工作自2014年6月2日起至2014年6月6日止。
三、课程设计(论文)地点:
软件学院实训中心
四、课程设计(论文)内容要求:
1.本课程设计的目的
计算机图形学课程设计是计算机图形学课程中的知识、技术和技能的一个综合应
用,是培养图形软件开发能力的综合训练。
通过课程设计,使学生更深入地理解和掌
握计算机图形学理论与相关算法,巩固课内所学的知识、技术和技能,进一步提高图
形软件开发的能力。
为毕业设计和毕业后从事计算机绘图、计算机辅助设计、辅助教
学、辅助工程、图形处理等打下基础。
2.课程设计的任务及要求
1)课程设计任务:
1设计任务:
点在凸多边形内外判定
本次设计为判定点与多边形的位置关系,这对于研究图形学中多边形的表示及多边形的填充有着重要的意义。
2设计要求
(1)使用鼠标指定一组点来定义凸多边形;
(2)使用鼠标指定测试点;
(3)根据测试结果输出“在内部”或“在外部”。
2)创新要求:
在基本要求达到后,可进行创新设计
3)课程设计论文编写要求
(1)课程设计任务及要求
(2)设计思路--工作原理、功能规划
(3)详细设计---数据分析、算法思路、功能实现(含程序流程图、主要代码及注
释)、界面等。
(4)运行调试与分析讨论---给出运行屏幕截图,分析运行结果,有何改进想法等。
(5)设计体会与小结---设计遇到的问题及解决办法,通过设计学到了哪些新知识,
巩固了哪些知识,有哪些提高。
(6)参考文献(必须按标准格式列出,可参考教材后面的参考文献格式)
(7)报告按规定排版打印,要求装订平整,否则要求返工;
(8)课设报告的装订顺序如下:
封面---任务书---中文摘要---目录----正文---附录
(代码及相关图片)
(9)严禁抄袭,如有发现,按不及格处理。
4)课程设计评分标准:
(1)学习态度:
10分;
(2)系统设计:
20分;
(3)编程调试:
20分;
(4)回答问题:
20分;
(5)论文撰写:
30分。
5)参考文献:
(1)陆枫何云峰.计算机图形学基础(第2版)[M].电子工业出版社
(2)张曦煌杜俊俐.计算机图形学[M].北京邮电大学出版社
(3)孙家广.计算机图形学[M].清华大学出版社.
6)课程设计进度安排
1.准备阶段(4学时):
选择设计题目、了解设计目的要求、查阅相关资料
2.程序模块设计分析阶段(4学时):
程序总体设计、详细设计
3.代码编写调试阶段(8学时):
程序模块代码编写、调试、测试
4.撰写论文阶段(4学时):
总结课程设计任务和设计内容,撰写课程设计论文
学生签名:
2014年6月2日
课程设计(论文)评审意见
(1)学习态度(10分):
优( )、良( )、中( )、一般( )、差( );
(2)系统设计(20分):
优()、良( )、中( )、一般( )、差( );
(3)编程调试(20分):
优( )、良( )、中( )、一般( )、差( );
(4)回答问题(20分):
优( )、良( )、中( )、一般( )、差( );
(5)论文撰写(30分):
优( )、良( )、中( )、一般( )、差( );
评阅人:
职称:
讲师
2014年6月日
中文摘要
计算机图形学(ComputerGraphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。
简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。
计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。
为此,必须建立图形所描述的场景的几何表示,再用某种光照模型,计算在假想的光源、纹理、材质属性下的光照明效果。
所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。
事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。
同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系.此次利用计算机图形学的知识来解决点在凸多边形内外的判断。
目 录
一、课程设计任务及要求1
1.1设计任务1
1.2设计要求1
二、需求分析1
三、总体设计2
四、详细设计3
4.1绘图功能的实现3
4.2点与凸多边形位置关系的判断6
五、运行调试与分析讨论10
5.1点在凸多边形内的测试结果10
5.2点在凸多边形外的测试结果11
六、设计体会与小结12
七、参考文献13
一、课程设计任务及要求
1.1设计任务:
点在凸多边形内外判定
本次设计为判定点与多边形的位置关系,这对于研究图形学中多边形的表示及多边形的填充有着重要的意义。
1.2设计要求
(1)使用鼠标指定一组点来定义凸多边形;
(2)使用鼠标指定测试点;
(3)根据测试结果输出“在内部”或“在外部”。
二、需求分析
OpenGL是一个工业标准的三维计算机图形软件接口。
用户可以很方便地的利用它开发高质量的精致后动画三维彩色图形,并有多种特殊视觉效果。
它的函数库包括大量的函数,本设计中主要用到有LineGL(Pointpt0,Pointpt1);PointGL(Pointpt);glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);glutInitWindowPosition(a,a);glutInitWindowSize(600,800);glutDisplayFunc(myDisplay);glutReshapeFunc(Reshape);createGLUTMenus();GlutMouseFunc(mouse);glutMainLoop()等等。
关于绘点和直线,opengl要求指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前(否则指定的顶点将被忽略),并由glBegin来指明如何使用这些点。
如果glBegin函数之后是gl_points生成顶点,是gl_lines则生成直线。
创建生成点和直线的方法,生成多边行时通过一个循环,调用生成点和直线的方法显示多边形。
同时,多边形的绘制函数DrawPolygon()和判定点在其内的函数PtInPolygon()是实现本次算法的精要所在,通过射线法来判定点与多边形的位置关系,从点出发的射线与多边形的边相交,若交点的个数为奇数,则点在多边形内部;若交点为偶数,则点在多边形的外部。
三、总体设计
关于点在凸多边形内外判定的设计,首先要设计画点的算法以及直线的画法,从而利用点和直线的算法设计凸多边形的算法。
最重要的是设计如何判定点在凸多边形内外。
确定一个点与多边形的内部关系一般有两种方法:
射线法和累计角度法。
这里,我用的是射线法:
(在代码中)以pointpt为起点,以无穷远为终点作平行于X轴的直线,循环取得多边形每一条边,且判断是否平行X轴,如果平行continue,否则i++;同时判断点是否在边上,如果是,则返回1(点在多边形上),否则继续下面的判断;判断边与线是否有交点,如果有则vp++,否则,i++。
判断交点的总数,如果为奇数则返回0(点在多边形内),偶数则返回2(点在多边形外)。
通过创建鼠标事件的方法,来进行画多边形和判断。
四、详细设计
4.1绘图功能的实现
图4-1
通过鼠标来绘制,绘制图形和点,并将在静态文本控件中绘制图形,所以,需要响应对话框的鼠标消息,并需要在静态文本的重绘函数OnPaint()中绘制图形和点。
另外,需要从静态文本控件CStatic类中,派生自己的静态文本控件类DrawMapStatic类。
在DrawMapStatic类中,添加变量CArray
通过点击鼠标左键确定图形绘制点,通过VC++里的工具类向导,将变量DrawMapStaticm_static与静态文本控件绑定。
其关键代码如下:
voidCMyDlg:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
LPRECTlpRect=newCRect();
m_static.GetWindowRect(lpRect);//获取静态文本控件区域
ScreenToClient(lpRect);//将屏幕坐标系改为客户坐标系
//若鼠标在静态文本控件中
if(point.x
point.y
{
CPointpt;
//获取鼠酣标在静态文本控件中的位置
pt.x=point.x-lpRect->left;
pt.y=point.y-lpRect->top;
if(m_static.IsDrawMap)//正在绘制图形,则将该点加入到凸边形顶点存储变量中
m_static.m_pointArray.Add(pt);
m_static.currpoint=pt;//标记当前绘制的点的位置
if(m_static.IsDrawPie)//若是绘制点,则将该点赋值给绘制点的变量中
{
m_static.Drawpoint=pt;
}
}
m_static.Invalidate();//使静态文本控件重绘
CDialog:
:
OnLButtonDown(nFlags,point);
}
在静态文本控件中,绘图在OnPaint()函数中,其关键代码如下:
voidDrawMapStatic:
:
OnPaint()
{
CPaintDCdc(this);//获取绘图设备
intn=m_pointArray.GetSize();//获取当前图形顶点的个数
CPenpen(PS_SOLID,1,RGB(0,0,0));//创建画笔
dc.SelectObject(&pen);//将画笔选入绘图设备中
CBrush*pBrush=newCBrush(RGB(0,0,0));//创建画刷
dc.SelectObject(pBrush);//将画刷选入图形设备中
//判断绘图是否结束,假若当前画的点在开始点以10为宽度的正方形内,且点数大于3,则可判定绘图完成
if(n>=4)
{
CPointpt=m_pointArray.GetAt(0);
if(currpoint.x>pt.x-5&&currpoint.x currpoint.y>pt.y-5&&currpoint.y { m_pointArray.SetAt(n-1,m_pointArray.GetAt(0));//将图形最后的顶点设置为图形的第一个顶点值 IsDrawMap=FALSE;//设置不能再进行绘图 IsDrawed=TRUE;//设置绘图已经完成 } } //绘制图形 for(inti=0;i { //绘制顶点,将顶点绘制为以当前点为圆心,半径为3的填充的圆 CPointpoint=m_pointArray.GetAt(i); dc.Ellipse(point.x-3,point.y-3,point.x+3,point.y+3); //绘制图形的边 if(i+1 { CPointp=m_pointArray.GetAt(i+1); dc.MoveTo(point.x,point.y); dc.LineTo(p.x,p.y); } } //绘制点 if(IsDrawPie&&Drawpoint.x! =0&&Drawpoint.y! =0) dc.Ellipse(Drawpoint.x-3,Drawpoint.y-3,Drawpoint.x+3,Drawpoint.y+3); } 4.2点与凸多边形位置关系的判断 图4-2 点与凸多边形的位置关系的判断将采用射线法。 该算法的基本思想是由被测点向某个方向作射线,计算此射线与多边形所有边交点的个数。 若交点个数为奇数,则被测点在多边形内,若交点个数为偶数,则被测点在多边形外部。 在此判断算法中,将采用以被测点竖直向下的方向作射线。 其算法关键代码如下: //用射线法判断点与凸多边形的关系 //射线方向为竖直向下 for(intj=0;j { //获取当前边的两个端点 p1=m_static.m_pointArray.GetAt(j); p2=m_static.m_pointArray.GetAt(j+1); //确保p1点的y值比p2的y值大 if(p2.y>p1.y) { mp=p1; p1=p2; p2=mp; } //假如被测点在该边下方,则该点竖直向下的射线与该边没交点 if(m_static.Drawpoint.y<=p2.y) continue; elseif(m_static.Drawpoint.y>=p1.y) {//被测点在边的两端点之上,则需判断点的x值是否在边的两端点之间 //用mp保存p1与p2的x的值 if(p1.x>p2.x) { mp.x=p1.x; mp.y=p2.x; } else { mp.x=p2.x; mp.y=p1.x; } if(m_static.Drawpoint.x {//若被测点的x值没有在p1.x和p2.x之间,则被测点与该边没有交点,反之,则有 continue; } else { count++; } } else {//若被测点在该边两端点之间,则需判断被测点与边在竖直向下方向上的交点是否在被测点 以下,若是,则有交点,反之,则没有。 该判断可用二分法判断 CPointpp1=p1,pp2=p2; //通过二分法将边取半分割,最终将边分割成一点: mp,且该点与被测点的y值相等。 do { mp.x=(pp1.x+pp2.x)/2; mp.y=(pp1.y+pp2.y)/2; if(m_static.Drawpoint.y>mp.y&&m_static.Drawpoint.y { pp2=mp; } elseif(m_static.Drawpoint.y { pp1=mp; } elseif(m_static.Drawpoint.y==mp.y) break; }while(true); //假若被测点的x值范围在mp.x与p2.x之间,则被测点与该边有交点 if((m_static.Drawpoint.x>mp.x&&m_static.Drawpoint.x ||(m_static.Drawpoint.x count++; } } //通过count的值打印判断结果 if(count%2) edit->SetWindowTextA("该点在凸多边形内"); else edit->SetWindowTextA("该点在凸多边形外"); 五、运行调试与分析讨论 运行程序后,选择“画多边形”由此,可以通过鼠标绘制凸多边形,画好多边形点击“点检测”即可知道点是否在多边形内了运行图如下: 5.1点在凸多边形内的测试结果 图5-1 5.2点在凸多边形外的测试结果 图5-2 6、设计体会与小结 在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。 课程设计是我们专业课程知识综合应用的实践训练,在这次设计过程中,体现出自己单独设计模具的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补.从这次的课程设计我们知道了自己的不足,学习的知识不够充分,对于现有资源材料的利用学习率太低等方面的缺点,对今后的学习和工作进步都有非常大的帮助。 七、参考文献 [1]严蔚敏.吴伟民数据结构[M]高等教育2004 [2]钱能C++程序设计教程(M)(第二版)清华大学出版社2009 [3]陆枫何云峰.计算机图形学基础(第2版)[M].电子工业出版社2012 [4]张曦煌杜俊俐.计算机图形学[M].北京邮电大学出版社 [5]孙家广.计算机图形学[M].清华大学出版社.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 凸多边形 内外 判定