|
程序主函数
#include "stdafx.h"
#include "CreatePolygons.h"
#include "CreateTopology.h"
int _tmain(int argc, _TCHAR* argv[])
{
//数据的存储路径
const char *filename = "G://topology//Lines.txt";
CreatePolygons Polygons;
CreatePolygons* CPolygon = &Polygons;
CPolygon->OpenFile(filename);//在文本中读取点和弧段数据
CPolygon->MainCreatePolygons();//自动生成多边形,并记录有效信息
//在多边形中提取有效信息,建立拓扑关系
CreateTopology Topologys;
CreateTopology* CTopologys = &Topologys;
CTopologys->GetPoint(CPolygon->Points);//得到点数据
CTopologys->BuildArcPoints(CPolygon->Arcs);//建立弧段-点关系表
CTopologys->BuildPolArc(CPolygon->Polygons);//建立多边形-弧段关系表
CTopologys->BuildArcPol(CPolygon->Arcs, CPolygon->Polygons);//建立弧段-多边形关系表
CTopologys->PrintTopTables();//显示拓扑表
system("pause");
return 0;
}
程序数据结构
#ifndef _datamodel_h_
#define _datamodel_h_
#include
using namespace std;
//点的结构
struct Point
{
int ID;
float X;
float Y;
};
//弧段结构
struct Arc
{
vector Points;
string ID;//弧段的编号
int TimeOfSearch;//遍历次数
int Direction;//弧段的方向
};
//生成多边形时,弧段及当时弧段的方向
struct ArcDir
{
Arc* arcs;
int Direction;
};
//构建多边形的结构
struct Polygon
{
vector ArcPts;//生成多边形时当时的弧段信息
char ID;//多边形的编号
double area;//多边形的面积
vector Points;//多边形的点
};
//点-弧结构
struct PointArcs
{
int pointID;
vector arcs;
};
//弧段的夹角信息
struct Angle
{
double angle;
Arc* arcs;
int Direction;
};
//拓扑数据结构设计--链状双重独立编码
struct TPolArc //多边形-弧段关系表
{
char PolID;
vector ArcID;
};
struct TArcPoints//弧段-点关系表
{
string ArcID;
vector PointID;
};
struct TArcPol//弧段-多边形关系表
{
string ArcID;
int StartID;
int EndID;
char LeftP;
char RightP;
};
//岛的结构
struct Island
{
char OutPolID;
char InPolID;
string AfterID;
string BeforeID;
};
#endif
#pragma once
#include "DataModel.h"
#include "math.h"
#include
using namespace std;
/********************************************************************
created:2009/02/16
created:16:2:2009 21:48
filename: g:/topology/topology/CreatePolygons.h
file path:g:/topology/topology
file base:CreatePolygons
author:huyu
purpose:自动生成拓扑多边形,并记录其有效信息
*********************************************************************/
class CreatePolygons
{
public:
CreatePolygons(void);
~CreatePolygons(void);
//打开文件,将数据加载弧段-点表数据
bool OpenFile(const char *filename);
//生成多边形
void MainCreatePolygons(void);
vector Points;//所有的点记录
vector Arcs;//所有的弧段(弧-点表)
vector Pointarcs;//点-弧表
vector Polygons;//记录图上上有多边形图
static char Pid;//多边形开始标示(A)
private:
//建立点-弧表
void CreatePointArcs(void);
//自动生成一个多边形
Polygon* CreateOnePolygon(Arc* cuarc);
//自动生成多边形图
void Createpolygons(Arc* cuarc);
//求两个弧段的夹角(逆时针夹角)
double AngleOfTwoArcs(Point* start, Point* inf, Point* end);
//得到多边形上的所有点序列
vector GetPlPoints(Polygon* polygon);
//求多边形的面积
double GetArea(vector pPoint);
//删除不符的多边形(即面积最大一个多边形)
void RemoveMaxPolygon(vector& Polygons);
//有当前弧段得到扩展弧段(多边形的下一个弧段)
Arc* GetNextArc(Arc* cuarc);
//通过点搜索与该点连接的弧段
PointArcs* SearchPtArcsByPt(Point* pt);
Point* SearchPointbyID(int ID);
Arc* SearchArcbyID(string ID);
Angle GetMinAngle(vector angles);
Angle MinAngle;//记录夹角的最小值和方向
vector Angles;//记录一条弧段与其他弧段的角度及方向
};
#pragma once
#include "DataModel.h"
#include
using namespace std;
/********************************************************************
created:2009/02/16
created:16:2:2009 21:50
filename: g:/topology/topology/CreateTopology.h
file path:g:/topology/topology
file base:CreateTopology
author:huyu
purpose:根据生成多边形时记录的信息,使用链状双重独立编码表达拓扑关系,
并在屏幕上显示出来
*********************************************************************/
class CreateTopology
{
public:
CreateTopology(void);
~CreateTopology(void);
//得到所有点的数据
void GetPoint(vector Points);
//建立弧段-点关系表
void BuildArcPoints(vector Arcs);
//建立多边形-弧段关系表
void BuildPolArc(vector Polygons);
//建立弧段-多边形关系表
void BuildArcPol(vector arcs, vector Polygons);
//显示拓扑表
void PrintTopTables(void);
vector Arcpoints;//弧段-点关系表
vector PolArc;//多边形-弧段关系表
vector ArcPol;//弧段-多边形关系表
vector Points;//点记录
private:
//判断是否为岛
bool PtInisland(vector Polygons, Polygon* polygon);
//点是否在多边形中
bool PtInRegion(Point* point, vector pllPoint);
double IsLeft(Point *P0, Point *P1, Point *P2 );
//如果存在岛,将组成岛的弧段添加到多边形上
void ModifyPol(char PolID);
Island islandinfo;
}; |
|