c语言拓扑多边形自动生成,拓扑多边形生成算法(C++源码)一
程序主函數(shù)
#include "stdafx.h"
#include "CreatePolygons.h"
#include "CreateTopology.h"
int _tmain(int argc, _TCHAR* argv[])
{
//數(shù)據(jù)的存儲路徑
const char *filename = "G://topology//Lines.txt";
CreatePolygons Polygons;
CreatePolygons* CPolygon = &Polygons;
CPolygon->OpenFile(filename);//在文本中讀取點和弧段數(shù)據(jù)
CPolygon->MainCreatePolygons();//自動生成多邊形,并記錄有效信息
//在多邊形中提取有效信息,建立拓?fù)潢P(guān)系
CreateTopology Topologys;
CreateTopology* CTopologys = &Topologys;
CTopologys->GetPoint(CPolygon->Points);//得到點數(shù)據(jù)
CTopologys->BuildArcPoints(CPolygon->Arcs);//建立弧段-點關(guān)系表
CTopologys->BuildPolArc(CPolygon->Polygons);//建立多邊形-弧段關(guān)系表
CTopologys->BuildArcPol(CPolygon->Arcs, CPolygon->Polygons);//建立弧段-多邊形關(guān)系表
CTopologys->PrintTopTables();//顯示拓?fù)浔?/p>
system("pause");
return 0;
}
程序數(shù)據(jù)結(jié)構(gòu)
#ifndef _datamodel_h_
#define _datamodel_h_
#include
using namespace std;
//點的結(jié)構(gòu)
struct Point
{
int ID;
float X;
float Y;
};
//弧段結(jié)構(gòu)
struct Arc
{
vector Points;
string ID;//弧段的編號
int TimeOfSearch;//遍歷次數(shù)
int Direction;//弧段的方向
};
//生成多邊形時,弧段及當(dāng)時弧段的方向
struct ArcDir
{
Arc* arcs;
int Direction;
};
//構(gòu)建多邊形的結(jié)構(gòu)
struct Polygon
{
vector ArcPts;//生成多邊形時當(dāng)時的弧段信息
char ID;//多邊形的編號
double area;//多邊形的面積
vector Points;//多邊形的點
};
//點-弧結(jié)構(gòu)
struct PointArcs
{
int pointID;
vector arcs;
};
//弧段的夾角信息
struct Angle
{
double angle;
Arc* arcs;
int Direction;
};
//拓?fù)鋽?shù)據(jù)結(jié)構(gòu)設(shè)計--鏈狀雙重獨立編碼
struct TPolArc //多邊形-弧段關(guān)系表
{
char PolID;
vector ArcID;
};
struct TArcPoints//弧段-點關(guān)系表
{
string ArcID;
vector PointID;
};
struct TArcPol//弧段-多邊形關(guān)系表
{
string ArcID;
int StartID;
int EndID;
char LeftP;
char RightP;
};
//島的結(jié)構(gòu)
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:自動生成拓?fù)涠噙呅?#xff0c;并記錄其有效信息
*********************************************************************/
class CreatePolygons
{
public:
CreatePolygons(void);
~CreatePolygons(void);
//打開文件,將數(shù)據(jù)加載弧段-點表數(shù)據(jù)
bool OpenFile(const char *filename);
//生成多邊形
void MainCreatePolygons(void);
vector Points;//所有的點記錄
vector Arcs;//所有的弧段(弧-點表)
vector Pointarcs;//點-弧表
vector Polygons;//記錄圖上上有多邊形圖
static char Pid;//多邊形開始標(biāo)示(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);
//有當(dāng)前弧段得到擴展弧段(多邊形的下一個弧段)
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:根據(jù)生成多邊形時記錄的信息,使用鏈狀雙重獨立編碼表達(dá)拓?fù)潢P(guān)系,
并在屏幕上顯示出來
*********************************************************************/
class CreateTopology
{
public:
CreateTopology(void);
~CreateTopology(void);
//得到所有點的數(shù)據(jù)
void GetPoint(vector Points);
//建立弧段-點關(guān)系表
void BuildArcPoints(vector Arcs);
//建立多邊形-弧段關(guān)系表
void BuildPolArc(vector Polygons);
//建立弧段-多邊形關(guān)系表
void BuildArcPol(vector arcs, vector Polygons);
//顯示拓?fù)浔?/p>
void PrintTopTables(void);
vector Arcpoints;//弧段-點關(guān)系表
vector PolArc;//多邊形-弧段關(guān)系表
vector ArcPol;//弧段-多邊形關(guān)系表
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;
};
總結(jié)
以上是生活随笔為你收集整理的c语言拓扑多边形自动生成,拓扑多边形生成算法(C++源码)一的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Python工具箱系列(八)
- 下一篇: git pull和git pull or
