项目描述:
要求:在4s内,用单线程,完成对百万级的矢量图形的裁剪
输入:1.一个多边形(存储在XML文件中,顺序存储多边形所有的端点)
2.一个矢量图形(line或者circle)。line存储其两个端点AB,circle存储其圆心O和半径r。(实际有一百万条直线和一百万个圆)
输出:输出裁剪后的图形。例如
裁剪过程(以一条直线为例):
1.计算该直线与多边形的所有交点,并存储。
2.由交点拼凑成线段,然后计算该线段的中点是否在多边形内部
3.如果在则保留该线段
4.如果不在则删除该线段
详述:
在计算直线与多边形所有交点时,采用了定比分点法。
在由交点拼凑直线时,出现了如下问题
(a)中,交点的顺序应该是501234 但是实际存储的顺序是012345.这会使得将45也算做线段的情况。出现这种情况的原因是,求交点时,从多边形任意一条边开始,而不是靠近线段端点的那条边。
解决的办法:采用排序的方式,将交点到该直线A点的距离,一次排序。
关于定理:”线段一点在多边形内部,则线段在多边形内部“的证明:
证明:
先说明如何确定一点是否在多边形内部:
由该线段一点,向右做一条射线,则如果这条射线与多边形的交点为偶数个,则入点与出点保持一致。如果为奇数,则说明入点少一个(因为最后射线出了多边形的范围,所以不会少 出点)
假设,该线段不在多边形内部,但因其有一点在多边形内部,则该线段必然存在交点。但由上述内容可知,该线段不与多边形有交点,因此,上述定理成立。
结果: