1TIN三角网存储与显示21513129贺佳伟程序设计与实现的基本思路:采用面向对象的思想,自定义算法实现过程中需要的点、边、面类。程序中定义的变量protected:inti;POINTP[10];//点集public:boolf;//返回true/false实现鼠标输入散点代码如下CMy21513129View::CMy21513129View(){//TODO:addconstructioncodeheref=false;//f初值设为假}if(f){CClientDCdc(this);CPenpen;//创建画笔pen.CreatePen(PS_SOLID,6,RGB(255,0,0));//定义画笔属性CPen*pOldpen=dc.SelectObject(&pen);//把点画大2dc.Ellipse(point.x,point.y,point.x+3,point.y+3);P1.push_back(point);}定义容器/////////////////////容器///////////////////vectorCPointP1;//点vectorLineL2;//线vectorPolygonP3;//面线数据存储结构体structLine//直线结构体{CPointp1;CPointp2;};面数据存储结构体structPolygon//多边形结构体,这里选用三角形{CPointp1;//CPoint是一个坐标类CPointp2;CPointp3;3};散点生成本次实验通过三种方式实现散点的读入,分别是随机生成、鼠标输入、文本读入(txt文档)。1.随机生成随机生成x个点模拟一般建立TIN的点文件,将这x个点放入全局变量点数组中。x可以通过修改宏定义#definePNUMBER10,从而定义不同个数的随机点。TIN生成后,可以在MFC窗口自动绘图显示。2.鼠标输入通过鼠标取点读入点数据,并存储到vectorCPointP1中。3.文本读入(txt文档)利用事先设置好测试数据文档读入散点,并存储到vectorCPointP1中。程序中用到的自定义函数voidCMy21513129View::displaynumf();//左下角显示三角形个数voidCMy21513129View::displaynump();//左下角显示点个数boolIsPointsBuildTriangle(intp1,intp2,intp3);//判断该三角形是否存在4boolIsPointInCircle(intt,intr1,intr2,intr3);////判断序列号为t的点是否在该三角形外接圆内voidCMy21513129View::Triangle(CPointp1,CPointp2,CPointp3)//绘制三角形boolCMy21513129View::IsLine(CPointp1,CPointp2)//判断是否存在此线段boolCMy21513129View::IsT(CPointp1,CPointp2,CPointp3)//判断容器中是否已经存在此三角形程序中的事件处理程序voidCMy21513129View::OnMouseMove(UINTnFlags,CPointpoint)//读取鼠标所在位置点的坐标voidCMy21513129View::OnGeneratePoints()//随机生成点voidCMy21513129View::OnMouse()//鼠标读点voidCMy21513129View::OnLButtonDown(UINTnFlags,CPointpoint)//鼠标响应voidCMy21513129View::OnTin()//Tin实现voidCMy21513129View::OnPoint()//生成点注记voidCMy21513129View::OnLine()//生成线注记voidCMy21513129View::OnSurface()//生成面注记voidCMy21513129View::OnQCsj()//清屏并清除存处数据voidCMy21513129View::OnSaveV()//保存点坐标5voidCMy21513129View::OnSaveE()//保存边关系voidCMy21513129View::OnSaveF()//保存面关系voidCMy21513129View::OnText()//文本读入voidCMy21513129View::OnMtpgx()//面拓扑关系voidCMy21513129View::OnXtpgx()//线拓扑关系程序中使用的算法由离散样本点生成Delaunay三角网有多种算法,每个算法的执行效率都不一样,本次程序采用一种最简单,最低效,但是算法逻辑最清晰的一种。Delaunay三角网必须满足的一个条件是任何一个三角形的外接圆都不能包含其他任何一个样本点,具体步骤如下:枚举所有可能的三角形判断其外接圆是否不包含任何其他样本点的,如果满足,则记录该三角形,直到所有三角形枚举完毕。输出文件的存储结构点产生后,可输出点文件。TIN三角网绘出后,可输出边文件和面文件。文件均以txt格式存储。点文件有三列,第一列为编号,第二列为x坐标,第三列为y坐标。边文件有三列,第一列为编号,第二到第三列为该边的两个端点6的编号。面文件有四列,第一列为编号,第二到第四列为三角形三个顶点的编号。菜单设计一级菜单二级菜单散点生成随机生成文本读入鼠标输入生成注记点注记线注记面注记TIN保存点数据线数据面数据清除数据显示拓扑关系线拓扑关系面拓扑关系7状态栏显示鼠标坐标位置本次在程序中实现在状态栏显示鼠标坐标位置具体实现步骤如下:1.打开ResourceView,右击Menu菜单,插入Menu,在空白处双击,Caption中填入Point。为Point设置下拉菜单,ID为ID_INDICATOR_POINT;Caption为point;Prompt为X:XXXX,Y:YYYY。2.打开MainFrm.cpp,在indicators数组中的第二个位置添加ID_INDICATOR_POINT。3.将MainFrm中的成员变量m_wndStatusBar修改为公有变量,并在视图类中添加头文件#includeMainFrm.h。4.利用类向导添加鼠标移动消息处理函数WM_MOUSEMOVE(),代码可以在源程序中查到:程序实现过程中改进之处1.经核查发现点存储缺乏第一个点已纠正。2.本次程序采用一种最简单,最低效,但是算法逻辑最清晰的一种,但是由于要比较所有可能三角形,所以消耗的时间较长,数据量较大时,不宜使用(亲测1000个点耗时5min以上)。具体步骤如下:枚举所有可能的三角形。8判断其外接圆是否不包含任何其他样本点的,如果满足,则记录该三角形,直到所有三角形枚举完毕。3.实现在状态栏显示鼠标坐标位置、点个数和三角形个数。