题目描述
In the x y xy xy-plane, there are three points A A A( x A x_A xA, y A y_A yA), B B B( x B x_B xB, y B y_B yB), and C C C( x C x_C xC, y C y_C yC) that are not collinear. Determine whether the triangle ABC is a right triangle.
题目描述也就是给了我们三个点的坐标,问我们,这个三角形是否为直角三角形
思路
对于已知三个点,去判断他为什么三角形,我们有多种方式去判断,最简单也就是利用余弦定理了
我们已知这个公式的话也可以直接解决这个题目了,当然,我这里打算对这个公式进行展开,我们先画出这个三角形
根据图片中所描述,我们可以发现,
c
=
a
−
b
c = a - b
c=a−b,我们把该公式替换进余弦定理中,展开为
最后,我们可以得到
那么此时,我们是不是就得知了这个
θ
θ
θ了
因为
∣
a
∣
∗
∣
b
∣
|a| * |b|
∣a∣∗∣b∣是已知值,所以确定符号的也就是
a
⋅
b
a·b
a⋅b了,那么结论也就是
- a ⋅ b > 0 a·b>0 a⋅b>0 方向基本相同,夹角在0°到90°之间
- a ⋅ b = 0 a·b=0 a⋅b=0 正交,相互垂直
- a ⋅ b < 0 a·b<0 a⋅b<0 方向基本相反,夹角在90°到180°之间
p
s
:
ps:
ps: 这里的这个乘法是点乘,不是叉乘,点乘的计算方式是如下:
假如
a
a
a与
b
b
b的值为:
那么
a
⋅
b
a·b
a⋅b也就是:
最终代码
此时,我们就得到了该答案的正确且快捷的写法:
求出三个向量,然后分别判断他们两两的点乘是否存在0即可,也可以拓展为判断三角形是否是锐角、钝角,这里就不做描述了,代码如下:
#include <iostream>
#include <algorithm>
void solve()
{
int x1,y1,x2,y2,x3,y3;
std::cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
int a1 = x1 - x2,b1 = y1 - y2;
int a2 = x1 - x3,b2 = y1 - y3;
int a3 = x2 - x3,b3 = y2 - y3;
if((a1*a2+b1*b2 == 0) || (a1*a3 + b1*b3 == 0) || (a2 * a3 + b2 * b3 == 0)) std::cout << "Yes";
else std::cout << "No";
}
int main()
{
int T = 1;//std::cin >> T;
while(T--) solve();
return 0;
}