【CodeForces 227A】Where do I Turn?叉积

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(φ)

即夹角是第二个向量到第一个向量的顺时针方向的夹角,或者说第一个向量到第二个向量的逆时针方向的夹角。

【CodeForces 227A】Where do I Turn?叉积

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");
}