张世豪
6 天以前 c498385fb7e372d13e2ee76d7b54ae2381728082
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package bianjie;
 
import java.text.DecimalFormat;
 
public class ThreePointCircle {
 
    /**
     * 根据圆上三个点计算圆心和半径
     *
     * @param point1 第一个点坐标,格式 "x,y"
     * @param point2 第二个点坐标,格式 "x,y"
     * @param point3 第三个点坐标,格式 "x,y"
     * @return 包含圆心和半径的字符串,例如 "圆心: 10.00,10.00; 半径: 5.00"
     */
    public static String getCircleFromPoints(String point1, String point2, String point3) {
        try {
            // 1. 解析坐标点
            double[] p1 = parsePoint(point1);
            double[] p2 = parsePoint(point2);
            double[] p3 = parsePoint(point3);
 
            double x1 = p1[0], y1 = p1[1];
            double x2 = p2[0], y2 = p2[1];
            double x3 = p3[0], y3 = p3[1];
 
            // 2. 计算分母 D
            // 如果 D 为 0,说明三点共线,无法构成圆
            double D = 2 * (x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2));
 
            if (Math.abs(D) < 1e-9) {
                return "错误: 输入的三个点共线,无法确定一个圆。";
            }
 
            // 3. 计算圆心坐标 (centerX, centerY)
            // 公式:
            // Ux = x^2 + y^2
            // centerX = (Ux1*(y2-y3) + Ux2*(y3-y1) + Ux3*(y1-y2)) / D
            // centerY = (Ux1*(x3-x2) + Ux2*(x1-x3) + Ux3*(x2-x1)) / D
            
            double sumSq1 = x1 * x1 + y1 * y1;
            double sumSq2 = x2 * x2 + y2 * y2;
            double sumSq3 = x3 * x3 + y3 * y3;
 
            double centerX = (sumSq1 * (y2 - y3) + sumSq2 * (y3 - y1) + sumSq3 * (y1 - y2)) / D;
            double centerY = (sumSq1 * (x3 - x2) + sumSq2 * (x1 - x3) + sumSq3 * (x2 - x1)) / D;
 
            // 4. 计算半径 (圆心到任意一点的距离)
            double radius = Math.sqrt(Math.pow(centerX - x1, 2) + Math.pow(centerY - y1, 2));
 
            // 5. 格式化输出 (保留两位小数,可根据需求调整)
            DecimalFormat df = new DecimalFormat("#.##");
            
            return String.format("圆心: %s,%s; 半径: %s", 
                    df.format(centerX), 
                    df.format(centerY), 
                    df.format(radius));
 
        } catch (NumberFormatException e) {
            return "错误: 坐标格式不正确,请使用 'x,y' 格式 (例如: '1.5,2.5')";
        } catch (Exception e) {
            return "错误: " + e.getMessage();
        }
    }
 
    /**
     * 辅助方法:将字符串 "x,y" 解析为 double 数组 [x, y]
     */
    private static double[] parsePoint(String pointStr) {
        String[] parts = pointStr.split(",");
        if (parts.length != 2) {
            throw new IllegalArgumentException("坐标格式无效: " + pointStr);
        }
        double x = Double.parseDouble(parts[0].trim());
        double y = Double.parseDouble(parts[1].trim());
        return new double[]{x, y};
    }
    
}