欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

向量法计算多边形面积

程序员文章站 2022-04-22 08:23:37
...

  计算多边形面积的方法为将多边形分解成多个三角形,然后把这些三角形的面积相加。三角形面积为两边向量叉积除以2。 

        /**
	 * 平面多边形面积
	 * 
	 * @return
	 */
	public static final double getPolygonArea(double... points) {
		if (points.length < 6) {
			// 无法构成多边形
			return 0;
		}
		double area = 0.0;
		final double x0 = points[0], y0 = points[1];

		double dx1, dy1;
		double dx2, dy2;

		dx1 = points[2] - x0;
		dy1 = points[3] - y0;
		for (int i = 4; i < points.length - 1; i += 2) {
			dx2 = points[i] - x0;
			dy2 = points[i + 1] - y0;

			final double subArea = (dx1 * dy2 - dx2 * dy1) / 2;
			area += subArea;

			dx1 = dx2;
			dy1 = dy2;
		}
		return area;
	}

  除了可以用来计算面积,还可以进行分布式计算π。把半径R的圆分解成很多边的多边形,每台计算机只计算其中的一部分。然后将每台计算机算出的面积相加得到面积S。π=S/(R^2)。这只是一种用法,事实上并不建议用此方法计算π。最好的办法仍然是可迭代的,所以分布式计算π并没有优势。

  下面是C++的版本。

        /**
	 * 平面多边形面积
	 *
	 * @return
	 */
static  double getPolygonArea(double *points, int length) {
    if (length < 6) {
        // 无法构成多边形
        return 0;
    }
    double area = 0.0;
    double x0 = points[0], y0 = points[1];

    double dx1, dy1;
    double dx2, dy2;

    dx1 = points[2] - x0;
    dy1 = points[3] - y0;
    for (int i = 4; i < length - 1; i += 2) {
        dx2 = points[i] - x0;
        dy2 = points[i + 1] - y0;

        double subArea = (dx1 * dy2 - dx2 * dy1) / 2.0;
        area += subArea;

        dx1 = dx2;
        dy1 = dy2;
    }
    return area;
}

 

    GCC 7.3.0 和 mingw-w64 5.0.3 VS Java 1.8在此算法上的性能对比

  边数0xffffff,次数10时,

  Release状态下C++连续10次计算与Java连续10次计算相比不相上下相差±5%,有时C++快点,有时Java快点。

  边数0xfffff,次数1000次时,C++比Java慢10%,基本上C++已经比Java慢了。次数越多C++越处劣势,10000次时C++比Java慢17%。虽然不可思议,但是这个算法C++比Java慢。后来我对指针操作进行了一点改进,改成用*(points + i)这种形式,但起不到任何效果,可能编译器已经做过这种优化了。

 

 

相关标签: 面积