给定4根长度的线段,求组成四边形的最大面积
解题关键:最大面积即4个点都在其外接圆上时的面积。
$p = (a + b + c + d)/2$
$s = \sqrt {(p - a)(p - b)(p - c)(p - d)}$
设四边形的四个点分别为A,B,C,D,四条边为a,b,c,d
$s = \frac{1}{2}ab\sin \alpha + \frac{1}{2}cd\sin \beta $
再由余弦定理,$AC = {a^2} + {b^2} - 2ab\cos \alpha $
$AC = {c^2} + {d^2} - 2cd\cos \beta $
消去AC,$\frac{{{a^2} + {b^2} - {c^2} - {d^2}}}{2} = ab\cos \alpha - cd\cos \beta $
联立解得,
$4{S^2} + \frac{1}{4}{({a^2} + {b^2} - {c^2} - {d^2})^2} = {a^2}{b^2} + {c^2}{d^2} - 2abcd(\cos \alpha \cos \beta - \sin \alpha \sin \beta ) = {a^2}{b^2} + {c^2}{d^2} - 2abcd\cos (\alpha + \beta )$
要使S最大,$\cos (\alpha + \beta )$取-1;$\alpha + \beta = \pi $
而由圆周角为圆心角的一半,对角和为180度的四边形有外接圆;对角和不是180度的四边形,没有外接圆。
将$s^2$利用平方差公式进一步化简,最终得到
${S^2} = \frac{1}{4}({a^2}{b^2} + {c^2}{d^2} + 2abcd) - \frac{1}{{16}}{({a^2} + {b^2} + {c^2} + {d^2})^2} = \frac{1}{{16}}[(a + b + c - d)(a + b - c + d)(a - b + c + d)(b + c + d - a)]$
即最顶端的公式,圆内接四边形面积公式
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> using namespace std; typedef long long ll; double a[10]; int main(){ ll t; scanf("%lld",&t); ll i; for(i=1;i<=t;i++){ scanf("%lf%lf%lf%lf",a,a+1,a+2,a+3); sort(a,a+4); if(a[3]>=a[0]+a[1]+a[2]){ printf("Case %lld: -1\n",i); continue; } double p=(a[1]+a[2]+a[3]+a[0])/2; double s=sqrt((p-a[0])*(p-a[1])*(p-a[2])*(p-a[3])); printf("Case %lld: %.6lf\n",i,s); } }