GIS多边形拓扑生成算法

算法步骤:

(1)得到第一条弧段A,并设置为当前弧段;

(2)判断PL (A)和PR (A)是否为空。如果都非空,转到第一步,当所有 弧段处理完毕后,算法结束;

(3)如果左多边形为空,则创建一个新的多边形P,多边形的第一条 弧段为当前弧段,并设置PL (A)=P,设置搜寻起始节点为N0=Ns (A),搜 寻当前节点为NC=NE (A)。如果右多边形为空,则创建一个新的多边形 P,多边形的第一条弧段为当前弧段,并设置PR (A)=P,设置搜寻起始 节点N0=NE (A),搜寻当前节点NC=NS (A)。

(4)判断N0和NC是否相等,如果是,则多边形所有弧段都已经找到, 转到第一步。

(5)检查与当前节点相连接的、已经排列好的弧段序列,将当前弧段 的下一条弧段A'作为多边形的第二条弧段。

(6)如果NC=NS (A '),设置PL (A ')=P,令NC=NE (A');如果NC= NE (A'), 设置PR (A ')=P,令NC=NS (A'),转到第四步。


实例:

 


程序说明:

1:定义了弧线类Arc:弧线编号 name,弧线起始点NS,弧线结束点NE,左多边形Pl,右多边形Pr;用构造函数:Arc(int s, int t, int m)来赋值;

class Arc//定义弧线类
{
public:
	Arc(int s, int t, int m)//定义构造函数
	{
		name = s;
		NS = t;
		NE = m;
		Pl = 0;
		Pr = 0;
	}
	int Pl;//弧线左多边形编号
	int Pr;//弧线右多边形编号
	int name;//弧线编号
	int NS;//弧线起始点编号
	int NE;//弧线终点编号
};

 2:定义了点类Point:点编号 name,点连接弧线数n,数组a[3] 顺时针存贮弧线编号

构造函数:Point(int s, int t, const int b[3])用来赋值;

class Point//定义点类
{
public:
		Point(int s, int t, const int b[3]) //定义构造函数
		{
			name = s;
			n = t;
			for (int i = 0; i < 3; i++)  a[i] = b[i];
		} 
	int name;//点编号
	int n;//连接弧线数目
	int a[3];//顺时针弧线点号
};

3:首先通过构造函数完成点类数组和弧线类数组的生成。将所有弧线的左右多边形设置为0,多边形序号从1开始计,每完成一个多边形,则多边形序号加一。然后按照多边形拓扑生成算法进行编程实现。


结果:

 


缺陷:本程序只应对实例给出,并非通用程序,运用时需要修改数组长度。


代码:

