博客
关于我
计算几何(旁切圆) - Ex-circles - UVA 11731
阅读量:350 次
发布时间:2019-03-04

本文共 4946 字,大约阅读时间需要 16 分钟。

计算几何(旁切圆) - 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 510 11 120 0 0

Sample Output

Case 1: 30.00 21.62Case 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
#include
#include
#include
#include
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;}

转载地址:http://yqor.baihongyu.com/

你可能感兴趣的文章
数字三角形的无返回值的深度优先搜索解法
查看>>
完全背包问题的简化思路
查看>>
Jquery添加元素
查看>>
Jquery使用需要下载的文件
查看>>
Spring中如何传递参数的问题
查看>>
Ajax中get方式url传递中文参数乱码的解决
查看>>
BST中某一层的所有节点(宽度优先搜索)
查看>>
广度优先搜索
查看>>
对于递归的理解
查看>>
二分查找(递归)
查看>>
猜字母
查看>>
Eclipse导出项目出现resource is out of sync with the file...错误
查看>>
奇怪的分式(枚举 + 判断)
查看>>
Linux网络环境配置(设置ip地址)
查看>>
Idea使用Spring Initializr来快速创建springboot项目
查看>>
C++邻接表存储图的深度优先搜索
查看>>
C++实现Dijkstra算法(单源路径最短算法)
查看>>
Dijkstra算法的总结
查看>>
zoj 3964 - Yet Another Game of Stones
查看>>
前后端通信问题 —— SpringBoot+LayUI
查看>>