叉乘公式


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


对于向量a和向量b:


向量叉乘 pytorch 向量叉乘计算公式_叉积


a和b的叉乘公式为:


向量叉乘 pytorch 向量叉乘计算公式_向量叉乘 pytorch_02


其中:


向量叉乘 pytorch 向量叉乘计算公式_叉积_03


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





向量叉乘 pytorch 向量叉乘计算公式_点乘_04




叉乘几何意义


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


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


向量叉乘 pytorch 向量叉乘计算公式_向量叉乘 pytorch_05


在二维空间中,叉乘还有另外一个几何意义就是:aXb等于由向量a和向量b构成的平行四边形的面积。

向量:u=(u1,u2,u3) v=(v1,v2,v3)
叉积公式:u x v = { u2v3-v2u3 ,u3v1-v3u1 ,u1v2-u2v1 }
点积公式:u * v = u1v1+u2v2+u3v33=lul*lvl*COS(U,V)
对于向量的运算,还有两个“乘法”,那就是点乘和叉乘了.点乘的结果就是两个向量的模相乘,然后再与这两个向量的夹角的余弦值相乘.或者说是两个向量的各个分量分别相乘的结果的和.很明显,点乘的结果就是一个数,这个数对我们分析这两个向量的特点很有帮助.如果点乘的结果为0,那么这两个向量互相垂直;如果结果大于0,那么这两个向量的夹角小于90度;如果结果小于0,那么这两个向量的夹角大于90度.对于叉乘,它的运算公式令人头晕,我就不说了,大家看下面的公式自己领悟吧……
向量c的方向与a,b所在的平面垂直,且方向要用“右手法则”判断(用右手的四指先表示向量a的方向,然后手指朝着手心的方向摆动到向量b的方向,大拇指所指的方向就是向量c的方向).
若向量a=(a1,b1,c1),向量b=(a2,b2,c2),
则 
向量a·向量b=a1a2+b1b2+c1c2 
向量a×向量b= 
| i j k| 
|a1 b1 c1| 
|a2 b2 c2|
=(b1c2-b2c1,c1a2-a1c2,a1b2-a2b1) 
(i、j、k分别为空间中相互垂直的三条坐标轴的单位向量).
叉乘的意义就是通过两个向量来确定一个新的向量,该向量与前两个向量都垂直



重点讲解:折线段的拐向判断


例题:


hrbust-13哥的机器人 
Description
 
13哥酷爱学习,13哥经过短暂学习后设计出来一机器人。13哥的机器人唯一缺陷是当遇到转弯时,就不知道该怎么走了,但是经过13哥的努力,这个机器人可以根据声音来转动方向,在没有声音的情况下沿直线行走。所以只能麻烦13哥在机器人遇到转弯时候,告诉机器人向左还是向右。 
Input 
有多组测试数据,第一行输入整数n,表示n个点(n>=3),接下来的n行每行输入一对数字x,y表示平面坐标系线路上的转折点(第一行是起点,最后一行是结束点)。当n为0时结束。 
Output 
对于每组输入数据单独一行,如果机器人往左转输出L,右则输出R 
Sample Input 
5

0 0

0 1

-1 1

-1 0

0 0

Sample Output 
LLL

#include<cstdio>
#include<cstring>

struct node
{
    int x,y;
}a[1005];

void check(node a,node b,node c)
{
     if((b.x-a.x)*(c.y-b.y)-(b.y-a.y)*(c.x-b.x)>0)
     {
         printf("L");
     }
     else if((b.x-a.x)*(c.y-b.y)-(b.y-a.y)*(c.x-b.x)==0)
     {
         return;
     }
     else
     {
         printf("R");
     }
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if(n==0)break;
        for(int i=0;i<n;i++)
        {
            scanf("%d %d",&a[i].x,&a[i].y);
        }
        for(int i=2;i<n;i++)
        {
            check(a[i-2],a[i-1],a[i]);
        }
        printf("\n");
    }
    return 0;
}