之前我们说到了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 | ||
前点x | m_prev_y | ||
前点y | m_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