题意
ABC的位置关系只有三种可能:
1.在一条直线上,输出TOWARDS
A--B--C
2.AB 和BC垂直,B为直角顶点,AB左侧是C,输出LEFT
C--B
|
A
3.AB 和BC垂直,B为直角顶点,AB右侧是C,输出RIGHT
B --C
|
A
给你ABC三点的坐标,求背朝A,站在B点,往C走要前进还是左转还是右转。
分析
假定ABC的坐标:A(xa,ya),B(xb,yb),C(xc,yc),粗体表示向量。
BA为(x1,y1)=(xa-xb,ya-yb)
BC为(x2,y2)=(xc-xb,yc-yb)
两个向量叉积的模计算如下
BA×BC=|BA||BC|sin(θ)
BC×BA=|BC||BA|sin(φ)
即夹角是第二个向量到第一个向量的顺时针方向的夹角,或者说第一个向量到第二个向量的逆时针方向的夹角。
当BA×BC的值大于0时说明BA为BC顺时针转过90度,对应RIGHT
当BA×BC的值小于0时说明BA为BC逆时针转过90度,对应LEFT
当BA×BC的值等于0时说明BA为BC顺时针转过180度。对应TOWARDS
BA×BC=(x1,y1)×(x2,y2)=下面的行列式
|x1 y1|
|x2 y2|
=x1*y2-x2*y1。
于是就可以根据结果输出答案。
代码
#include <cstdio> #define ll long long int main() { ll xa,xb,xc,ya,yb,yc; scanf("%lld%lld%lld%lld%lld%lld",&xa,&ya,&xb,&yb,&xc,&yc); ll ans=(xb-xa)*(yc-yb)-(xc-xb)*(yb-ya); if(ans>0) printf("LEFT"); else if(ans<0) printf("RIGHT"); else printf("TOWARDS"); }