下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 第1组(点在凸多边形内外的判定)

第1组(点在凸多边形内外的判定).doc

第1组(点在凸多边形内外的判定)

李飞彩
2018-11-06 0人阅读 举报 0 0 暂无简介

简介:本文档为《第1组(点在凸多边形内外的判定)doc》,可适用于领域

第组(点在凸多边形内外的判定)课程设计报告课程名称计算机图形学课题名称点在凸多边形内外的判定专业计算机科学与技术班级计算机学号姓名指导教师刘长松年月日湖南工程学院课程设计任务书课程名称计算机图形学课题点在凸多边形内外的判定专业班级计算机学生姓名学号指导老师刘长松审批任务书下达日期年月日任务完成日期年月日一、设计内容与设计要求(设计内容:以图形学基本算法为目标深入研究。继而策划、设计并实现一个能够判定点在凸多边形内外的算法并能从某些方面作出评价和改进意见。通过完成一个完整程序经历策划、设计、开发、测试、总结和验收各阶段。(设计要求:()使用鼠标指定一组点来定义凸多边形()使用鼠标指定测试点()根据测试结果输出“在内部”或“在外部”。参考文献王汝传黄海平计算机图形学教程M北京:人民邮电出版社孔令德计算机图形学教程M北京:清华大学出版社姜灵芝C语言课程设计案例精编M北京:清华大学出版社徐文鹏计算机图形学北京:机械工业出版社二、进度安排第周星期二::星期三::星期五::第周星期一::星期三::星期四::附:课程设计报告装订顺序:封面、任务书、目录、正文、附件(A大小的图纸及程序清单)、评分。正文的格式:一级标题用号黑体,二级标题用四号宋体加粗,正文用小四号宋体行距为。正文的内容:一、课题的主要功能二、课题的功能模块的划分(要求画出模块图)三、主要功能的实现(至少要有一个主要模块的流程图)四、程序调试五、总结六、附件(所有程序的原代码要求对程序写出必要的注释)。正文总字数要求在字以上(不含程序原代码)。目录课题的主要功能课题的功能模块的划分功能模块的划分功能模块的简介主要功能的实现设计框架绘图功能的实现点与凸多边形位置关系的判断程序调试总结附件湖南工程学院课程设计报告课题的主要功能该课题主要实现判断点与凸多边形的位置关系。其设计思想是应用图形学中的算法来实现该课题的功能。点与凸多边形的位置关系的判断可以用射线法。另外该课题还要实现通过鼠标画凸多边形和画点。在该课题中将使用VC实现画图和画点主要用函数:MoveTo()和LineTo()。课题的功能模块的划分功能模块的划分该课题的功能模块应该划分为两个部分:一部分是:画图和画点另一部分是判断点与凸多边形的位置关系。其功能模块划分图如下:点在凸多边形内外的判定应用判画断图点和与画凸点多边形的关系图功能模块划分图湖南工程学院课程设计报告功能模块的简介画图和画点模块主要实现用鼠标控制来画凸多边形和点。由此该模块需要响应鼠标消息并能满足画图中常见的重绘的功能。另外应该能对画图和画点进行切换。当图形已绘制完成后不能再对图形进行绘制而只能进行绘点。判断点与凸多边形的位置关系模块主要实现判断出画的点与画的图的位置关系并将结果显示在某控件中(在此为编辑框控件)。只有当图形和点绘制完成后才能进行判断。该判断的处理可以通过响应按钮消息来进行控制。另外点与凸多边形的位置关系的判断将使用射线法。主要功能的实现设计框架通过VC实现该课题的功能将在VC中建立一个对话框应用程序。建立的对话框应用程序的界面如下:图设计框架图湖南工程学院课程设计报告从图中可以看出:该程序框架包括三个部分:一:绘图区域。用VC中的静态文本控件表示该区域二:判断按钮。通过点击该按钮处理点凸多边形的位置关系的判断三:判断结果输出框。用VC中的文本编辑控件表示。点击判断按钮将在该控件中输出:“点在凸多边形内”或“点在凸多边形外”。绘图功能的实现通过鼠标来绘制绘制图形和点并将在静态文本控件中绘制图形所以需要响应对话框的鼠标消息并需要在静态文本的重绘函数OnPaint()中绘制图形和点。另外需要从静态文本控件CStatic类中派生自己的静态文本控件类DrawMapStatic类。在DrawMapStatic类中添加变量CArray<CPoint,CPoint>mpointArray和CPointcurrpoint分别用来存储凸多边形的顶点和绘制的点。通过点击鼠标左键确定图形绘制点通过VC里的工具类向导将变量DrawMapStaticmstatic与静态文本控件绑定。其关键代码如下:voidCMyDlg::OnLButtonDown(UINTnFlags,CPointpoint){LPRECTlpRect=newCRect()mstaticGetWindowRect(lpRect)ScreenToClient(lpRect)将屏幕坐标系改为客户坐标系若鼠标在静态文本控件中if(pointx<lpRect>rightpointx>lpRect>leftpointy<lpRect>bottompointy>lpRect>top){CPointpt获取鼠酣标在静态文本控件中的位置ptx=pointxlpRect>leftpty=pointylpRect>topif(mstaticIsDrawMap)正在绘制图形则将该点加入到凸边形顶点存储变量中mstaticmpointArrayAdd(pt)mstaticcurrpoint=pt标记当前绘制的点的位置if(mstaticIsDrawPie)若是绘制点则将该点赋值给绘制点的变量中{mstaticDrawpoint=pt}}mstaticInvalidate()使静态文本控件重绘CDialog::OnLButtonDown(nFlags,point)}湖南工程学院课程设计报告在静态文本控件中绘图在OnPaint()函数中其关键代码如下:voidDrawMapStatic::OnPaint(){CPaintDCdc(this)获取绘图设备intn=mpointArrayGetSize()获取当前图形顶点的个数CPenpen(PSSOLID,,RGB(,,))创建画笔dcSelectObject(pen)将画笔选入绘图设备中CBrush*pBrush=newCBrush(RGB(,,))创建画刷dcSelectObject(pBrush)将画刷选入图形设备中判断绘图是否结束假若当前画的点在开始点以为宽度的正方形内且点数大于则可判定if(n>=){CPointpt=mpointArrayGetAt()if(currpointx>ptxcurrpointx<ptxcurrpointy>ptycurrpointy<pty){mpointArraySetAt(n,mpointArrayGetAt())将图形最后的顶点设置为图形的第一个顶点值IsDrawMap=FALSE设置不能再进行绘图IsDrawed=TRUE设置绘图已经完成}}绘制图形for(inti=i<ni){绘制顶点将顶点绘制为以当前点为圆心半径为的填充的圆CPointpoint=mpointArrayGetAt(i)dcEllipse(pointx,pointy,pointx,pointy)绘制图形的边if(i<n){CPointp=mpointArrayGetAt(i)dcMoveTo(pointx,pointy)dcLineTo(px,py)}}绘制点if(IsDrawPieDrawpointx!=Drawpointy!=)dcEllipse(Drawpointx,Drawpointy,Drawpointx,Drawpointy)}湖南工程学院课程设计报告点与凸多边形位置关系的判断点与凸多边形的位置关系的判断将采用射线法。该算法的基本思想是由被测点向某个方向作射线计算此射线与多边形所有边交点的个数。若交点个数为奇数则被测点在多边形内若交点个数为偶数则被测点在多边形外部。在此判断算法中将采用以被测点竖直向下的方向作射线。其算法关键代码如下:用射线法判断点与凸多边形的关系射线方向为竖直向下for(intj=j<mstaticmpointArrayGetSize()j){获取当前边的两个端点p=mstaticmpointArrayGetAt(j)p=mstaticmpointArrayGetAt(j)确保p点的y值比p的y值大if(py>py){mp=pp=pp=mp}假如被测点在该边下方则该点竖直向下的射线与该边没交点if(mstaticDrawpointy<=py)continueelseif(mstaticDrawpointy>=py){被测点在边的两端点之上则需判断点的x值是否在边的两端点之间用mp保存p与p的x的值if(px>px){mpx=pxmpy=px}else{mpx=pxmpy=px}if(mstaticDrawpointx<mpy||mstaticDrawpointx>mpx){若被测点的x值没有在px和px之间则被测点与该边没有交点反之则有continue}else{count湖南工程学院课程设计报告}}else{若被测点在该边两端点之间则需判断被测点与边在竖直向下方向上的交点是否在被测点以下若是则有交点反之则没有。该判断可用二分法判断CPointpp=p,pp=p通过二分法将边取半分割最终将边分割成一点:mp,且该点与被测点的y值相等。do{mpx=(ppxppx)mpy=(ppyppy)if(mstaticDrawpointy>mpymstaticDrawpointy<ppy){pp=mp}elseif(mstaticDrawpointy<mpymstaticDrawpointy>ppy){pp=mp}elseif(mstaticDrawpointy==mpy)break}while(true)假若被测点的x值范围在mpx与px之间则被测点与该边有交点if((mstaticDrawpointx>mpxmstaticDrawpointx<px)||(mstaticDrawpointx<mpxmstaticDrawpointx>px))count}}通过count的值打印判断结果if(count)edit>SetWindowTextA("该点在凸多边形内")elseedit>SetWindowTextA("该点在凸多边形外")程序调试运行程序后将鼠标放入“绘制多边形的区域”鼠标光标将变为“十字架”型。然后右击鼠标弹出弹出式菜单选择“绘图”或“绘点”由此可以通过鼠标绘制凸多边形或点。运行图如下:湖南工程学院课程设计报告图点在凸多边形内的测试结果图点在凸多边形的测试结果湖南工程学院课程设计报告总结由于属于初学VC且时间有限所以对于前台的制作难免也诸多的不足很多东西都要马上学习查资料并进行初步调试即拿出来使用。而制作出的前台功能单一结构简单是一大缺憾没有时间进行精加工与进一步的调试补全源程序的不足之处使之更加完善。不过通过这次的课程设计使我们的自学能力与动手实践能力得到相当大的提高编程并不是靠看书本就能学会的而是要靠一步步的调试一条条指令的修改试运行中学习进步的盲目的看书并不能提高自己水平。从这次的课程设计我们知道了自己的不足学习的知识不够充分对于现有资源材料的利用学习率太低等方面的缺点对今后的学习和工作进步都有非常大的帮助。附件程序源代码如下:Resourceh资源文件#defineIDMABOUTBOXx#defineIDDABOUTBOX#defineIDSABOUTBOX#defineIDDMYDIALOG#defineIDRMAINFRAME#defineIDRMENU#defineIDCRESULTEDIT#defineIDCDRAWSTATIC#defineIDCADJUSTBUTTON#defineIDRMENUMAP#defineIDRMENUPIE#ifdefAPSTUDIOINVOKED#ifndefAPSTUDIOREADONLYSYMBOLS#defineAPSNEXTRESOURCEVALUE#defineAPSNEXTCOMMANDVALUE#defineAPSNEXTCONTROLVALUE#defineAPSNEXTSYMEDVALUE#endif#endif湖南工程学院课程设计报告StdAfxh文件#if!defined(AFXSTDAFXHEDDDABAFDBINCLUDED)#defineAFXSTDAFXHEDDDABAFDBINCLUDED#ifMSCVER>#pragmaonce#endifMSCVER>#defineVCEXTRALEANExcluderarelyusedstufffromWindowsheaders#include<afxwinh>MFCcoreandstandardcomponents#include<afxexth>MFCextensions#include<afxdisph>MFCAutomationclasses#include<afxdtctlh>MFCsupportforInternetExplorerCommonControls#ifndefAFXNOAFXCMNSUPPORT#include<afxcmnh>MFCsupportforWindowsCommonControls#endifAFXNOAFXCMNSUPPORT#endifDrawMapStatich文件#if!defined(AFXDRAWMAPSTATICHBDCCFBADBFINCLUDED)#defineAFXDRAWMAPSTATICHBDCCFBADBFINCLUDED#ifMSCVER>#pragmaonce#endifDrawMapStatich:headerfile#include<afxtemplh>classDrawMapStatic:publicCStatic{public:DrawMapStatic()CArray<CPoint,CPoint>mpointArrayCPointcurrpointCPointDrawpointBOOLIsDrawMapBOOLIsDrawPieBOOLIsDrawedpublic:virtual~DrawMapStatic()protected:湖南工程学院课程设计报告afxmsgvoidOnPaint()DECLAREMESSAGEMAP()}#endifDrawMapStaticcpp文件#include"stdafxh"#include"点在凸多边形内外的判定h"#include"DrawMapStatich"#ifdefDEBUG#definenewDEBUGNEW#undefTHISFILEstaticcharTHISFILE=FILE#endifDrawMapStatic::DrawMapStatic(){IsDrawMap=FALSEIsDrawPie=FALSEIsDrawed=FALSE}DrawMapStatic::~DrawMapStatic(){}BEGINMESSAGEMAP(DrawMapStatic,CStatic)ONWMPAINT()ENDMESSAGEMAP()在静态文本控件中绘制图形voidDrawMapStatic::OnPaint(){CPaintDCdc(this)intn=mpointArrayGetSize()CPenpen(PSSOLID,,RGB(,,))dcSelectObject(pen)CBrush*pBrush=newCBrush(RGB(,,))dcSelectObject(pBrush)if(n>=){CPointpt=mpointArrayGetAt()if(currpointx>ptxcurrpointx<ptxcurrpointy>ptycurrpointy<pty){mpointArraySetAt(n,mpointArrayGetAt())IsDrawMap=FALSEIsDrawed=TRUE湖南工程学院课程设计报告}}for(inti=i<ni){CPointpoint=mpointArrayGetAt(i)dcEllipse(pointx,pointy,pointx,pointy)if(i<n){CPointp=mpointArrayGetAt(i)dcMoveTo(pointx,pointy)dcLineTo(px,py)}}if(IsDrawPieDrawpointx!=Drawpointy!=)dcEllipse(Drawpointx,Drawpointy,Drawpointx,Drawpointy)}点在凸多边形内外的判定h文件#if!defined(AFXHADDEAFADDCADINCLUDED)#defineAFXHADDEAFADDCADINCLUDED#ifMSCVER>#pragmaonce#endifMSCVER>#ifndefAFXWINH#errorinclude'stdafxh'beforeincludingthisfileforPCH#endif#include"resourceh"mainsymbolsCMyApp:See点在凸多边形内外的判定cppfortheimplementationofthisclassclassCMyApp:publicCWinApp{public:CMyApp()OverridesClassWizardgeneratedvirtualfunctionoverrides{{AFXVIRTUAL(CMyApp)public:virtualBOOLInitInstance()}}AFXVIRTUALImplementation{{AFXMSG(CMyApp)湖南工程学院课程设计报告NOTEtheClassWizardwilladdandremovememberfunctionshereDONOTEDITwhatyouseeintheseblocksofgeneratedcode!}}AFXMSGDECLAREMESSAGEMAP()}{{AFXINSERTLOCATION}}MicrosoftVisualCwillinsertadditionaldeclarationsimmediatelybeforethepreviousline#endif!defined(AFXHADDEAFADDCADINCLUDED)点在凸多边形内外的判定cpp文件#include"StdAfxh"#include"点在凸多边形内外的判定h"#include"点在凸多边形内外的判定Dlgh"#ifdefDEBUG#definenewDEBUGNEW#undefTHISFILEstaticcharTHISFILE=FILE#endif消息映射表BEGINMESSAGEMAP(CMyApp,CWinApp)ONCOMMAND(IDHELP,CWinApp::OnHelp)ENDMESSAGEMAP()CMyApp::CMyApp(){}CMyApptheApp应用程序从该全局应用变量启动BOOLCMyApp::InitInstance(){AfxEnableControlContainer()#ifdefAFXDLLEnabledControls()CallthiswhenusingMFCinasharedDLL#elseEnabledControlsStatic()CallthiswhenlinkingtoMFCstatically#endifCMyDlgdlgmpMainWnd=dlgintnResponse=dlgDoModal()if(nResponse==IDOK){}elseif(nResponse==IDCANCEL)湖南工程学院课程设计报告{TODO:PlacecodeheretohandlewhenthedialogisdismissedwithCancel}Sincethedialoghasbeenclosed,returnFALSEsothatweexittheapplication,ratherthanstarttheapplication'smessagepumpreturnFALSE}点在凸多边形内外的判定Dlgh文件#if!defined(AFXDLGHCEEFECEBDCEFFFFINCLUDED)#defineAFXDLGHCEEFECEBDCEFFFFINCLUDED#ifMSCVER>#pragmaonce#endifMSCVER>#include"DrawMapStatich"classCMyDlg:publicCDialog{public:CMyDlg(CWnd*pParent=)standardconstructorDialogData{{AFXDATA(CMyDlg)enum{IDD=IDDMYDIALOG}DrawMapStaticmstatic}}AFXDATAClassWizardgeneratedvirtualfunctionoverrides{{AFXVIRTUAL(CMyDlg)protected:virtualvoidDoDataExchange(CDataExchange*pDX)DDXDDVsupportvirtualBOOLOnCommand(WPARAMwParam,LPARAMlParam)}}AFXVIRTUALImplementationprotected:HICONmhIconGeneratedmessagemapfunctions{{AFXMSG(CMyDlg)virtualBOOLOnInitDialog()afxmsgvoidOnSysCommand(UINTnID,LPARAMlParam)afxmsgvoidOnPaint()afxmsgHCURSOROnQueryDragIcon()afxmsgvoidOnLButtonDown(UINTnFlags,CPointpoint)afxmsgvoidOnMouseMove(UINTnFlags,CPointpoint)afxmsgvoidOnRButtonDown(UINTnFlags,CPointpoint)DECLAREMESSAGEMAP()public:湖南工程学院课程设计报告afxmsgvoidOnIdrMenumap()afxmsgvoidOnIdrMenupie()afxmsgvoidOnClickedAdjustbutton()}#endif!defined(AFXDLGHCEEFECEBDCEFFFFINCLUDED)点在凸多边形内外的判定Dlgcpp文件#include"StdAfxh"#include"点在凸多边形内外的判定h"#include"点在凸多边形内外的判定Dlgh"#ifdefDEBUG#definenewDEBUGNEW#undefTHISFILEstaticcharTHISFILE=FILE#endifclassCAboutDlg:publicCDialog{public:CAboutDlg()enum{IDD=IDDABOUTBOX}protected:virtualvoidDoDataExchange(CDataExchange*pDX)DDXDDVsupportprotected:{{AFXMSG(CAboutDlg)}}AFXMSGDECLAREMESSAGEMAP()}CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){{{AFXDATAINIT(CAboutDlg)}}AFXDATAINIT}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX){{AFXDATAMAP(CAboutDlg)}}AFXDATAMAP}BEGINMESSAGEMAP(CAboutDlg,CDialog)ENDMESSAGEMAP()CMyDlg::CMyDlg(CWnd*pParent*=*):CDialog(CMyDlg::IDD,pParent){{{AFXDATAINIT(CMyDlg)}}AFXDATAINIT湖南工程学院课程设计报告NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWinmhIcon=AfxGetApp()>LoadIcon(IDRMAINFRAME)}voidCMyDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX){{AFXDATAMAP(CMyDlg)DDXControl(pDX,IDCDRAWSTATIC,mstatic)}}AFXDATAMAP}BEGINMESSAGEMAP(CMyDlg,CDialog){{AFXMSGMAP(CMyDlg)ONWMSYSCOMMAND()ONWMPAINT()ONWMQUERYDRAGICON()ONWMLBUTTONDOWN()ONWMMOUSEMOVE()ONWMRBUTTONDOWN()ONCOMMAND(IDRMENUMAP,CMyDlg::OnIdrMenumap)ONCOMMAND(IDRMENUPIE,CMyDlg::OnIdrMenupie)ONBNCLICKED(IDCADJUSTBUTTON,CMyDlg::OnClickedAdjustbutton)ENDMESSAGEMAP()BOOLCMyDlg::OnInitDialog(){CDialog::OnInitDialog()Add"About"menuitemtosystemmenuIDMABOUTBOXmustbeinthesystemcommandrangeASSERT((IDMABOUTBOXxFFF)==IDMABOUTBOX)ASSERT(IDMABOUTBOX<xF)CMenu*pSysMenu=GetSystemMenu(FALSE)if(pSysMenu!=){CStringstrAboutMenustrAboutMenuLoadString(IDSABOUTBOX)if(!strAboutMenuIsEmpty()){pSysMenu>AppendMenu(MFSEPARATOR)pSysMenu>AppendMenu(MFSTRING,IDMABOUTBOX,strAboutMenu)}}SettheiconforthisdialogTheframeworkdoesthisautomaticallywhentheapplication'smainwindowisnotadialogSetIcon(mhIcon,TRUE)SetbigiconSetIcon(mhIcon,FALSE)SetsmalliconreturnTRUEreturnTRUEunlessyousetthefocustoacontrol湖南工程学院课程设计报告}voidCMyDlg::OnSysCommand(UINTnID,LPARAMlParam){if((nIDxFFF)==IDMABOUTBOX){CAboutDlgdlgAboutdlgAboutDoModal()}else{CDialog::OnSysCommand(nID,lParam)}}Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelowtodrawtheiconForMFCapplicationsusingthedocumentviewmodel,thisisautomaticallydoneforyoubytheframeworkvoidCMyDlg::OnPaint(){if(IsIconic()){CPaintDCdc(this)devicecontextforpaintingSendMessage(WMICONERASEBKGND,(WPARAM)dcGetSafeHdc(),)CentericoninclientrectangleintcxIcon=GetSystemMetrics(SMCXICON)intcyIcon=GetSystemMetrics(SMCYICON)CRectrectGetClientRect(rect)intx=(rectWidth()cxIcon)inty=(rectHeight()cyIcon)DrawtheicondcDrawIcon(x,y,mhIcon)}else{CDialog::OnPaint()}mstaticInvalidate()重绘静态文本框}ThesystemcallsthistoobtainthecursortodisplaywhiletheuserdragstheminimizedwindowHCURSORCMyDlg::OnQueryDragIcon(){return(HCURSOR)mhIcon}湖南工程学院课程设计报告voidCMyDlg::OnLButtonDown(UINTnFlags,CPointpoint){LPRECTlpRect=newCRect()mstaticGetWindowRect(lpRect)获取静态文本控件的区域ScreenToClient(lpRect)将屏幕坐标括系改为客户坐标系若鼠标在静态文本控件中if(pointx<lpRect>rightpointx>lpRect>leftpointy<lpRect>bottompointy>lpRect>top){CPointpt获取鼠标在静态文本控件中的位置ptx=pointxlpRect>leftpty=pointylpRect>topif(mstaticIsDrawMap)正在绘制图形则将该点加入到凸边形顶点存储变量中mstaticmpointArrayAdd(pt)mstaticcurrpoint=pt标记当前绘制的点的位置if(mstaticIsDrawPie)若是绘制点则将该点赋值给绘制点的变量中{mstaticDrawpoint=pt}}mstaticInvalidate()CDialog::OnLButtonDown(nFlags,point)}voidCMyDlg::OnMouseMove(UINTnFlags,CPointpoint){TODO:AddyourmessagehandlercodehereandorcalldefaultLPRECTlpRect=newCRect()mstaticGetWindowRect(lpRect)ScreenToClient(lpRect)若鼠标移动到静态文本控件中则改变鼠标的光标if(pointx<lpRect>rightpointx>lpRect>leftpointy<lpRect>bottompointy>lpRect>top){::SetCursor(AfxGetApp()>LoadStandardCursor(IDCCROSS))}else{::SetCursor(AfxGetApp()>LoadStandardCursor(IDCARROW))}mstaticInvalidate()CDialog::OnMouseMove(nFlags,point)}湖南工程学院课程设计报告voidCMyDlg::OnRButtonDown(UINTnFlags,CPointpoint){TODO:AddyourmessagehandlercodehereandorcalldefaultPOINTscreenPoint=pointClientToScreen(screenPoint)LPRECTlpRect=newCRect()mstaticGetWindowRect(lpRect)ScreenToClient(lpRect)在静态文本控件内通过鼠标右键来显示出弹出菜单选择绘图或绘点的功能if(pointx<lpRect>rightpointx>lpRect>leftpointy<lpRect>bottompointy>lpRect>top){CMenumenuVERIFY(menuLoadMenu(IDRMENU))CMenu*pPopup=menuGetSubMenu()ASSERT(pPopup!=)if(mstaticIsDrawPie){pPopup>CheckMenuItem(IDRMENUMAP,MFUNCHECKED)pPopup>CheckMenuItem(IDRMENUPIE,MFCHECKED)}else{pPopup>CheckMenuItem(IDRMENUPIE,MFUNCHECKED)if(mstaticIsDrawMap)pPopup>CheckMenuItem(IDRMENUMAP,MFCHECKED)}pPopup>TrackPopupMenu(TPMLEFTALIGN|TPMRIGHTBUTTON,screenPointx,screenPointy,AfxGetMainWnd())}CDialog::OnRButtonDown(nFlags,point)}BOOLCMyDlg::OnCommand(WPARAMwParam,LPARAMlParam){TODO:AddyourspecializedcodehereandorcallthebaseclassreturnCDialog::OnCommand(wParam,lParam)}voidCMyDlg::OnIdrMenumap(){TODO:在此添加命令处理程序代码if(!mstaticIsDrawed){mstaticIsDrawMap=TRUEmstaticIsDrawPie=FALSE}湖南工程学院课程设计报告mstaticInvalidate()}voidCMyDlg::OnIdrMenupie(){TODO:在此添加命令处理程序代码mstaticIsDrawPie=TRUEmstaticIsDrawMap=FALSEmstaticInvalidate()}判断点与多边形的位置关系voidCMyDlg::OnClickedAdjustbutton(){凸多边形和点已绘制完成LONGminx,maxx,miny,maxyif(mstaticIsDrawedmstaticIsDrawPie){CEdit*edit=(CEdit*)GetDlgItem(IDCRESULTEDIT)确定凸多边形的边界minx=mstaticmpointArrayGetAt()xmaxx=minxminy=mstaticmpointArrayGetAt()ymaxy=minyfor(inti=i<mstaticmpointArrayGetSize()i){if(minx>mstaticmpointArrayGetAt(i)x)minx=mstaticmpointArrayGetAt(i)xif(maxx<mstaticmpointArrayGetAt(i)x)maxx=mstaticmpointArrayGetAt(i)xif(miny>mstaticmpointArrayGetAt(i)y)miny=mstaticmpointArrayGetAt(i)yif(maxy<mstaticmpointArrayGetAt(i)y)maxy=mstaticmpointArrayGetAt(i)y}假若点在凸多边形边界外则可判断该点在凸多边形外if(mstaticDrawpointx<minx||mstaticDrawpointx>maxx||mstaticDrawpointy<miny||mstaticDrawpointy>maxy){edit>SetWindowTextA("该点在凸多边形外")return}CPointp,p,mp湖南工程学院课程设计报告intcount=用射线法判断点与凸多边形的关系射线方向为竖直向下for(intj=j<mstaticmpointArrayGetSize()j){p=mstaticmpointArrayGetAt(j)p=mstaticmpointArrayGetAt(j)确保点p的y值比p的大if(py>py){mp=pp=pp=mp}假如点在该边下方则该点竖直向下的射线与该边没交点if(mstaticDrawpointy<=py)continueelseif(mstaticDrawpointy>=py){被测点在边的两端点之上则需判断点的x值是否在边的两端点之间用mp保存p与p的x的值if(px>px){mpx=pxmpy=px}else{mpx=pxmpy=px}if(mstaticDrawpointx<mpy||mstaticDrawpointx>mpx){continue}else{count}}else{若被测点在该边两端点之间则需判断被测点与边在竖直向下方向上的交点是否在被测点以下若是则有交点反之则没有。该判断可用二分法判断CPointpp=p,pp=pdo{湖南工程学院课程设计报告mpx=(ppxppx)mpy=(ppyppy)if(mstaticDrawpointy>mpymstaticDrawpointy<ppy){pp=mp}elseif(mstaticDrawpointy<mpymstaticDrawpointy>ppy){pp=mp}elseif(mstaticDrawpointy==mpy)break}while(true)假若被测点的x值范围在mpx与px之间则被测点与该边有交点if((mstaticDrawpointx>mpxmstaticDrawpointx<px)||(mstaticDrawpointx<mpxmstaticDrawpointx>px))count}}if(count==)edit>SetWindowTextA("该点在凸多边形内")elseedit>SetWindowTextA("该点在凸多边形外")}}计算机与通信学院课程设计评分表课程名称:计算机图形学项目评价设计方案的合理性与创造性设计与调试结果设计说明书的质量答辩陈述与回答问题情况课程设计周表现情况综合成绩教师签名:日期:

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/39

第1组&#40;点在凸多边形内外的判定&#41;

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利