TRICENTR - Triangle From Centroid 题解
GoldenCreeper · · 题解
要看懂这篇题解,需要了解以下数学知识:
-
勾股定理:
a^{2} + b^{2} = c^{2} 。其中:a,b 为直角三角形的两条直角边,c 为直角三角形斜边。 -
海伦公式:
S = \sqrt{p(p-a)(p-b)(p-c)} 。其中:p = \frac{a + b + c}{2} ,a,b,c 为三角形三边长,S 为三角形面积。 -
两点坐标距离公式:
d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} 。其中:(x_1, y_1) 和(x_2, y_2) 分别代表两点的坐标,d 代表两点之间的距离。 -
三角形重心公式:
G = \left(\frac{x_1+x_2+x_3}{3}, \frac{y_1+y_2+y_3}{3} \right)
其中
首先,对于三角形的面积,我们可以使用海伦公式求解:
double calc_area(double a, double l, double m, double n)
{
double b = a * l / m;
double c = a * l / n;
double p = (a + b + c) / 2;
return sqrt(p * (p - a) * (p - b) * (p - c));
}
然后,我们使用 calc_distance 函数来计算重心与垂心的距离,需要一下几步:
- 计算出三角形的三边长:
b = \frac{a \cdot l}{m} ,c = \frac{a \cdot l}{n} 。 - 使用勾股定理,求出三角形的垂心的横坐标:
xa = \sqrt{\frac{a^2 \cdot l^2}{m^2} - 9 \cdot l^2} (此公式的证明可以看补充证明)。如果a^2 + b^2 - c^2 < 0 ,则xa = -xa 。 - 计算出三角形的重心的横坐标:
xg = \frac{a}{3} + \frac{xa}{3} 。 - 计算出三角形的重心的纵坐标:
yg = \frac{a \cdot xa - xa^2}{3 \cdot l} 。 - 使用两点坐标距离公式,求出重心坐标和垂心坐标之间的距离:
d = \sqrt{(xg - xa)^2 + (l - yg)^2} 。
double calc_distance(double a, double l, double m, double n)
{
double b = a * l / m;
double c = a * l / n;
double xa = sqrt(a * a * l * l / m / m - 9 * l * l);
if (a * a + b * b - c * c < 0)
xa = -xa;
double xg = a / 3 + xa / 3, yg = (a * xa - xa * xa) / 3 / l;
return sqrt((xg - xa) * (xg - xa) + (l - yg) * (l - yg));
}
补充证明:
三角形的底边为
现在,我们考虑一个点
将
移项:
用三角形的三边长关系:
移项:
因为
因此:
最后附上完整代码。
#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1);
double a, l, m, n;
double calc_area(double a, double l, double m, double n)
{
double b = a * l / m;
double c = a * l / n;
double p = (a + b + c) / 2;
return sqrt(p * (p - a) * (p - b) * (p - c));
}
double calc_distance(double a, double l, double m, double n)
{
double b = a * l / m;
double c = a * l / n;
double xa = sqrt(a * a * l * l / m / m - 9 * l * l);
if (a * a + b * b - c * c < 0)
xa = -xa;
double xg = a / 3 + xa / 3, yg = (a * xa - xa * xa) / 3 / l;
return sqrt((xg - xa) * (xg - xa) + (l - yg) * (l - yg));
}
int main()
{
int t;
cin >> t;
while (t--)
{
cin >> a >> l >> m >> n;
cout << fixed << setprecision(3) << calc_area(a, l, m, n) << " " << calc_distance(a, l, m, n) << endl;
}
return 0;
}