计算几何(旁切圆) - Ex-circles - UVA 11731

计算几何(旁切圆) - Ex-circles - UVA 11731

题意:

给 定 三 角 形 A B C 的 三 条 边 长 , 如 下 图 所 示 给定三角形ABC的三条边长,如下图所示 ABC

在这里插入图片描述
设 其 三 个 旁 切 圆 的 圆 心 分 别 为 D 、 E 、 F , 计 算 三 角 形 D E F 的 面 积 和 阴 影 部 分 的 面 积 。 设其三个旁切圆的圆心分别为D、E、F,计算三角形DEF的面积和阴影部分的面积。 DEFDEF

输入:

多 组 测 试 数 据 , 多组测试数据,

每 组 包 括 三 个 正 整 数 , 分 别 表 示 三 角 形 A B C 三 条 边 的 边 长 a , b , c 每组包括三个正整数,分别表示三角形ABC三条边的边长a,b,c ABCa,b,c

三 个 0 表 示 输 入 结 束 。 三个0表示输入结束。 0

输出:

两 个 浮 点 数 , 分 别 表 示 三 角 形 D E F 的 面 积 和 阴 影 部 分 的 面 积 。 两个浮点数,分别表示三角形DEF的面积和阴影部分的面积。 DEF

Sample Input

3 4 5
10 11 12
0 0 0

Sample Output

Case 1: 30.00 21.62
Case 2: 211.37 144.73

数据范围:

数 据 总 数 不 超 过 6000 组 , 边 的 长 度 不 超 过 1000. 数据总数不超过6000组,边的长度不超过1000. 60001000.


分析:

几个重要结论:

① 、 △ A B C 的 三 个 顶 点 A ( x 1 , y 1 ) 、 B ( x 2 , y 2 ) 、 C ( x 3 , y 3 ) 对 应 的 三 个 旁 切 圆 的 半 径 依 次 为 : ①、\triangle ABC的三个顶点A(x_1,y_1)、B(x_2,y_2)、C(x_3,y_3)对应的三个旁切圆的半径依次为: ABCA(x1,y1)B(x2,y2)C(x3,y3)

R D = 2 S − a + b + c 、 R E = 2 S a − b + c 、 R F = 2 S a + b − c R_D=\frac{2S}{-a+b+c}、R_E=\frac{2S}{a-b+c}、R_F=\frac{2S}{a+b-c} RD=a+b+c2SRE=ab+c2SRF=a+bc2S

② 、 对 应 的 三 个 圆 心 D 、 E 、 F 依 次 为 : ②、对应的三个圆心D、E、F依次为: DEF

D ( − a x 1 + b x 2 + c x 3 − a + b + c , − a y 1 + b y 2 + c y 3 − a + b + c ) ,   E ( a x 1 − b x 2 + c x 3 a − b + c , a y 1 − b y 2 + c y 3 a − b + c ) ,   F ( a x 1 + b x 2 − c x 3 a + b − c , a y 1 + b y 2 − c y 3 a + b − c ) D(\frac{-ax_1+bx_2+cx_3}{-a+b+c},\frac{-ay_1+by_2+cy_3}{-a+b+c}),\\ \ \\E(\frac{ax_1-bx_2+cx_3}{a-b+c},\frac{ay_1-by_2+cy_3}{a-b+c}),\\ \ \\F(\frac{ax_1+bx_2-cx_3}{a+b-c},\frac{ay_1+by_2-cy_3}{a+b-c}) D(a+b+cax1+bx2+cx3,a+b+cay1+by2+cy3) E(ab+cax1bx2+cx3,ab+cay1by2+cy3) F(a+bcax1+bx2cx3,a+bcay1+by2cy3)

  ③ 、 ∠ A F B = ∠ A + ∠ B 2 , ∠ A E C = ∠ A + ∠ C 2 , ∠ B D C = ∠ B + ∠ C 2 \\\ \\③、∠AFB=\frac{∠A+∠B}{2},∠AEC=\frac{∠A+∠C}{2},∠BDC=\frac{∠B+∠C}{2}  AFB=2A+BAEC=2A+CBDC=2B+C

简要说明结论③:

旁 心 , 是 三 角 形 A B C 的 外 角 角 平 分 线 的 交 点 。 旁心,是三角形ABC的外角角平分线的交点。 ABC线

则 ∠ F A B = π − ∠ A 2 , ∠ F B A = π − ∠ B 2 , 故 ∠ A F B = π − ∠ F A B − ∠ F B A = ∠ A + ∠ B 2 则∠FAB=\frac{\pi-∠A}{2},∠FBA=\frac{\pi-∠B}{2},故∠AFB=\pi-∠FAB-∠FBA=\frac{∠A+∠B}{2} FAB=2πAFBA=2πBAFB=πFABFBA=2A+B

