已知多边形的顶点坐标(x,y),求多边形的面积

来源:互联网 发布:淘宝已买的宝贝在哪找 编辑:程序博客网 时间:2024/05/18 02:47
package 计算多边形的面积;public class 计算多边形的面积 {    public static void main(String[] args) {        System.out.println(calcuArea(new double[]{0, 0, 1, 1}, new double[]{0, 1, 1, 0}));    }    public static double calcuArea(double[] xs, double[] ys) {        int n = xs.length;        double area = 0;        for(int i = 0; i < n; i++) {            area += xs[i % n] * ys[(i + 1) % n] - xs[(i + 1) % n] * ys[i % n];        }        return 0.5 * Math.abs(area);    }}

上述代码为已知一个多边形的各个顶点的坐标(x,y),求取多边形面积的java代码。

基本的原理很简单,我们用简单的三角形的情况来理解,如下图所示
已经知道的多边形的三点为ABC,在平面上任取一点O(一般将O取为坐标原点)。如果利用向量的叉乘运算(|xx|代表向量的长度)
OA 叉乘 OB = |OA|×|OB|×Sin∠AOB
刚好是三角形OAB面积的两倍,但是这里需要注意计算出来的值可能是负值,因为叉乘的顺序OA叉乘OB 与 OB叉乘OA的结果是不一样的,互为相反数,因为旋转的方向不一样,不清楚的可以去查阅数学书,在这里刚好需要利用到这个特性。
计算:
OA 叉乘 OB + OB 叉乘 OC + OC叉乘OA
值刚好是三角形ABC面积的两倍(先忽略掉符号问题),为什么呢,因为这样叉乘绕一圈以后,刚好可以将三角形OAB中多出的OBC 和 OAC部分去除,为什么呢,因为叉乘旋转的方向不一样,导致 OA 叉乘 OB 与OB 叉乘 OC 和 OC叉乘OA的符号一定不一样, 加起来刚好就去除了。
所以最后,将 OA 叉乘 OB + OB 叉乘 OC + OC叉乘OA 取绝对值再除以2,就是我们要求的面积了。
用上述的思想,可以很容易的推广到任意的多边形上。