计算几何(中线长计算三角形面积) - Medians - UVA 10347
题意:
给 定 三 角 形 的 三 条 中 线 的 长 度 , 求 三 角 形 的 面 积 。 给定三角形的三条中线的长度,求三角形的面积。 给定三角形的三条中线的长度,求三角形的面积。
输入:
多 组 测 试 数 据 多组测试数据 多组测试数据
每 组 包 括 三 个 数 , 表 示 三 条 中 线 的 长 度 。 每组包括三个数,表示三条中线的长度。 每组包括三个数,表示三条中线的长度。
输出:
一 个 浮 点 数 , 表 示 三 角 形 的 面 积 。 一个浮点数,表示三角形的面积。 一个浮点数,表示三角形的面积。
分析:
结论:
由 △ A B C 的 三 条 中 线 A D 、 B E 、 C F 作 为 三 条 边 , 构 成 的 三 角 形 的 面 积 是 △ A B C 面 积 的 3 4 由\triangle ABC的三条中线AD、BE、CF作为三条边,构成的三角形的面积是\triangle ABC面积的\frac{3}{4} 由△ABC的三条中线AD、BE、CF作为三条边,构成的三角形的面积是△ABC面积的43
证明:
如
上
图
,
作
F
G
/
/
=
B
E
,
C
G
/
/
=
A
D
,
如上图,作FG\underset{=}{//}BE,CG\underset{=}{//}AD,
如上图,作FG=//BE,CG=//AD,
易 证 △ A H F ~ = △ E H G , 易证\triangle AHF\underset{=}{~}\triangle EHG, 易证△AHF=~△EHG,
于 是 得 到 H 是 A E 、 F G 的 中 点 , 是 A C 的 四 等 分 点 , 于是得到H是AE、FG的中点,是AC的四等分点, 于是得到H是AE、FG的中点,是AC的四等分点,
从 而 , S △ A C F = 1 2 S △ A B C , S △ C H F = 1 2 S △ C F G , S △ C H F = 3 4 S △ A C F 从而,S_{\triangle ACF}=\frac{1}{2}S_{\triangle ABC},S_{\triangle CHF}=\frac{1}{2}S_{\triangle CFG},S_{\triangle CHF}=\frac{3}{4}S_{\triangle ACF} 从而,S△ACF=21S△ABC,S△CHF=21S△CFG,S△CHF=43S△ACF
最 终 得 到 S △ C G F = 3 4 S △ A B C 最终得到S_{\triangle CGF}=\frac{3}{4}S_{\triangle ABC} 最终得到S△CGF=43S△ABC
本题中:
利 用 结 论 , S △ A B C = 4 3 S △ C G F = 4 3 p ( p − u ) ( p − v ) ( p − w ) , 其 中 p = u + v + w 2 利用结论,S_{\triangle ABC}=\frac{4}{3}S_{\triangle CGF}=\frac{4}{3}\sqrt{p(p-u)(p-v)(p-w)},其中p=\frac{u+v+w}{2} 利用结论,S△ABC=34S△CGF=34p(p−u)(p−v)(p−w),其中p=2u+v+w
注意:
首 先 中 线 长 要 能 够 构 成 三 角 形 , 即 任 意 两 边 之 和 大 于 第 三 边 , 任 意 两 边 之 差 小 于 第 三 边 , 否 则 无 解 。 首先中线长要能够构成三角形,即任意两边之和大于第三边,任意两边之差小于第三边,否则无解。 首先中线长要能够构成三角形,即任意两边之和大于第三边,任意两边之差小于第三边,否则无解。
且 无 解 要 输 出 − 1.000 。 且无解要输出-1.000。 且无解要输出−1.000。
代码:
#include<cstring>
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
bool check(double a,double b,double c)
{
if( a >= b + c || a <= fabs(b-c) )
return true;
return false;
}
double area(double u,double v,double w)
{
double p=(u+v+w)/2.0;
return 4.0/3.0*sqrt(p*(p-u)*(p-v)*(p-w));
}
int main()
{
double m,n,p;
while(~scanf("%lf%lf%lf",&m,&n,&p))
{
if(check(m,n,p) || check(n,m,p) || check(p,m,n)) puts("-1.000");
else printf("%.3lf\n",area(m,n,p));
}
return 0;
}