本次主要实现计算几何算法与应用这本书上第六章:点的定位上面介绍的一些算法
首先明确什么是梯形图。对梯形图最直观的理解就是区域划分,即将某个区域划分为一个个梯形。下图就是一个典型的梯形图。通过多条线段将整个区域划分为一个个小的梯形。
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 =</