Esri geometry api java 学习 功能实现 (2) 使用PlaneSweepCrackerHelper+SweepComparator的平面扫描

博客讨论了Cluster和Cracker对点对线操作中选取局部几何图形的问题,对于含大量节点的大图,穷举不可行。介绍了Esri使用的平面扫描法,包括扫描原理,如用与X轴平行的横扫描线纵向扫描图形,遇到节点停止扫描,处理线段并比较判断相交情况等。

之前我们说到了Cluster 和 Cracker 的对点对线的操作,这些都涉及到选取局部几何图形的问题,

针对一些含节点数量较少的形状我们可以使用最暴力穷举解决它,那么遇见几百几千几万节点的大图呢?穷举肯定会把计算机跑死的(也不能体现这帮写算法的本事啊)。

这里面Esri使用了平面扫描法对整个图形扫描找到需要进行处理的区域并提出数据来比较输出。

 

扫描原理:

1.图形处理的扫描线在此定义为与X轴平行的横扫描线,纵向扫描图形。

2.我们由下至上扫过图形,没有特定的扫描间隔,当遇到节点时停止并进行一次扫描。

3.扫描时扫描线会把经过的线段截成两段,我们只取下段,并把下段按照格式整理成类“SimpleEdge”

4.把所有下段两两比较,把两段分成左边缘和右边缘。

5.将两段边缘投影到平行X轴的扫描线上,x的最大最小值会告诉你相交情况:

    a.不相交    b.相交在中间    c.相交在端点    d.重合

6.如果相交并且满足做Cluster 和 Cracker条件就执行啦!

7.一直循环到最上,扫描完成!

 

建立第4步用到的比较器:

比较器 SweepComparator
左边缘数据m_temp_simple_edge_1右边缘数据m_temp_simple_edge_2
左前点m_prev_1右前点m_prev_2
左节点m_vertex_1右节点m_vertex_2
左X值m_prevx_1右X值m_prevx_2
当前扫描线节点m_current_node
前点xm_prev_y
前点ym_prev_x
扫描线切点y值m_sweep_y
扫描线切点x值m_sweep_x
精确度m_tolerance
是否简单m_b_is_simple

 

第5步判断相交过程:

左x max\右x min\相交,类似于线段相交判断,见 https://blog.youkuaiyun.com/qq826309057/article/details/70942061

 

 

参考:

https://github.com/Esri/geometry-api-java/blob/master/src/main/java/com/esri/core/geometry/SweepComparator.java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值