#include<iostream>
using namespace std;
class Arc//定义弧线类
{
public:
	Arc(int s, int t, int m)//定义构造函数
	{
		name = s;
		NS = t;
		NE = m;
		Pl = 0;
		Pr = 0;
	}
	int Pl;//弧线左多边形编号
	int Pr;//弧线右多边形编号
	int name;//弧线编号
	int NS;//弧线起始点编号
	int NE;//弧线终点编号
};
class Point//定义点类
{
public:
		Point(int s, int t, const int b[3]) //定义构造函数
		{
			name = s;
			n = t;
			for (int i = 0; i < 3; i++)  a[i] = b[i];
		} 
	int name;//点编号
	int n;//连接弧线数目
	int a[3];//顺时针弧线点号
};
int main()//解决问题
{
	//点录入
	int b1[3] = { 3,2,1 };
	int b2[3] = { 4,6,1 };
	int b3[3] = { 2,5,4 };
	int b4[3] = { 3,6,5 };
	Point point[4] = { Point(1,3,b1),
		Point(2,3,b2),
	    Point(3,3,b3),
		Point(4,3,b4),
	};
	//弧线录入
	Arc arc[6] = {Arc (1,1,2),
		Arc(2,3,1),
		Arc(3,4,1),
		Arc(4,2,3),
		Arc(5,3,4),
		Arc(6,2,4),
	};
	int DBX = 1;//面的编号从1开始
	int B;//标记的边的名称
	int N0,Nc;
	//算法第一步
	for (int i = 0; i < 6; i++)//依次录入每条边
	{
		if (arc[i].Pl == 0)//左多边形为空
		{
			arc[i].Pl = DBX;
			N0 = arc[i].NS;
			Nc = arc[i].NE;
			B = i+1;
			while (N0 != Nc)
			{
				if (point[Nc - 1].a[0] == B)
				{
					if (arc[point[Nc - 1].a[1] - 1].NS == Nc)
					{
						arc[point[Nc - 1].a[1] - 1].Pl = DBX;
						B = point[Nc - 1].a[1];
						Nc = arc[point[Nc - 1].a[1] - 1].NE;
					}
				    else if (arc[point[Nc - 1].a[1] - 1].NE == Nc)
					{
						arc[point[Nc - 1].a[1] - 1].Pr = DBX;
						B = point[Nc - 1].a[1];
						Nc = arc[point[Nc - 1].a[1] - 1].NS;
					}
				}
				else 
					if (point[Nc - 1].a[1] == B)
					{
						if (arc[point[Nc - 1].a[2] - 1].NS == Nc)
						{
							arc[point[Nc - 1].a[2] - 1].Pl = DBX;
							B = point[Nc - 1].a[2];
							Nc = arc[point[Nc - 1].a[2] - 1].NE;
						}
						else if (arc[point[Nc - 1].a[2]-1].NE == Nc)
						{
							arc[point[Nc - 1].a[2] - 1].Pr = DBX;
							B = point[Nc - 1].a[2];
							Nc = arc[point[Nc - 1].a[2]-1].NS;
						}
					}
					else  if (point[Nc - 1].a[2] == B)
					{
						if (arc[point[Nc - 1].a[0]-1].NS == Nc)
						{
							arc[point[Nc - 1].a[0]-1].Pl = DBX;
							B = point[Nc - 1].a[0];
							Nc = arc[point[Nc - 1].a[0]-1].NE;
						}
						else if (arc[point[Nc - 1].a[0]-1].NE == Nc)
						{
							arc[point[Nc - 1].a[0]-1].Pr = DBX;
							B = point[Nc - 1].a[0];
							Nc = arc[point[Nc - 1].a[0]-1].NS;
						}
					}
			}
			DBX = DBX + 1;
		}
		else if (arc[i].Pr == 0)
		{
			arc[i].Pr = DBX;
			N0 = arc[i].NE;
			Nc = arc[i].NS;
			B = i + 1;
			while (N0 != Nc)
			{
				if (point[Nc - 1].a[0] == B)
				{
					if (arc[point[Nc - 1].a[1] - 1].NS == Nc)
					{
						arc[point[Nc - 1].a[1] - 1].Pl = DBX;
						B = point[Nc - 1].a[1];
						Nc = arc[point[Nc - 1].a[1] - 1].NE;
					}
					else if (arc[point[Nc - 1].a[1] - 1].NE == Nc)
					{
						arc[point[Nc - 1].a[1] - 1].Pr = DBX;
						B = point[Nc - 1].a[1];
						Nc = arc[point[Nc - 1].a[1] - 1].NS;
					}
				}
				else 
					if (point[Nc - 1].a[1] == B)
				{
					if (arc[point[Nc - 1].a[2] - 1].NS == Nc)
					{
						arc[point[Nc - 1].a[2] - 1].Pl = DBX;
						B = point[Nc - 1].a[2];
						Nc = arc[point[Nc - 1].a[2] - 1].NE;
					}
					else if (arc[point[Nc - 1].a[2] - 1].NE == Nc)
					{
						arc[point[Nc - 1].a[2] - 1].Pr = DBX;
						B = point[Nc - 1].a[2];
						Nc = arc[point[Nc - 1].a[2] - 1].NS;
					}
				}
					else  if (point[Nc - 1].a[2] == B)
					{
						if (arc[point[Nc - 1].a[0] - 1].NS == Nc)
						{
							arc[point[Nc - 1].a[0] - 1].Pl = DBX;
							B = point[Nc - 1].a[0];
							Nc = arc[point[Nc - 1].a[0] - 1].NE;
						}
						else if (arc[point[Nc - 1].a[0] - 1].NE == Nc)
						{
							arc[point[Nc - 1].a[0] - 1].Pr = DBX;
							B = point[Nc - 1].a[0];
							Nc = arc[point[Nc - 1].a[0] - 1].NS;
						}
					}
				
			}
			DBX = DBX + 1;
		}
	}
	cout << "点号" << "   " << "左多边形号" << "   " << "右多边形号" << endl;
	for (int i = 0; i < 6; i++)
	{
		cout<<" " << i + 1 << "          " << arc[i].Pl << "            " << arc[i].Pr << endl;
	}
	return 0;
}

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
GIS拓扑模型构建器是一种用于构建地理信息系统(GIS拓扑模型的工具。拓扑模型是地理要素之间空间关系的描述和分析,它能够帮助我们更好地理解和管理地理数据。 拓扑模型对于GIS数据的质量和一致性至关重要。通过建立拓扑模型,我们可以分析地理要素之间的拓扑关系,例如点、线和面之间的连接、相交、包含等关系。这些关系对于许多GIS应用非常重要,如道路网络分析、环境规划和资源管理等。 GIS拓扑模型构建器可以帮助用户在GIS系统中创建和维护拓扑模型。它提供了一系列工具和功能,使用户能够轻松地构建拓扑关系、定义拓扑规则和检查拓扑一致性。用户可以通过选择和编辑地理要素、指定拓扑关系和设置拓扑规则来构建拓扑模型。拓扑模型构建器还可以自动检测和修复拓扑错误,以确保地理数据的准确性和完整性。 拓扑模型构建器通常与GIS软件集成,提供用户友好的界面和图形化操作。用户可以通过拖拽和放置地理要素、设置拓扑关系和规则参数等方式来构建拓扑模型。同时,拓扑模型构建器还支持批处理操作和自动化任务,加快了拓扑模型的构建速度和效率。 总而言之,GIS拓扑模型构建器是一种重要的工具,能够帮助用户创建和维护GIS拓扑模型。它提供了丰富的功能和工具,使用户能够轻松地构建、编辑和检查拓扑关系和规则,从而提高GIS数据的质量和一致性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WHU小疯子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值