造价通

反馈
取消

热门搜词

造价通

取消 发送 反馈意见

空间分析算法平面扫描算法

2022/07/16123 作者:佚名
导读:平面扫描算法的主要内容是对空间对象进行一遍扫描,并在扫描过程中完成对空间对象的性质或空间对象之间的关系的分析。在扫描过程中,扫描线自左向右移动,依一定顺序遍历所有与扫描线相交的空间元素,判断它们之间的顺序和其他空间拓扑关系,依照一定规则进行分析。图1中给出了平面扫描算法的示意,其中粗线段表示和扫描线相交的线段。 任何平面扫描算法的基本要素都包括:事件点列表,扫描线状态,事件点触发的动作。 其中,事

图1 平面扫描算法示意图 平面扫描算法的主要内容是对空间对象进行一遍扫描,并在扫描过程中完成对空间对象的性质或空间对象之间的关系的分析。在扫描过程中,扫描线自左向右移动,依一定顺序遍历所有与扫描线相交的空间元素,判断它们之间的顺序和其他空间拓扑关系,依照一定规则进行分析。图1中给出了平面扫描算法的示意,其中粗线段表示和扫描线相交的线段。

任何平面扫描算法的基本要素都包括:事件点列表,扫描线状态,事件点触发的动作。 其中,事件点列表 指依照系统确定的空间排序关系,事先确定或在扫描过程中计算出的算法感兴趣的空间元素的有序序列;扫描线状态指依照确定的排序规则记录当前与扫描线相交的空间元素的有序表 ;事件点触发的动作指扫描到事件点时做出的分析或操作。

事先确定的事件点列表在扫描过程中不再变化,称为静态事件点列表;需要在扫描过程中计算的事件点列表称为动态事件点列表。和扫描线相交的线段以及落在扫描线上的点是扫描线状态的组成元素。事件点可以是任何分析算法感兴趣的空间元素,包括对象之间交点和特定线段元素等。

可以将扫描线状态看成一种抽象数据类型,记为 Sweep_Status,它拥有自己的数据组织方式、排序规则和操作方法。扫描线状态中的排序规则是按照各个空间元素和扫描线交点的 Y 坐标的大小来排序,在这种排序关系的组织下可以对一个与扫描线相交的空间元素取前驱或则后继。图1中标号 1 到 4 给出了与扫描线相交的线段的排序顺序。

平面扫描算法是一个算法框架,给定上述三个要素的具体实现,就可以给定一个具有一定的功能的空间分析算法。下面 S 是 Sweep_Status 类型的变量,s 是空间线段,对扫描线状态定义一系列操作。

关于扫描线状态的操作:

(1) new_sweep(),生成一个新的扫描线状态的数据结构,返回 Sweep_Status类型的变量;

(2) add_left(S,s),当扫描过程中遇到左半线段类型的事件点的时候,向 S 中插入一个左半线段对应的线段元素 s,操作返回一个插入线段后的扫描线状态;

(3) del_right(S,s),当扫描过程中遇到右半线段类型的事件点的时候,在扫描线中删除右半线段对应的线段元素, S、s 及返回值的定义同 add_left(S,s);

(4) pred_of(S,elem),在扫描线状态中定位空间元素 elem 的前驱,即确定存在于S中且按照扫描线的排序规则比elem小的元素的集合中最大的元素的位置,操作结果设置 S 的数据项 current 指向 elem 的前驱,current = 0 表示前驱不存在,返回 current 被设置后的扫描线状态;

(5) current_exists(S),当 S 的数据项 current = 0,返回 FALSE,否则返回 TRUE;

(6) set_attr(S,attr)设置 S 中 current 所指的空间元素的属性,attr 是属性集合;

(7) get_attr(S)取 S 中 current 所指的空间元素的属性,返回属性集合;

InsideAbove 是区域类型对象 R 中的线段的一个属性,它表示这个线段的上方或者左侧是区域的内部。可以用平面扫描算法判断并设置 R 中的线段 s 是否具有属性 InsideAbove:如果它在扫描线状态中的序号为奇数,则 s 具有属性InsideAbove;否则不具备这种属性。这种判断和设置在建立空间对象的时候完成,图1中给出了示例。

*文章为作者独立观点,不代表造价通立场,除来源是“造价通”外。
关注微信公众号造价通(zjtcn_Largedata),获取建设行业第一手资讯

热门推荐

相关阅读