c语言拓扑多边形自动生成,拓扑多边形生成算法(C++源码)一

程序主函数

#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;

};

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//样本程序: 旋转的六边形 #include "stdafx.h" #include #include #define PI 3.14159 //设置圆周率 int n=6, R=10; //多边形变数,外接圆半径 float theta=0.0; //旋转初始角度值 void Keyboard(unsigned char key, int x, int y); void Display(void); void Reshape(int w, int h); void myidle(); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); char *argv[] = {"hello ", " "}; int argc = 2; // must/should match the number of strings in argv glutInit(&argc;, argv); //初始化GLUT库; glutInitWindowSize(700,700); //设置显示窗口大小 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //设置显示模式;(注意双缓冲) glutCreateWindow("A Rotating Square"); // 创建显示窗口 glutDisplayFunc(Display); //注册显示回调函数 glutReshapeFunc(Reshape); //注册窗口改变回调函数 glutIdleFunc(myidle); //注册闲置回调函数 glutMainLoop(); //进入事件处理循环 return 0; } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,0,0); //设置红色绘图颜色 glBegin(GL_POLYGON); //开始绘制六边形 for (int i=0;i=2*PI) theta-=2*PI; glutPostRedisplay(); //重画,相当于重新调用Display(),改编后的变量得以传给绘制函数 } void Reshape(GLsizei w,GLsizei h) { glMatrixMode(GL_PROJECTION); //投影矩阵模式 glLoadIdentity(); //矩阵堆栈清空 gluOrtho2D(-1.5*R*w/h,1.5*R*w/h,-1.5*R,1.5*R); //设置裁剪窗口大小 glViewport(0,0,w,h); //设置视区大小 glMatrixMode(GL_MODELVIEW); //模型矩阵模式 }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值