题解:UVA11437 Triangle Fun

· · 题解

现在开始上数学课

这是一道初中难度的平面几何题,关键就在于求出 S_{\triangle ABC}S_{\triangle PQR} 的比。

前置知识行列式法求三角形面积,即已知三角形 3 个顶点坐标求三角形面积的方法,其相较于海伦公式的优点为无需计算三条边长。具体地,已知三角形三个顶点分别为 A(x_1,y_1)B(x_2,y_2)C(x_3,y_3),则面积公式为:

S_{\triangle ABC} = \frac{1}{2} \left| x_1(y_2 - y_3) + x_2(y_3 - y_1) + x_3(y_1 - y_2) \right|

具体证法可参考这篇文章。如果搞不懂行列式法的,用海伦公式或直接作垂/建系也行。

由于本蒟蒻懒得去用几何方法证明,于是决定采用建系暴算的方式证明 S_{\triangle ABC}S_{\triangle PQR} 的关系。

证法如下:

1. 建立坐标系

为了简化计算(其实简化了也一点都不简单),设:

A(0, 0) B(b, 0)(b > 0) C(c_1, c_2)(c_2 > 0)

2. 确定 DEF 的坐标

3. 求直线 ADBECF 的方程

4. 求交点 PQR

5. 计算三角形 PQR 的面积

6. 计算三角形 ABC 的面积

S_{\triangle ABC} = \frac{1}{2} \times b \times c_2 = \frac{b c_2}{2}

7. 求面积比

\frac{S_{\triangle ABC}}{S_{\triangle PQR}} = \frac{\frac{b c_2}{2}}{\frac{b c_2}{14}} = 7

由此可得 S_{\triangle PQR} = \frac{1}{7} S_{\triangle ABC}

于是我们只要求出 S_{\triangle ABC} 再除以 7 即可。

代码

#include <bits/stdc++.h>
using namespace std;

double cal(double x1, double y1, double x2, double y2, double x3, double y3) // 使用行列式计算三角形面积
{
    return 0.5 * abs((x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1));
}

int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        double a, b, c, d, e, f;
        cin >> a >> b >> c >> d >> e >> f;
        double s = cal(a, b, c, d, e, f) / 7;
        printf("%.0lf\n", s); // 记得保留整数
    }
    return 0;
}