2024-06-20 16:36:07 +08:00

74 lines
2.0 KiB
Java

package com.zhgd.xmgl.util;
import java.util.ArrayList;
import java.util.Optional;
public class PolygonUtil {
/**
* 五边形面积
*
* @param r 从五边形中心到顶点的距离,计算五边形的面积
* @return
*/
public static double pentagonArea(double r) {
double s = 2 * r * Math.sin(Math.PI / 5);
return (5 * Math.pow(s, 2)) / (4 * Math.tan(Math.PI / 5));
}
/**
* 八边形面积
*
* @param r
* @return
*/
public static double octagonArea(double r) {
double s = 2 * r * Math.sin(Math.PI / 8);
return (8 * Math.pow(s, 2)) / (4 * Math.tan(Math.PI / 8));
}
/**
* 多边形面积
*
* @param r
* @return
*/
public static double polygonArea(double r, int edgeNum) {
double s = 2 * r * Math.sin(Math.PI / edgeNum);
return (edgeNum * Math.pow(s, 2)) / (4 * Math.tan(Math.PI / edgeNum));
}
/**
* 计算雷达图面积
*
* @param r 从多边形中心到顶点的距离
* @param edgeNum 边数
* @param data 三角形的边长
* @return
*/
public static double calRadioArea(double r, int edgeNum, Double... data) {
double sinVal = Math.sin(Math.toRadians(360.0 / edgeNum));
ArrayList<Double> dataList = new ArrayList<>();
for (Double d : data) {
dataList.add(Optional.ofNullable(d).orElse(0.0));
}
ArrayList<Double> doubles = new ArrayList<>();
for (int i = 0; i < edgeNum; i++) {
double r1;
if (i == edgeNum - 1) {
r1 = dataList.get(i) * dataList.get(0) * sinVal / 2;
} else {
r1 = dataList.get(i) * dataList.get(i + 1) * sinVal / 2;
}
doubles.add(r1);
}
double sum = doubles.stream().mapToDouble(value -> value).sum();
return sum / polygonArea(r, edgeNum);
}
public static void main(String[] args) {
System.out.println(calRadioArea(1, 5, 1.0, 1.0, 1.0, 1.0, 1.0));
}
}