狸猫的面试——项目描述——矢量裁剪

来源:互联网 发布:拜占庭将军问题 知乎 编辑:程序博客网 时间:2024/05/17 05:50

项目描述:

要求:在4s内,用单线程,完成对百万级的矢量图形的裁剪

输入:1.一个多边形(存储在XML文件中,顺序存储多边形所有的端点)

    2.一个矢量图形(line或者circle)。line存储其两个端点AB,circle存储其圆心O和半径r。(实际有一百万条直线和一百万个圆)

输出:输出裁剪后的图形。例如



裁剪过程(以一条直线为例):

1.计算该直线与多边形的所有交点,并存储。

2.由交点拼凑成线段,然后计算该线段的中点是否在多边形内部

3.如果在则保留该线段

4.如果不在则删除该线段

详述:

在计算直线与多边形所有交点时,采用了定比分点法。


在由交点拼凑直线时,出现了如下问题


(a)中,交点的顺序应该是501234  但是实际存储的顺序是012345.这会使得将45也算做线段的情况。出现这种情况的原因是,求交点时,从多边形任意一条边开始,而不是靠近线段端点的那条边。

解决的办法:采用排序的方式,将交点到该直线A点的距离,一次排序。

关于定理:”线段一点在多边形内部,则线段在多边形内部“的证明:

证明:

先说明如何确定一点是否在多边形内部:

由该线段一点,向右做一条射线,则如果这条射线与多边形的交点为偶数个,则入点与出点保持一致。如果为奇数,则说明入点少一个(因为最后射线出了多边形的范围,所以不会少 出点)

假设,该线段不在多边形内部,但因其有一点在多边形内部,则该线段必然存在交点。但由上述内容可知,该线段不与多边形有交点,因此,上述定理成立。

结果:


0 0
原创粉丝点击