uva 11731(旁切圆)

题意:给出一个三角形ABC的三条边长,求DEF的面积和阴影部分总面积。
这里写图片描述
题解:三角形内部的圆是内切圆,而外面的三个圆是旁切圆,关于旁切圆有一个性质就是他的圆心是三角形两个外角的角平分线(比如AF和BF)和一条内角平分线(CF)的交点,由此可以推出∠EAC == ∠FAB,∠FBA == ∠CBD,∠BCD == ∠ACE。
然后可以推导出下列三个式子:
∠EAC + ∠E + ∠ACE = 180°
∠EAC + ∠F +∠FBA = 180°
∠FBA + ∠D + ∠ACE = 180°
上面三个式子相加推出 ∠FBA == ∠E
因为∠FAB == ∠EAC 且 ∠FBA == ∠E
那么△AFB和△ACE是相似三角形,同理推出 △BCD和他们也是相似的
现在已知△ABC三边长度,根据余弦定理可以得出所有角的大小,然后根据正弦定理计算所有边的长度,△DEF就很容易计算出来了。
阴影部分是三个扇形面积的和,扇形面积 S = n * π * r * r / 360°,n是圆心角的角度,r是半径。因为旁切圆和三角形相切,那么有了面积和底边长度,半径其实是三个小三角形的高。然后角度都已知,直接三个小扇形计算累加就是阴影部分的总面积。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const double PI = acos(-1);
double a, b, c;
//      ACE  AFB  DCB  相似

int main() {
    int cas = 1;
    while (scanf("%lf%lf%lf", &a, &b, &c) == 3 && a + b + c) {
        double bac = acos((b * b + c * c - a * a) / (2 * b * c));
        double abc = acos((c * c + a * a - b * b) / (2 * c * a));
        double bca = acos((a * a + b * b - c * c) / (2 * a * b));
        double d = (PI - bac) / 2.0;
        double f = (PI - bca) / 2.0;
        double e = (PI - abc) / 2.0;
        double BF = c * sin(d) / sin(f);
        double AF = c * sin(e) / sin(f);
        double BD = a * sin(f) / sin(d);
        double CD = a * sin(e) / sin(d);
        double AE = b * sin(f) / sin(e);
        double CE = b * sin(d) / sin(e);
        double Sdef = 0.5 * (AF + AE) * (BD + BF) * sin(f); //1/2 * a * b * sin(C)
        printf("Case %d: %.2lf", cas++, Sdef);  
        double Sabf = 0.5 * AF * BF * sin(f);
        double r1 = Sabf * 2.0 / c;
        double S1 = f * r1 * r1 / 2.0;//注意弧度转化成角度,这是式子化简后的样子
        double Sbcd = 0.5 * BD * CD * sin(d);
        double r2 = Sbcd * 2.0 / a;
        double S2 = d * r2 * r2 / 2.0;
        double Sace = 0.5 * AE * CE * sin(e);
        double r3 = Sace * 2.0 / b;
        double S3 = e * r3 * r3 / 2.0;
        printf(" %.2lf\n", S1 + S2 + S3);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值