B2031 题解

· · 题解

题意:

给出三个坐标,求这三个坐标组成三角形的面积。

思路:

不需要任何超过小学数学的知识(包括海伦公式)

我们发现,当这个三角形其中一个顶点位于原点 (0,0) 时,情况会比较特殊。我们不妨假设 (x_3,y_3) 位于原点。

此时:

问题三角形 S\triangle DEO=S 四边形 ABCO-S\triangle ADO-S\triangle CEO-S\triangle BDE

带入得:

S\triangle DEO=x_2y_1-\dfrac{x_1y_1}{2}-\dfrac{x_2y_2}{2}-\dfrac{x_2y_1-x_1y_1-x_2y_2+x_1y_2}{2}

简化得:

S\triangle DEO=\dfrac{x_2y_1-x_1y_2}{2}

当 \triangle DEO 不在第一象限时,上述公式可能为负数,所以这里需要取绝对值。

最终推出如下公式:

S\triangle DEO=\dfrac{|x_2y_1-x_1y_2|}{2}

但是这一切都是在 (x_3,y_3) 位于原点的情况下才成立,所以我们需要将三角形平移至 (x_3,y_3) 为原点的位置上,此时 x_1 与 x_2 都需要减去 x_3,y_1 与 y_2 都需要减去 y_3。

综上,得出可以在所有条件下都成立的公式:

S\triangle DEO=\dfrac{|(x_2-x_3)(y_1-y_3)-(x_1-x_3)(y_2-y_3)|}{2}

直接将此公式带入程序即可。

程序如下:

#include<cstdio>
using namespace std;
double x1,y1,x2,y2,x3,y3;//定义变量
double abs(double a){return a>0?a:-a;}
int main(){
    scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);//输入
    printf("%.2lf\n",abs((x1-x3)*(y1-y3)-(x2-x3)*(y2-y3))/2);//直接套公式输出,注意要保留2位小数
    return 0;
}

THE END

P.S. 公式纯为手推,如有逻辑疏忽欢迎指出。