where do I turn?

原题链接:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值