关于 向右转 一题的思路+代码(叉乘性质or解析几何)

题目来源:NEFU OJ-760 向右转

题目描述

相信同学们都经过军训,每当听到严厉的教官喊“向右转,齐步走!”,相信你没有胆量向左转吧!现在的问题是这样的:给定三个点A,B,C,
教官要求你踏着正步,从A点经过B点到达C点,问该同学在B点是向右转还是向左转还是沿着直线走?

输入描述

输入数据有T(T <= 100)组,每组1行,即依次是A,B,C的坐标,A,B,C的坐标值均为整数,且没有两点的坐标是重合的,数据范围均在int内。

输出描述

在B点如果向右转输出“Right”,向左转输出“Left”,沿着直线走则输出“Straight”

输入样例

3
0 0 0 1 1 1
0 0 0 1 -1 1
0 0 0 1 0 4

输出样例

Right
Left
Straight

OP

下面有两种解法,一种是通过向量叉乘的(不了解向量叉乘的可以戳这里,里面图示非常直观),另一种是通过解析几何方法,不过比较麻烦。

叉乘

思路

性质,方向遵循右手定则,具体戳上面的链接即可。

代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll M=10007;

int main()
{
    int xa,ya,xb,yb,xc,yc,k,b,del;
    cin>>xa;//原题中t可以不要
    while(cin>>xa>>ya>>xb>>yb>>xc>>yc)
    {
        int x1,y1,x2,y2;//两向量的坐标表示
        x1=xb-xa;
        y1=yb-ya;
        x2=xc-xb;
        y2=yc-yb;
        del=x1*y2-y1*x2;//计算叉乘
        if(del==0)printf("Straight\n");
        else if(del>0)printf("Left\n");
        else printf("Right\n");
    }
    return 0;
}

解析几何

思路

这个思路是没了解叉乘之前做的,略麻烦,但是也能A。

首先进行判直,这个通过计算斜率的式子变形即可避免除0问题。

接下来进行左右判定:
在高中数学的点到直线距离公式中,分子被绝对值套住的一部分表面是防止距离变负,实际上也可以作为判定点与该直线上下关系(y轴方向)的判据(该值为正,点在直线之上;反之在之下;为0即点在线上);
在这里插入图片描述

这道题中左右判定除了点与线的上下关系,还需要A点与B点的左右关系;

仅说结论即为:(A在B左 && 点在线上)||(A在B右 && 点在线下)为左转;反之为右转。

具体实现上,我选择用点斜式直接变形为一般式,对于斜率不存在的情况,我们可以添加一个微小的误差,使斜率存在。

代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll M=10007;

int main()
{
    double xa,ya,xb,yb,xc,yc,k,b,del;
    cin>>xa;
    while(cin>>xa>>ya>>xb>>yb>>xc>>yc)
    {
        if(fabs((ya-yb)*(xc-xb)-(yc-yb)*(xa-xb))<=0.0001)//判直
        {
            printf("Straight\n");
            continue;
        }
        if(fabs(xa-xb)<=0.0001)xb+=0.0001;//添加误差
        k=(ya-yb)/(xa-xb);
        b=ya-k*xa;//求直线系数
        del=xb-xa;//AB相对位置
        if((-k*xc+yc-b)*(del)>0)printf("Left\n");//判
        else printf("Right\n");
    }
    return 0;
}

ED

叉乘真好用!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 向量叉乘向量的结果是一个向量,这个向量垂直于原来两个向量所在的平面,并且方向由右手定则决定。如果再用这个向量叉乘原来的其中一个向量,得到的向量就是三个向量构成的体积。这个体积的大小等于原来两个向量所在平面上的平行四边形的面积,方向由右手定则决定。因此,向量叉乘向量叉乘向量的几何意义是计算三个向量所构成的体积。 ### 回答2: 向量叉乘是指给定两个向量,通过运算得到一个新的向量。当一个向量与另一个向量进行叉乘后再与另一个向量再次进行叉乘,这种操作的几何意义是构造一个垂直于原始平面的新向量。 具体来说,假设有向量A和向量B,根据向量叉乘定义,得到向量C=A×B。向量C垂直于原始平面,其方向可由右手法则确定。意味着C与向量A和向量B共面,并且C的大小等于A和B所在平面的面积乘以sinθ,其中θ为A和B之间的夹角。 当我们将C与向量B进行叉乘后,得到向量D=C×B。向量D不再垂直于原始平面,而是沿着A和B共线的方向。这是因为向量B的方向与向量C共面,所以向量D与向量C共线,并且其方向由右手法则确定。向量D的大小等于C和B所在平面的面积乘以sinφ,其中φ为C和B之间的夹角。 因此,当一个向量与另一个向量进行叉乘后再与另一个向量再次进行叉乘时,结果向量沿着原始平面的垂直方向和共线方向分别表达了原始平面的法向量和垂直向量。这种操作可以用于计算平面的法线方向、计算两个向量构成的平面的面积,或者用于构造与多个向量共面且垂直于它们的向量。 ### 回答3: 向量叉乘是一种在三维空间中定义的运算,它用来产生一个新的向量,该向量与原来的两个向量垂直,并且符合右手法则。向量叉乘有一个重要的几何意义,即两个向量叉乘结果可以得到一个垂直于这两个向量所构成的平面的向量。 当我们对一个向量a叉乘向量b再叉乘向量c时,可以表示为(a×b)×c。这个结果代表了一个新的向量,它垂直于向量a×b和向量c所构成的平面。具体来说,向量a×b所表示的是一个平面,而向量c在该平面上的垂直向量,所以(a×b)×c表示了平面上的一个垂直于该平面的向量。 几何意义上来讲,向量a×b表示了由向量a和向量b所构成的平面的法向量,而(a×b)×c则表示了由向量a、向量b和向量c所构成的平面的法向量。具体来说,这个法向量垂直于这个平面并指向其中一个方向。这个结果在三维几何中有广泛的应用,例如计算平面的法向量、计算线段之间的夹角等。 总之,向量叉乘向量叉乘向量的几何意义是得到一个垂直于两个向量构成的平面的向量,它在几何上表示了这个平面的法向量,可以用来解决与平面相关的几何问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值