where do I turn?

来源:互联网 发布:淘宝和京东的相同点 编辑:程序博客网 时间:2024/05/05 03:03

原题链接:

http://codeforces.com/problemset/problem/227/A

题目大意:英雄从A点出发,到达B点,然后判断到达B点后应该左转(LEFT),右转(RIGHT),还是直接(TOWARDS)到达。

解题思路:这是一个判断C点在向量AB左边,右边还是直接在向量AB上面的问题。可以通过向量的叉乘来解题。叉乘的定义如下(摘自博客http://blog.csdn.net/dcrmg/article/details/52416832):

叉乘公式

两个向量的叉乘,又叫向量积、外积、叉积,叉乘的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量组成的坐标平面垂直。

对于向量a和向量b:

a和b的叉乘公式为:

其中:

根据i、j、k间关系,有:

叉乘几何意义

在三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面。

在3D图像学中,叉乘的概念非常有用,可以通过两个向量的叉乘,生成第三个垂直于a,b的法向量,从而构建X、Y、Z坐标系。

在此题目中向量AB与AC都位于XY轴所在的平面上,所以仅仅只要看生成后的Z的坐标,用向量AB叉乘向量AC,然后判断Z值的正负,及AB向量为(x1,y1),AC向量为(x2,y2)的话,只需要计算出上图中x1*y2-x2*y1的值的正负即可。代码如下:

#include <iostream>#include <cstdio>#include <cmath>using namespace std;int main() {double a[3][2];for (int i=0; i<3; i++) {cin>>a[i][0]>>a[i][1];}double x1=a[1][0]-a[0][0];double y1=a[1][1]-a[0][1];double x2=a[2][0]-a[0][0];double y2=a[2][1]-a[0][1];double result = x1*y2-x2*y1;if (result == 0) cout<<"TOWARDS"<<endl;else if (result > 0) cout<<"LEFT"<<endl;else cout<<"RIGHT"<<endl;return 0;}


0 0
原创粉丝点击