现在开始上数学课
这是一道初中难度的平面几何题,关键就在于求出
S△ABC 和
S△PQR 的比。
前置知识:
行列式法求三角形面积,即已知三角形
3 个顶点坐标求三角形面积的方法,其相较于海伦公式的优点为无需计算三条边长。具体地,已知三角形三个顶点分别为
A(x1,y1)、
B(x2,y2)、
C(x3,y3),则面积公式为:
S△ABC=21∣x1(y2−y3)+x2(y3−y1)+x3(y1−y2)∣
具体证法可参考
这篇文章。如果搞不懂行列式法的,用海伦公式或直接作垂/建系也行。
由于本蒟蒻懒得去用几何方法证明,于是决定采用建系暴算的方式证明
S△ABC 和
S△PQR 的关系。
证法如下:
1. 建立坐标系
为了简化计算(其实简化了也一点都不简单),设:
B(b,0)(b>0)
C(c1,c2)(c2>0)
2. 确定 D、E、F 的坐标
-
D 是
BC 的三等分点,
BC=3BD,即
BD:DC=1:2,则
D=B+31(C−B)=(b+3c1−b,0+3c2)=(32b+c1,3c2)
-
同理
E=A+32(C−A)=(32c1,32c2)
F=A+31(B−A)=(3b,0)
3. 求直线 AD、BE、CF 的方程
-
- 斜率:
kAD=32b+c1−03c2−0=2b+c1c2
- 方程:
yAD=2b+c1c2x
-
同理
yBE=2c1−3b2c2(x−b)
yCF=3c1−b3c2(x−c1)+c2
4. 求交点 P、Q、R
-
交点 P(AD∩BE):
-
2b+c1c2x=2c1−3b2c2(x−b)
消去
c2(
c2=0):
2b+c1x=2c1−3b2(x−b)
交叉相乘:
x(2c1−3b)=2(x−b)(2b+c1)
展开并整理:
2c1x−3bx=2(2bx+c1x−2b2−bc1)
2c1x−3bx=4bx+2c1x−4b2−2bc1
移项:
−3bx−4bx=−4b2−2bc1
−7bx=−2b(2b+c1)
解得:
x=72(2b+c1),y=2b+c1c2⋅72(2b+c1)=72c2
因此:
P(72(2b+c1),72c2)
-
同理可得
Q(74c1+b,74c2)
R(72b+c1,7c2)
5. 计算三角形 PQR 的面积
-
已知:
P(74b+2c1,72c2),Q(74c1+b,74c2),R(72b+c1,7c2)
利用行列式公式计算面积:
S△PQR=21∣xP(yQ−yR)+xQ(yR−yP)+xR(yP−yQ)∣
计算各项:
yQ−yR=74c2−7c2=73c2
yR−yP=7c2−72c2=−7c2
yP−yQ=72c2−74c2=−72c2
代入:
S△PQR=2174b+2c1⋅73c2+74c1+b⋅(−7c2)+72b+c1⋅(−72c2)=98c2∣7b+0∣=98c2⋅7b=14bc2
6. 计算三角形 ABC 的面积
S△ABC=21×b×c2=2bc2
7. 求面积比
S△PQRS△ABC=14bc22bc2=7
由此可得 S△PQR=71S△ABC。
于是我们只要求出
S△ABC 再除以
7 即可。
代码
CPP#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;
}