计算几何:点的定位和梯形图

本次主要实现计算几何算法与应用这本书上第六章:点的定位上面介绍的一些算法

首先明确什么是梯形图。对梯形图最直观的理解就是区域划分,即将某个区域划分为一个个梯形。下图就是一个典型的梯形图。通过多条线段将整个区域划分为一个个小的梯形。
在这里插入图片描述
6.1节介绍了一个较为简单的构建梯形图的算法。该算法为一种扫描线算法,通过从左往右扫描,每当碰到线段的端点就停下,从线段的端点向上下发出射线,直到碰到某条线段停止。该算法经过一次扫描就可以画出完整的梯形图。

但是该算法存在问题,即只能得到用于显示的线段。若想要知道某一个梯形四条边的信息,该算法不能直接得到。若想知道某一个梯形的拓扑信息,即该梯形图与哪个梯形相邻。这些信息都不能得到。

本次讲解并实现的算法可以同时建立梯形图的几何信和和拓扑信息,即知道某个梯形图具体的形状位置信息,还可以得到该梯形图与哪个梯形相邻。即可以得到真正区域划分所需要的所有信息。最为关键的是,该算法可以建立一个查找结构,对于某个点,可以直接判断出其在哪个梯形图内部。

下面对该算法做一个整体性的介绍:该算法是一个随机增量算法,利用该算法可以为随机n条处于一般性位置的线段集S,构造出梯形图,同时会建立一个点定位查找结构,借助于该查找结构可以实现在梯形图中的位置查询。

下面对该查找结构做一个介绍。该查找结构是一幅有向无环图,有且仅有一个根节点。该查找结构内部节点出度为2,入度不限。该查找结构内部有三种节点:点节点、线节点、梯形节点。点节点和线节点只能做内部节点、梯形节点只能做叶子节点。
下面给出一个梯形图与一个对应的查找结构。
在这里插入图片描述
对于点节点来说,左子节点一般代表该点左方的区域,右子节点代表该节点的右方区域。对于线节点来说,左子节点代表线的上方区域,右子节点代表线的下方区域。

下面将给出该算法的伪代码,该算法是递增式算法,每引入一条线段就会对查找结构和梯形图的储存结构进行更新。
在这里插入图片描述
在这里插入图片描述
该算法在实现过程中主要有以下难点:
1、如何处理第一个包围框
2、如何找到与某条线段相交的所有梯形
3、找到相交梯形之后如何更新查找结构和梯形图结构

在回答上述三个问题之前,首先要明确定义本算法需要的数据结构。那么在本算法过程中我们需要那些信息呢?我们需要的信息可以分为几何信息和拓扑信息。几何信息就是点的坐标,线段的坐标位置就写内容。一个梯形图的几何信息可以用两条线段和两个点表示,一般梯形图的上下边用所属的线段表示,左右边只用一个点表示。因为梯形图的左右边都是垂线,由于这个特点,仅用一个点表示即可。上述信息足以完整表达一个梯形的所有几何信息。
下面给出点、线、梯形的数据结构定义。

struct Point
{
   
	float x;
	float y;
	Point()
	{
   
		x = 0;
		y = 0;
	}
};

struct Line
{
   
	Point* left;
	Point* right;
	Line()
	{
   
		left =</
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值