对于凸多边形,很容易计算,如下图,以多边形的某一点为顶点,将其划分成几个三角形,计算这些三角形的面积,然后加起来即可。已知三角形顶点坐标,三角形面积可以利用向量的叉乘来计算。
对于凹多边形,如果还是按照上述方法划分成三角形,如下图,多边形的面积 = S_ABC + S_ACD + S_ADE, 这个面积明显超过多边形的面积。
我们根据二维向量叉乘求三角形ABC面积时,利用的是
这样求出来的面积都是正数,但是向量叉乘是有方向的,即
是有正负的,如果把上面第三个公式中的绝对值符号去掉,即
,那么面积也是有正负的。反应在上面第二个图中,S = S_ABC + S_ACD + S_ADE,如果S_ABC和S_ADE是正的,那么S_ACD是负的,这样加起来刚好就是多边形的面积。对于凸多边形,所有三角形的面积都是同正或者同负。
以上算法可以计算任意多边形的面积,但是在CAD中用户使用多段线圈定区域时可能会出现多段线在内部有交叉的情况形如
此时算法对异形多边形的端点判断是有误的会导致面积计算错误
所以我们需要对数据进行处理拿到多段线所构成区域的最大轮廓以进行计算
最终我们希望得到以下效果
我们需要先计算出由于多段线交叉所生成的所有交叉点和“子直线”,这个不难做到
所以接下来是确定最大轮廓,我们先选定一个在最大轮廓上的起点,这个最大轮廓是必需封闭的,未封闭时算法会使用直线连接起点与终点形成封闭,起点的选择比较随意,可以选择x值y值都最小的点为起点
选择起点后,需要确定起点链接了几条直线,一般情况下是两条,我们选取概念上右边的那条(这条直线旋转到另一条直线的位置为逆时针方向)
由起点沿直线直到遇到下一个点(可能是交叉点,可能是多段线拐点) ,判断除来路外还链接了几条直线
交叉情况下当成还链接了三条直线(下一个点可能选取三个方向,实际上与来路同方向直线是不可能的,此时交叉直线必定扩大最大轮廓)
此时选取与来路夹角最小的路做去路 ,如图
但需要考虑角度正负以作限制 为了能选取概念上右边的直线,左边的直线角度再小也不能选,其在最大轮廓之内(意思是这个角度需要从来路 逆时针方向到 去路 的角度最小)
遇到交叉点还有种特殊情况是连接了两条直线的,如同下图
思路还是从来路的直线到去路的角度需要最小来选取
如果只链接了一个方向的直线当然不用纠结了
这样每次都能选取到最大轮廓上的点,每次选取的线也可以得到,当回到起点时就已经完成遍历,得到了我们需要的最大轮廓的图形。