向量法计算多边形面积
程序员文章站
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)这种形式,但起不到任何效果,可能编译器已经做过这种优化了。
上一篇: css之px自动转rem
下一篇: css中px与em以及rem的区别总结