∠ A E C 与 ∠ B D C 同 理 。 ∠AEC与∠BDC同理。 AECBDC

本题解题步骤:

① 、 S △ D E F = S △ A B C + S △ A B F + S △ A C E + S △ B C D ①、S_{\triangle DEF}=S_{\triangle ABC}+S_{\triangle ABF}+S_{\triangle ACE}+S_{\triangle BCD} SDEF=SABC+SABF+SACE+SBCD

而 S △ A B F = c ⋅ R F ⋅ 1 2 , S △ A C E = b ⋅ R E ⋅ 1 2 , S △ B C D = a ⋅ R D ⋅ 1 2 \qquad 而S_{\triangle ABF}=c·R_F·\frac{1}{2},S_{\triangle ACE}=b·R_E·\frac{1}{2},S_{\triangle BCD}=a·R_D·\frac{1}{2} SABF=cRF21SACE=bRE21SBCD=aRD21

我 们 直 接 利 用 公 式 解 出 三 条 旁 切 圆 的 半 径 即 可 解 决 此 问 题 。 \qquad我们直接利用公式解出三条旁切圆的半径即可解决此问题。

② 、 接 着 求 阴 影 部 分 面 积 , 已 知 旁 切 圆 半 径 , 再 知 道 对 应 的 圆 心 角 即 可 算 得 扇 形 面 积 。 ②、接着求阴影部分面积,已知旁切圆半径,再知道对应的圆心角即可算得扇形面积。

S 扇 形 F = 1 2 ⋅ ∠ A F B ⋅ R F 2 , S 扇 形 E = 1 2 ⋅ ∠ A E C ⋅ R E 2 , S 扇 形 D = 1 2 ⋅ ∠ B D C ⋅ R D 2 \qquad S_{扇形F}=\frac{1}{2}·∠AFB·R_F^2,S_{扇形E}=\frac{1}{2}·∠AEC·R_E^2,S_{扇形D}=\frac{1}{2}·∠BDC·R_D^2 SF=21AFBRF2SE=21AECRE2SD=21BDCRD2

我 们 已 知 三 边 长 a , b , c , 就 容 易 计 算 出 对 应 的 三 个 角 ∠ A 、 ∠ B 、 ∠ C , \qquad 我们已知三边长a,b,c,就容易计算出对应的三个角∠A、∠B、∠C, a,b,cABC

就 可 以 直 接 算 得 对 应 的 圆 心 角 。 最 后 累 加 扇 形 的 面 积 即 可 解 决 。 \qquad 就可以直接算得对应的圆心角。最后累加扇形的面积即可解决。

注意:

不 能 够 通 过 S △ A B C = 1 2 b c s i n A 来 计 算 角 A , 因 为 s i n 函 数 在 [ 0 , π ] 上 不 是 单 调 函 数 , \qquad 不能够通过S_{\triangle ABC}=\frac{1}{2}bcsinA来计算角A,因为sin函数在[0,\pi]上不是单调函数, SABC=21bcsinAAsin[0,π]

正 确 的 做 法 是 利 用 余 弦 定 理 : \qquad 正确的做法是利用余弦定理:

c o s A = b 2 + c 2 − a 2 2 b c cosA=\frac{b^2+c^2-a^2}{2bc} cosA=2bcb2+c2a2

再 用 反 余 弦 函 数 来 计 算 角 A 。 ∠ B 和 ∠ C 计 算 同 理 。 \qquad再用反余弦函数来计算角A。∠B和∠C计算同理。 ABC

代码:

#include<cstring>
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>

using namespace std;

const double eps=1e-10;

double areaT(double d,double h) //三角形面积底乘高
{
    return d*h/2.0;
}

double area(double th,double R) //圆弧面积
{
    return th*R*R/2.0;
}

double angle(double a,double b,double c)
{
    return acos((a*a+b*b-c*c)/(2*a*b));
}

int main()
{
    int T=1;
    int a,b,c;
    while(scanf("%d%d%d",&a,&b,&c),a&&b&&c)
    {
        double p=(double)(a+b+c)/2.0;
        double S=sqrt(p*(p-a)*(p-b)*(p-c));
        double RD=2.0*S/(-a+b+c), RE=2.0*S/(a-b+c), RF=2.0*S/(a+b-c);
        double A=angle(b,c,a), B=angle(c,a,b), C=angle(b,a,c);
        double F=(A+B)/2.0, E=(A+C)/2.0, D=(B+C)/2.0;
        double SDEF=S+areaT(c,RF)+areaT(b,RE)+areaT(a,RD);
        double Sshad=area(F,RF)+area(E,RE)+area(D,RD);
        
        printf("Case %d: %.2lf %.2lf\n",T++,SDEF,Sshad);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值