最近帮一个弄GIS系统的公司搞矢量图的裁剪,裁剪的区域是矩形。需要将一个大的地图矢量信息裁剪成N个规定矩形大小的小地图矢量信息。这样做的好处是不需要一次性将大地图全部载入内存中,只需要用到某块地图时将其和相邻区域的地图装载如内存中,加快了系统的反映速度。
点:
判断点是否在裁剪区域内(在边界上也作为在区域内),如果是则存储
直线段:
判断直线段与裁剪区域边界是否有交点(直线段与裁剪区域最多有2个交点,曲线可以分解为N段直线段)
无交点
判断直线段某一个顶点是否在裁剪区域内,如果是,则直线段完全在裁剪区域内,储存线段的所有顶点,如果否,则直线段完全在裁剪区域外,不存储。
有交点
如果2个交点,则存储两个交点。如果一个交点,判断直线段两顶点中某一个在裁剪区域内,存储交点和在裁剪区域中的顶点
多边形:
如果主多边形的顶点或者边与裁剪区域的边重叠,裁剪区域的顶点在主多边形的一个边上
方法一:(实际中运用)
则将主多边形重叠的顶点或者边的后一个顶点在X与Y坐标上各加1/1'000'000度,然后计算与裁剪区域的交点。但是会面临一个问题,为了避免重叠,移动过以后又造成了另一次重叠,然后又再次移动。不过在实际使用中,由于程序的精度误差,所以二次重叠的机率非常小,多次重叠更是可以忽略。
方法二:(个人想法,未经证明)
上一方法在实际中可以运用,但是只在算法研究上会有多次移动的情况,我设想了另一个解决办法。
因为重叠部分的顶点也是交点,所以在计算交点以后忽略和顶点一致的交点。此方法并不影响进出性的判断,因为假如是主多边形顶点在裁剪区域的边上,而这个顶点会有主多边形的两条边,那么忽略的交点是2个。如下图,假如顶点6在裁剪多边形上,则可以看作6是g