1 条题解

  • 0
    @ 2025-5-27 22:46:56

    问题分析

    1. 需要计算三角形内三个两两相切且各与两条边相切的圆(Malfatti圆)
    2. 圆的半径与三角形边长和角度相关
    3. 需要高精度计算

    关键点

    • 三角形几何性质
    • 圆的切线条件
    • 非线性方程组求解

    解题步骤

    1. 计算三角形边长和面积
    2. 建立Malfatti圆的几何关系方程
    3. 使用数值方法求解非线性方程组
    4. 按顶点距离排序输出半径
    #include <cstdio>
    #include <cmath>
    using namespace std;
     
    struct Point {
        double x, y;
    } A, B, C, I;
     
    double get_dis(Point p1, Point p2) {
        return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
    }
     
    int main() {
        while(~scanf("%lf%lf%lf%lf%lf%lf", &A.x, &A.y, &B.x, &B.y, &C.x, &C.y)) {
            if(A.x == 0 && A.y == 0 && B.x == 0 && B.y == 0 && C.x == 0 && C.y == 0) break;
            double a = get_dis(B, C);
            double b = get_dis(A, C);
            double c = get_dis(A, B);
            double s = (a + b + c) / 2;  // 半周长
            I.x = (a * A.x + b * B.x + c * C.x) / (a + b + c);
            I.y = (a * A.y + b * B.y + c * C.y) / (a + b + c); // 内切圆圆心坐标
            double r = sqrt((s - a) * (s - b) * (s - c) / s); // 内切圆半径
            double IA = get_dis(A, I);
            double IB = get_dis(B, I);
            double IC = get_dis(C, I);
            double r1 = r / (2 * (s - a)) * (s - r + IA - IB - IC);
            double r2 = r / (2 * (s - b)) * (s - r + IB - IA - IC);
            double r3 = r / (2 * (s - c)) * (s - r + IC - IA - IB);
            printf("%.6lf %.6lf %.6lf\n", r1, r2, r3);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    2808
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者