请仔细阅读代码注释(有肯多坑,跟着注释走没问题) 亲测有效
/**
* 计算多边形面积公式
*
* @author Lion Li
* @date 2020-05-19
*/
public class PolygonArea {
public static void main(String[] args) {
//多边形面积
double sum = 0;
//临时变量
double xTmp = 0;
double yTmp = 0;
//无论从哪开始第一个坐标的x,y必须是0,0 如果不从0,0 那么会出现误差
double xFirst = 0.0;
double yFirst = 0.0;
// 坐标必须封闭 从哪开始 到哪结束
String[] arrs = {"10,10", "40,10", "40,40", "10,40", "10,10"};
for (String s : arrs) {
// 读取当前坐标的x和y
String[] arr = s.split(",");
double xCurrent = Double.parseDouble(arr[0]);
double yCurrent = Double.parseDouble(arr[1]);
/**
* 计算面积:
* (xTmp,yTmp)代表上一行的坐标值
* (xCurrent,yCurrent)代表当前这一行的坐标值
*/
// 公式 sum += ((xTmp - xCurrent) * (yTmp + yCurrent)) * 0.5;
BigDecimal sub = new BigDecimal(xTmp).subtract(new BigDecimal(xCurrent));
BigDecimal add = new BigDecimal(yTmp).add(new BigDecimal(yCurrent));
BigDecimal mul = sub.multiply(add).multiply(new BigDecimal("0.5"));
sum = mul.add(new BigDecimal(sum)).doubleValue();
//计算完面积后,进入下一次循环前需要将“当前坐标”交换为“上一行的坐标”
xTmp = xCurrent;
yTmp = yCurrent;
}
//用最后读取的坐标与第一次读取的坐标进行一次面积运算
BigDecimal sub = new BigDecimal(xTmp).subtract(new BigDecimal(xFirst));
BigDecimal add = new BigDecimal(yTmp).add(new BigDecimal(yFirst));
BigDecimal mul = sub.multiply(add).multiply(new BigDecimal("0.5"));
sum = mul.add(new BigDecimal(sum)).doubleValue();
System.out.println(sum);
}
}
计算 10,10 40,10 40,40 10,40 的面积