精华内容
下载资源
问答
  • 向量点乘和叉乘

    千次阅读 2021-05-29 20:46:30
    title: 向量点乘和叉乘 categories: Math tags: Math Knowledge 向量点乘和叉乘 假设存在向量a向量b:$ a=[a_{1},a_{2},a_{3}],b=[b_{1},b_{2},b_{3}] $ 点乘 向量a向量b的点乘公式如下: $ a\bullet b=a_{1}...

    title: 向量点乘和叉乘

    categories:

    • Math

    tags:

    • Math
    • Knowledge

    向量点乘和叉乘

    假设存在向量a和向量b:$ a=[a_{1},a_{2},a_{3}],b=[b_{1},b_{2},b_{3}] $

    点乘

    向量a和向量b的点乘公式如下:

    $ a\bullet b=a_{1}b_{1}+a_{2}b_{2}+a_{3}b_{3} $

    要求是向量a和向量的b的维度要相同。

    点乘的几何意义

    点乘的几何意义是可以用来表征或者计算两个向量之间的夹角,以及在b向量或在a向量方向上的投影,公式如下:

    $ a\bullet b=a_{1}b_{1}+a_{2}b_{2}+a_{3}b_{3}=|a||b|cos \theta $

    首先假设一下向量构成:

    figure.1

    推导过程如下:

    • 根据上图可以得到c=a-b
    • 根据三角余弦定理可以得到: $ c^{2}=a^{2}+b^{2}-2|a||b|cos \theta$
    • 根据c=a-b,我们可以对上式变换得到 $ (a-b) \bullet(a-b)=a^{2}+b^{2}-2 a \bullet b=a^{2}+b^{2}-2|a \| b| \cos \theta $
    • 化简上式我们可以得到: $ a\bullet b=|a||b|cos \theta $
    • 因此在已知向量a和向量b长度的情况下,我们可以计算得到a和b的夹角θ
    • $ \theta=arc\: cos\left ( \frac{a \bullet b}{|a||b|} \right ) $

    根据上述公式就可以计算向量a和向量b之间的夹角,从而就进一步判断出这两个向量是否是同一方向,是否正交,具体对应关系如下:

    • a·b>0 : 方向基本相同,夹角在0到90度之间
    • a·b=0 : 两个向量正交,相互垂直
    • a·b<0 : 方向基本相反,夹角在90度到180度之间

    叉乘

    两个向量的叉乘,又叫向量积、叉积,叉乘的运算结果是一个向量而不是一个标量。并且两个向量的叉乘与这两个向量组成的坐标平面垂直
    同样是使用之前假设的向量a和向量b,我们可以得到向量a和向量b的叉乘公式:

    $ a \times b=\left|\begin{array}{lll}\mathrm{i} & \mathrm{j} & \mathrm{k} \\a_{1} & a_{2} & a_{3} \\b_{1} & b_{2} & b_{3}\end{array}\right|=\left(a_{2}b_{3}-a_{3}b_{2}\right) i-\left(a_{1}b_{3}-a_{3}b_{1}\right) j+\left(a_{1}b_{2}-a_{2}b_{1}\right) k $

    其中$ i=(1,0,0),j=(0,1,0),k=(0,0,1) $, 其中ijk均为单位向量,最后叉乘的结果为一个向量,所以ijk要为向量,因此单纯的ab相乘再相减得到的标量。
    因此根据上述i、j、k间的关系,有如下式子(直接用向量表示):

    $ a\times b=\left( a_{2}b_{3}-a_{3}b_{2}, a_{1}b_{3}-a_{3}b_{1}, a_{1}b_{2}-a_{2}b_{1} \right) $

    注意: 一个向量叉乘自己得到的是0向量,根据右手定则,叉乘得到的结果无论怎么旋转都会永远会垂直这个向量,因此只有0向量满足。

    叉乘的几何意义

    在三维几何中,向量a和向量b的叉乘结果是一个向量,这个向量又称为法向量,它是a和b构成的平面的法向量(垂直)。

    figure.2

    如上图。

    右手法则:使用右手法则来判断a×b向量的方向,如下图所示

    figuer.3

    判断方法如下:

    • 右手手掌张开,四指并拢,大拇指垂直于四指指向的方向
    • 伸出右手,四指弯曲,四指与A旋转到B方向一致,那么大拇指指向为C向量的方向
    展开全文
  • 向量点乘叉乘

    万次阅读 多人点赞 2019-02-25 14:06:01
    向量点乘叉乘 向量(Vector)  在几乎所有的几何问题中,向量(有时也称矢量)是一个基本点。向量的定义包含方向一个数(长度)。在二维空间中,一个向量可以用一对xy来表示。例如由点(1,3)到(5,1的向量...

    向量点乘与叉乘

    向量(Vector)
          在几乎所有的几何问题中,向量(有时也称矢量)是一个基本点。向量的定义包含方向和一个数(长度)。在二维空间中,一个向量可以用一对x和y来表示。例如由点(1,3)到(5,1的向量可以用(4,-2)来表示。这里大家要特别注意,我这样说并不代表向量定义了起点和终点。向量仅仅定义方向和长度。

    向量加法
          向量也支持各种数学运算。最简单的就是加法。我们可以对两个向量相加,得到的仍然是一个向量。我们有:
          V1(x1, y1)+V2(x2, y2)=V3(x1+x2, y1+y2)
          下图表示了四个向量相加。注意就像普通的加法一样,相加的次序对结果没有影响(满足交换律),减法也是一样的。
     
    点乘(Dot Product)
          如果说加法是凭直觉就可以知道的,另外还有一些运算就不是那么明显的,比如点乘和叉乘。
          点乘比较简单,是相应元素的乘积的和:
          V1( x1, y1)   V2(x2, y2) = x1*x2 + y1*y2
          注意结果不是一个向量,而是一个标量(Scalar)。点乘有什么用呢,我们有:
          A   B = |A||B|Cos(θ)
          θ是向量A和向量B见的夹角。这里|A|我们称为向量A的模(norm),也就是A的长度, 在二维空间中就是|A| = sqrt(x2+y2)。这样我们就和容易计算两条线的夹角:    Cos(θ) = AB /(|A||B|)

          当然你知道要用一下反余弦函数acos()啦。(回忆一下cos(90)=0 和cos(0) = 1还是有好处的,希望你没有忘记。)这可以告诉我们如果点乘的结果,简称点积,为0的话就表示这两个向量垂直。当两向量平行时,点积有最大值
          另外,点乘运算不仅限于2维空间,他可以推广到任意维空间。(译注:不少人对量子力学中的高维空间无法理解,其实如果你不要试图在视觉上想象高维空间,而仅仅把它看成三维空间在数学上的推广,那么就好理解了)

    叉乘(cross product)
          相对于点乘,叉乘可能更有用吧。2维空间中的叉乘是:
          V1(x1, y1) X V2(x2, y2) = x1y2 – y1x2
          看起来像个标量,事实上叉乘的结果是个向量,方向在z轴上。上述结果是它的模。在二维空间里,让我们暂时忽略它的方向,将结果看成一个向量,那么这个结果类似于上述的点积,我们有:
        A x B = |A||B|Sin(θ)

          然而角度 θ和上面点乘的角度有一点点不同,他是有正负的,是指从A到B的角度。因此 ,向量的外积不遵守乘法交换率,因为向量a×向量b=-向量b×向量a在物理学中,已知力与力臂求外积,就是向量的外积,即叉乘。

          向量c的方向与a,b所在的平面垂直,且方向要用“右手法则”判断。判断方法如下:

    1.右手手掌张开,四指并拢,大拇指垂直于四指指向的方向;

    2.伸出右手,四指弯曲,四指与A旋转到B方向一致,那么大拇指指向为C向量的方向。

                                            

          另外还有一个有用的特征那就是叉积的绝对值就是A和B为两边说形成的平行四边形的面积。也就是AB所包围三角形面积的两倍。在计算面积时,我们要经常用到叉积。

    (译注:三维及以上的叉乘参看维基:http://en.wikipedia.org/wiki/Cross_product)

    点-线距离
          找出一个点和一条线间的距离是经常遇见的几何问题之一。假设给出三个点,A,B和C,你想找出点C到点A、B定出的直线间距离。第一步是找出A到B的向量AB和A到C的向量AC,现在我们用该两向量的叉积除以|AB|,这就是我们要找的的距离了(下图中的红线)。
        d = (AB x AC)/|AB| 

          如果你有基础的高中几何知识,你就知道原因了。上一节我们知道(AB X AC)/2是三角形ABC的面积,这个三角形的底是|AB|,高就是C到AB的距离。有时叉积得到的是一个负值,这种情况下距离就是上述结果的绝对值。
          当我们要找点到线段的距离时,情况变得稍稍复杂一些。这时线段与点的最短距离可能是点到线段的某一端点,而不是点到直线的垂线。例如上图中点C到线段AB的最短距离应该是线段BC。我们有集中不同的方法来判断这种特殊情况。第一种情况是计算点积AB B来判定两线段间夹角。如果点积大于等于零,那么表示AB到BC是在-90到90度间,也就是说C到AB的垂线在AB外,那么AB上到C距离最近的点就是B。同样,如果BAAC大于等于零,那么点A就是距离C最近的点。如果两者均小于零,那么距离最近的点就在线段AB中的莫一点。

    源代码参考如下:
         //Compute the dot product AB   BC
         int dot(int[] A, int[] B, int[] C){
             AB = new int[2];
             BC = new int[2];
             AB[0] = B[0]-A[0];
             AB[1] = B[1]-A[1];
             BC[0] = C[0]-B[0];
             BC[1] = C[1]-B[1];
             int dot = AB[0] * BC[0] + AB[1] * BC[1];
             return dot;
         }
         //Compute the cross product AB x AC
         int cross(int[] A, int[] B, int[] C){
             AB = new int[2];
             AC = new int[2];
             AB[0] = B[0]-A[0];
             AB[1] = B[1]-A[1];
             AC[0] = C[0]-A[0];
             AC[1] = C[1]-A[1];
             int cross = AB[0] * AC[1] - AB[1] * AC[0];
             return cross;
         }
         //Compute the distance from A to B
         double distance(int[] A, int[] B){
             int d1 = A[0] - B[0];
             int d2 = A[1] - B[1];
             return sqrt(d1*d1+d2*d2);
         }
         //Compute the distance from AB to C
         //if isSegment is true, AB is a segment, not a line.
         double linePointDist(int[] A, int[] B, int[] C, boolean isSegment){
             double dist = cross(A,B,C) / distance(A,B);
             if(isSegment){
                 int dot1 = dot(A,B,C);
                 if(dot1 > 0)return distance(B,C);
                 int dot2 = dot(B,A,C);
                 if(dot2 > 0)return distance(A,C);
             }
             return abs(dist);
         }

          上面的代码看起来似乎是很繁琐。不过我们可以看看在C++和C#中,采用了运算符重载的类point,用‘*’代表点乘,用'^'代表叉乘(当然'+''-'还是你所希望的),那么看起来就简单些,代码如下:

       //Compute the distance from AB to C
         //if isSegment is true, AB is a segment, not a line.
         double linePointDist(point A, point B, point C, bool isSegment){
             double dist = ((B-A)^(C-A)) / sqrt((B-A)*(B-A));
             if(isSegment){
                 int dot1 = (C-B)*(B-A);
                 if(dot1 > 0)return sqrt((B-C)*(B-C));
                 int dot2 = (C-A)*(A-B);
                 if(dot2 > 0)return sqrt((A-C)*(A-C));
             }
             return abs(dist);
         }

    展开全文
  • 向量点乘:a*b公式:a*b= |a| * |b| * cosθ点乘又叫向量的内积、数量积,是一个向量和它在另一个向量上的投影的长度的乘积;是标量。点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大。向量的...

    向量的点乘:a * b

    公式:a * b = |a| * |b| * cosθ

    点乘又叫向量的内积、数量积,是一个向量和它在另一个向量上的投影的长度的乘积;是标量。

    点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大。

    向量的叉乘:a ∧ b

    a ∧ b = |a| * |b| * sinθ

    向量积被定义为:

    模长:(在这里θ表示两向量之间的夹角(共起点的前提下)(0° ≤ θ ≤ 180°),它位于这两个矢量所定义的平面上。)

    方向:a向量与b向量的向量积的方向与这两个向量所在平面垂直,且遵守右手定则。(一个简单的确定满足“右手定则”的结果向量的方向的方法是这样的:若坐标系是满足右手定则的,当右手的四指从a以不超过180度的转角转向b时,竖起的大拇指指向是c的方向。c = a ∧ b)8b7d318c87f8d13ab5068a6d4ce14878.png

    特别的,在二维中,两个向量的向量积的模的绝对值等于由这两天向量组成的平行四边形的面积。a7c16476b843a4ecc8e83afa0b866637.png

    向量的叉乘,即求同时垂直两个向量的向量,即c垂直于a,同时c垂直于b(a与c的夹角为90°,b与c的夹角为90°)

    c =  a×b = (a.y*b.z-b.y*a.z , b.x*a.z-a.x*b.z  , a.x*b.y-b.x*a.y)f325447650d64de3bf341d21ec0ec5b3.png

    以上图为例a(1,0,0),b(0,1,0),c=a×b = (0,0,1)

    叉乘的几何意义

    |c|=|a×b|=|a| |b|sinα(α为a,b向量之间的夹角)

    |c| = a,b向量构成的平行四边形的面积 (如下图所示的平行四边形)4974d554cd08caf6297f060395c67a9f.png

    叉乘的拓展

    1.在一般的常识或者教科书中规定叉乘只有3d才拥有,其实2d也可以拓展出来一个叉乘形式,而且非常有用。

    拓展方式:假设有两个2d向量a,b,我们直接把他们视为3d向量,z轴补0,那么这个时候的a,b向量的叉乘结果c,c.x=0,c.y=0,c.z=a.x*b.y-b.x*a.y,

    这个时候可以吧2d的叉乘值定义为得到一个值,而不是得到一个向量,那么这个值k, k = c.z=a.x*b.y-b.x*a.y,我们可以通过这个k值得到很多有用的性质

    1.a,b向量构成的平行四边形的面积。

    2.如果k>0时,那么a正旋转到b的角度为<180°,如果k<0,那么a正旋转到b的角度为>180°,如果k=0 那么a,b向量平行。

    展开全文
  • 对于游戏行业程序员来说,向量点乘叉乘”是非常熟悉的运算。从代码上看他们很简单:(以下代码选自UE4的“Vector.h”) 点乘就是各分量逐项相乘,最终得到了一个标量: FORCEINLINE float FVector::Dot...

    目标

    对于游戏行业程序员来说,向量“点乘”和“叉乘”是非常熟悉的运算。从代码上看他们运算过程并不复杂:(以下代码选自UE4的“Vector.h”)

    点乘就是各分量逐项相乘,最终得到了一个标量

    FORCEINLINE float FVector::DotProduct(const FVector& A, const FVector& B)
    {
    	return X*V.X + Y*V.Y + Z*V.Z;
    }
    

    叉乘最终得到一个新的向量,虽然其运算现在看起来略显“奇怪”(不过,在随后的证明中可以看出其重要的几何意义):

    FORCEINLINE FVector FVector::CrossProduct(const FVector& A, const FVector& B)
    {
    	return FVector
    		(
    		Y * V.Z - Z * V.Y,
    		Z * V.X - X * V.Z,
    		X * V.Y - Y * V.X
    		);
    }
    

    即:
    a ⃗ ⋅ b ⃗ = x a x b + y a y b + z a z b \vec{a}\cdot\vec{b} = x_ax_b+y_ay_b+z_az_b a b =xaxb+yayb+zazb

    a ⃗ × b ⃗ = ( y a z b − z a y b , z a x b − x a z b , x a y b − y a x b ) \vec{a}\times\vec{b} = (y_az_b-z_ay_b,z_ax_b-x_az_b,x_ay_b-y_ax_b) a ×b =(yazbzayb,zaxbxazb,xaybyaxb)

    他们各自都有重要的几何意义,经常会出现在有关空间计算的逻辑中,例如:

    • 标准化后向量点乘得到的值为夹角的余弦。这样,只要计算点乘,得到-1~ 0 ~1,便可知道两个向量之间方向的关系是相反 ~ 垂直 ~ 相同
    • 向量叉乘后得到的新向量一定和原先两个向量垂直。
    • 向量叉乘后得到的向量的模,其值为两个向量构成的三角形的面积的二倍。

    向量点乘和叉乘的这些特性经常被使用,但是对于其中的数学原理我是模糊不清的,因此我想自己动手证明一下。

    而为了让这些证明得更容易,我还需要在此之前证明其基于的一些定理。

    1. 证明:勾股定理

    定理:
    对于一个直角三角形ABC,其中直角为∠BAC,有:
    B C 2 = A B 2 + A C 2 BC^2=AB^2+AC^2 BC2=AB2+AC2


    其证明网上有很多种,下面的方法据说来自于欧几里得的《几何原本》。
    在这里插入图片描述
    (图片来源勾股定理_百度百科

    由于 三角形FBC正方形GFBA 同底等高,所以有:
    S F B C × 2 = S G F B A S_{FBC}\times2=S_{GFBA} SFBC×2=SGFBA

    由于 三角形FBC三角形ABD 为全等三角形,所以有:
    S F B C = S A B D S_{FBC}=S_{ABD} SFBC=SABD

    由于 三角形ABD矩形BDLK 同底等高,所以有:
    S A B D × 2 = S B D L K S_{ABD}\times2=S_{BDLK} SABD×2=SBDLK

    因此:
    S G F B A = S F B C × 2 = S A B D × 2 = S B D L K S_{GFBA}=S_{FBC}\times2=S_{ABD}\times2=S_{BDLK} SGFBA=SFBC×2=SABD×2=SBDLK

    同理:
    S A C I H = S K L E C S_{ACIH}=S_{KLEC} SACIH=SKLEC

    (即图中粉色正方形的面积等于粉色矩形的面积,蓝色正方形的面积等于蓝色矩形的面积)

    因此:
    B C 2 = S B D E C = S B D L K + S K L E C = S G F B A + S A C I H = A B 2 + A C 2 \begin{aligned} BC^2 & =S_{BDEC}\\ & =S_{BDLK}+S_{KLEC}\\ & =S_{GFBA}+S_{ACIH}\\ & = AB^2+AC^2\\ \end{aligned} BC2=SBDEC=SBDLK+SKLEC=SGFBA+SACIH=AB2+AC2

    2. 证明:余弦定理

    定理:
    对于任意一个三角形ABC,有:
    A B 2 = B C 2 + A C 2 − 2 B C ⋅ A C ⋅ c o s C AB^2=BC^2+AC^2-2BC \cdot AC \cdot cosC AB2=BC2+AC22BCACcosC


    证明网上也有很多种,下面的方法据说也来自于欧几里得的《几何原本》。
    在这里插入图片描述

    在直角三角形ADC中,有:
    A D = A C ⋅ s i n C AD = AC \cdot sinC AD=ACsinC

    C D = A C ⋅ c o s C CD = AC \cdot cosC CD=ACcosC

    在CB边上,有:
    D B = B C − C D = B C − A C ⋅ c o s C DB= BC-CD=BC- AC \cdot cosC DB=BCCD=BCACcosC

    在直角三角形ADB中,由勾股定理可得:
    A B 2 = A D 2 + D B 2 = ( A C ⋅ s i n C ) 2 + ( B C − A C ⋅ c o s C ) 2 = A C 2 ⋅ s i n C 2 + B C 2 + A C 2 ⋅ c o s C 2 − 2 B C ⋅ A C ⋅ c o s C = B C 2 + A C 2 ⋅ s i n C 2 + A C 2 ⋅ c o s C 2 − 2 B C ⋅ A C ⋅ c o s C = B C 2 + A C 2 ( s i n C 2 + c o s C 2 ) − 2 B C ⋅ A C ⋅ c o s C = B C 2 + A C 2 − 2 B C ⋅ A C ⋅ c o s C \begin{aligned} AB^2 & =AD^2+DB^2\\ & =(AC \cdot sinC)^2+(BC- AC \cdot cosC)^2\\ & =AC^2\cdot sinC^2+BC^2+AC^2\cdot cosC^2-2BC \cdot AC \cdot cosC\\ & =BC^2+AC^2\cdot sinC^2+AC^2\cdot cosC^2-2BC \cdot AC \cdot cosC\\ & =BC^2+AC^2(sinC^2+cosC^2)-2BC \cdot AC \cdot cosC\\ & =BC^2+AC^2-2BC \cdot AC \cdot cosC\\ \end{aligned} AB2=AD2+DB2=(ACsinC)2+(BCACcosC)2=AC2sinC2+BC2+AC2cosC22BCACcosC=BC2+AC2sinC2+AC2cosC22BCACcosC=BC2+AC2(sinC2+cosC2)2BCACcosC=BC2+AC22BCACcosC

    3. 证明:向量点乘的几何意义——结果为模相乘再乘夹角余弦

    向量点乘的定义如下:
    a ⃗ ⋅ b ⃗ = x a x b + y a y b + z a z b \vec{a}\cdot\vec{b} = x_ax_b+y_ay_b+z_az_b a b =xaxb+yayb+zazb

    现在想证明的是:(其中θ为两向量夹角)
    a ⃗ ⋅ b ⃗ = ∥ a ⃗ ∥ ⋅ ∥ b ⃗ ∥ c o s θ \vec{a}\cdot\vec{b} =\left \| \vec{a} \right \|\cdot\left \| \vec{b} \right \|cos\theta a b =a b cosθ


    在证明前,先看一个算不上是“定理”的结论:
    对于一个2维的向量(x,y),由于坐标系是垂直的,所以由勾股定理很容易能推导出
    2 维 向 量 长 度 2 = x 2 + y 2 2维向量长度^2=x^2+y^2 22=x2+y2

    对于一个3维的向量(x,y,z),也可以很容易能推导出:
    3 维 向 量 长 度 2 = x 2 + y 2 + z 2 3维向量长度^2=x^2+y^2+z^2 32=x2+y2+z2


    下面正式开始证明:
    在这里插入图片描述

    如果将向量a和向量b的起点放在一起,那么这两个向量终点之间的向量即为 a-b

    而根据余弦定理,有:
    ∥ a ⃗ − b ⃗ ∥ 2 = ∥ a ⃗ ∥ 2 + ∥ b ⃗ ∥ 2 − 2 ∥ a ⃗ ∥ ⋅ ∥ b ⃗ ∥ c o s θ \left \| \vec{a} -\vec{b} \right \|^2=\left \| \vec{a} \right \|^2 +\left \| \vec{b} \right \|^2 -2\left \| \vec{a} \right \|\cdot\left \| \vec{b} \right \|cos\theta a b 2=a 2+b 22a b cosθ
    写成分量的形式,就是:
    ( ( x a , y a , z a ) − ( x b , y b , z b ) ) 2 = ( x a , y a , z a ) 2 + ( x b , y b , z b ) 2 − 2 ∥ a ⃗ ∥ ⋅ ∥ b ⃗ ∥ c o s θ ((x_a,y_a,z_a)-(x_b,y_b,z_b))^2=(x_a,y_a,z_a)^2+(x_b,y_b,z_b)^2-2\left \| \vec{a} \right \|\cdot\left \| \vec{b} \right \|cos\theta ((xa,ya,za)(xb,yb,zb))2=(xa,ya,za)2+(xb,yb,zb)22a b cosθ

    向量相减即各分量相减,即:
    ( x a − x b , y a − y b , z a − z b ) 2 = ( x a , y a , z a ) 2 + ( x b , y b , z b ) 2 − 2 ∥ a ⃗ ∥ ⋅ ∥ b ⃗ ∥ c o s θ (x_a-x_b,y_a-y_b,z_a-z_b)^2=(x_a,y_a,z_a)^2+(x_b,y_b,z_b)^2-2\left \| \vec{a} \right \|\cdot\left \| \vec{b} \right \|cos\theta (xaxb,yayb,zazb)2=(xa,ya,za)2+(xb,yb,zb)22a b cosθ

    将平方的运算展开:
    x a 2 + x b 2 − 2 x a x b + y a 2 + y b 2 − 2 y a y b + z a 2 + z b 2 − 2 z a z b = x a 2 + x b 2 + y a 2 + y b 2 + z a 2 + z b 2 − 2 ∥ a ⃗ ∥ ⋅ ∥ b ⃗ ∥ c o s θ x_a^2+x_b^2-2x_ax_b+y_a^2+y_b^2-2y_ay_b+z_a^2+z_b^2-2z_az_b=x_a^2+x_b^2+y_a^2+y_b^2+z_a^2+z_b^2-2\left \| \vec{a} \right \|\cdot\left \| \vec{b} \right \|cos\theta xa2+xb22xaxb+ya2+yb22yayb+za2+zb22zazb=xa2+xb2+ya2+yb2+za2+zb22a b cosθ

    去掉等式两边重复项可得:
    − 2 x a x b − 2 y a y b − 2 z a z b = − 2 ∥ a ⃗ ∥ ⋅ ∥ b ⃗ ∥ c o s θ -2x_ax_b-2y_ay_b-2z_az_b=-2\left \| \vec{a} \right \|\cdot\left \| \vec{b} \right \|cos\theta 2xaxb2yayb2zazb=2a b cosθ

    约去-2得:
    x a x b + y a y b + z a z b = ∥ a ⃗ ∥ ⋅ ∥ b ⃗ ∥ c o s θ x_ax_b+y_ay_b+z_az_b=\left \| \vec{a} \right \|\cdot\left \| \vec{b} \right \|cos\theta xaxb+yayb+zazb=a b cosθ

    结合向量点乘的定义,则最后可知:
    a ⃗ ⋅ b ⃗ = x a x b + y a y b + z a z b = ∥ a ⃗ ∥ ⋅ ∥ b ⃗ ∥ c o s θ \begin{aligned} \vec{a}\cdot\vec{b} & =x_ax_b+y_ay_b+z_az_b \\ & =\left \| \vec{a} \right \|\cdot\left \| \vec{b} \right \|cos\theta \\ \end{aligned} a b =xaxb+yayb+zazb=a b cosθ

    4. 证明:向量叉乘的几何意义——结果与原先两个向量都垂直

    向量叉乘的定义如下:
    a ⃗ × b ⃗ = ( y a z b − z a y b , z a x b − x a z b , x a y b − y a x b ) \vec{a}\times\vec{b} = (y_az_b-z_ay_b,z_ax_b-x_az_b,x_ay_b-y_ax_b) a ×b =(yazbzayb,zaxbxazb,xaybyaxb)

    由前面证明的向量点乘的几何意义可知,
    如果能证明:

    ( a ⃗ × b ⃗ ) ⋅ a ⃗ = 0 (\vec{a}\times\vec{b} )\cdot \vec{a}=0 (a ×b )a =0

    ( a ⃗ × b ⃗ ) ⋅ b ⃗ = 0 (\vec{a}\times\vec{b} )\cdot \vec{b}=0 (a ×b )b =0

    则意味着向量叉乘的结果向量,和原先两个向量的夹角的余弦值都为0,即夹角为90°,即与原先两个向量都垂直


    而这个证明可以直接从算式中得出:
    ( a ⃗ × b ⃗ ) ⋅ a ⃗ = ( y a z b − z a y b , z a x b − x a z b , x a y b − y a x b ) ⋅ ( x a , y a , z a ) = y a z b x a − z a y b x a + z a x b y a − x a z b y a + x a y b z a − y a x b z a = ( y a z b x a − x a z b y a ) + ( x a y b z a − z a y b x a ) + ( z a x b y a − y a x b z a ) = 0 + 0 + 0 = 0 \begin{aligned} (\vec{a}\times\vec{b} )\cdot \vec{a} & = (y_az_b-z_ay_b,z_ax_b-x_az_b,x_ay_b-y_ax_b) \cdot (x_a,y_a,z_a) \\ & =y_az_bx_a-z_ay_bx_a+z_ax_by_a-x_az_by_a+x_ay_bz_a-y_ax_bz_a\\ & =(y_az_bx_a-x_az_by_a)+(x_ay_bz_a-z_ay_bx_a)+(z_ax_by_a-y_ax_bz_a)\\ & =0+0+0\\ & =0\\ \end{aligned} (a ×b )a =(yazbzayb,zaxbxazb,xaybyaxb)(xa,ya,za)=yazbxazaybxa+zaxbyaxazbya+xaybzayaxbza=(yazbxaxazbya)+(xaybzazaybxa)+(zaxbyayaxbza)=0+0+0=0

    ( a ⃗ × b ⃗ ) ⋅ b ⃗ = ( y a z b − z a y b , z a x b − x a z b , x a y b − y a x b ) ⋅ ( x b , y b , z b ) = y a z b x b − z a y b x b + z a x b y b − x a z b y b + x a y b z b − y a x b z b = ( y a z b x b − y a x b z b ) + ( z a x b y b − z a y b x b ) + ( x a y b z b − x a z b y b ) = 0 + 0 + 0 = 0 \begin{aligned} (\vec{a}\times\vec{b} )\cdot \vec{b} & = (y_az_b-z_ay_b,z_ax_b-x_az_b,x_ay_b-y_ax_b) \cdot (x_b,y_b,z_b) \\ & =y_az_bx_b-z_ay_bx_b+z_ax_by_b-x_az_by_b+x_ay_bz_b-y_ax_bz_b\\ & =(y_az_bx_b-y_ax_bz_b)+(z_ax_by_b-z_ay_bx_b)+(x_ay_bz_b-x_az_by_b)\\ & =0+0+0\\ & =0\\ \end{aligned} (a ×b )b =(yazbzayb,zaxbxazb,xaybyaxb)(xb,yb,zb)=yazbxbzaybxb+zaxbybxazbyb+xaybzbyaxbzb=(yazbxbyaxbzb)+(zaxbybzaybxb)+(xaybzbxazbyb)=0+0+0=0

    5. 证明:向量叉乘的几何意义——结果的模为原先两向量的模相乘再乘夹角正弦

    向量叉乘的定义如下:
    a ⃗ × b ⃗ = ( y a z b − z a y b , z a x b − x a z b , x a y b − y a x b ) \vec{a}\times\vec{b} = (y_az_b-z_ay_b,z_ax_b-x_az_b,x_ay_b-y_ax_b) a ×b =(yazbzayb,zaxbxazb,xaybyaxb)

    现在想证明的是:(其中θ为两向量夹角)
    ∥ a ⃗ × b ⃗ ∥ = ∥ a ⃗ ∥ ∥ b ⃗ ∥ s i n θ \left \|\vec{a}\times\vec{b}\right \| =\left \| \vec{a} \right \|\left \| \vec{b} \right \|sin\theta a ×b =a b sinθ


    (方法来自于《3D游戏与计算机图形学中的数学方法》)

    取向量叉乘结果的平方,逐步展开:
    ∥ a ⃗ × b ⃗ ∥ 2 = ( y a z b − z a y b , z a x b − x a z b , x a y b − y a x b ) 2 = ( y a z b − z a y b ) 2 + ( z a x b − x a z b ) 2 + ( x a y b − y a x b ) 2 = ( y a 2 z b 2 + z a 2 y b 2 − 2 y a z b z a y b ) + ( z a 2 x b 2 + x a 2 z b 2 − 2 z a x b x a z b ) + ( x a 2 y b 2 + y a 2 x b 2 − 2 x a y b y a x b ) = ( y a 2 z b 2 + z a 2 y b 2 + z a 2 x b 2 + x a 2 z b 2 + x a 2 y b 2 + y a 2 x b 2 ) + ( − 2 y a z b z a y b − 2 z a x b x a z b − 2 x a y b y a x b ) \begin{aligned} \left \|\vec{a}\times\vec{b}\right \| ^2 & = (y_az_b-z_ay_b,z_ax_b-x_az_b,x_ay_b-y_ax_b)^2 \\ & = (y_az_b-z_ay_b)^2+(z_ax_b-x_az_b)^2+(x_ay_b-y_ax_b)^2 \\ & = (y_a^2z_b^2+z_a^2y_b^2-2y_az_bz_ay_b)+(z_a^2x_b^2+x_a^2z_b^2-2z_ax_bx_az_b)+(x_a^2y_b^2+y_a^2x_b^2-2x_ay_by_ax_b) \\ & = (y_a^2z_b^2+z_a^2y_b^2+z_a^2x_b^2+x_a^2z_b^2+x_a^2y_b^2+y_a^2x_b^2)+(-2y_az_bz_ay_b-2z_ax_bx_az_b-2x_ay_by_ax_b)\\ \end{aligned} a ×b 2=(yazbzayb,zaxbxazb,xaybyaxb)2=(yazbzayb)2+(zaxbxazb)2+(xaybyaxb)2=(ya2zb2+za2yb22yazbzayb)+(za2xb2+xa2zb22zaxbxazb)+(xa2yb2+ya2xb22xaybyaxb)=(ya2zb2+za2yb2+za2xb2+xa2zb2+xa2yb2+ya2xb2)+(2yazbzayb2zaxbxazb2xaybyaxb)

    下面便出现了我觉得这种证明方法比较“魔法”的一个操作,对于等号右侧:
    左部分先加上了 ( x a 2 x b 2 + y a 2 y b 2 + z a 2 z b 2 ) (x_a^2x_b^2+y_a^2y_b^2+z_a^2z_b^2) (xa2xb2+ya2yb2+za2zb2),右部分再减去它。一番“折腾”之后,虽然结果未受影响,但是却让左部分凑出了原先两向量的模的形式,右部分凑出了向量点乘的形式,具体来看:
    ∥ a ⃗ × b ⃗ ∥ 2 = ( y a 2 z b 2 + z a 2 y b 2 + z a 2 x b 2 + x a 2 z b 2 + x a 2 y b 2 + y a 2 x b 2 ) + ( x a 2 x b 2 + y a 2 y b 2 + z a 2 z b 2 ) + ( − 2 y a z b z a y b − 2 z a x b x a z b − 2 x a y b y a x b ) − ( x a 2 x b 2 + y a 2 y b 2 + z a 2 z b 2 ) = ( y a 2 z b 2 + z a 2 y b 2 + z a 2 x b 2 + x a 2 z b 2 + x a 2 y b 2 + y a 2 x b 2 + x a 2 x b 2 + y a 2 y b 2 + z a 2 z b 2 ) − ( x a 2 x b 2 + y a 2 y b 2 + z a 2 z b 2 + 2 y a z b z a y b + 2 z a x b x a z b + 2 x a y b y a x b ) = ( x a 2 + y a 2 + z a 2 ) ( x b 2 + y b 2 + z b 2 ) − ( x a x b + y a y b + z a z b ) 2 = ∥ a ⃗ ∥ 2 ∥ b ⃗ ∥ 2 − ( a ⃗ ⋅ b ⃗ ) 2 \begin{aligned} \left \|\vec{a}\times\vec{b}\right \| ^2 & = (y_a^2z_b^2+z_a^2y_b^2+z_a^2x_b^2+x_a^2z_b^2+x_a^2y_b^2+y_a^2x_b^2)+(x_a^2x_b^2+y_a^2y_b^2+z_a^2z_b^2)+(-2y_az_bz_ay_b-2z_ax_bx_az_b-2x_ay_by_ax_b)-(x_a^2x_b^2+y_a^2y_b^2+z_a^2z_b^2)\\ & = (y_a^2z_b^2+z_a^2y_b^2+z_a^2x_b^2+x_a^2z_b^2+x_a^2y_b^2+y_a^2x_b^2+x_a^2x_b^2+y_a^2y_b^2+z_a^2z_b^2)-(x_a^2x_b^2+y_a^2y_b^2+z_a^2z_b^2+2y_az_bz_ay_b+2z_ax_bx_az_b+2x_ay_by_ax_b)\\ & = (x_a^2+y_a^2+z_a^2)(x_b^2+y_b^2+z_b^2)-(x_ax_b+y_ay_b+z_az_b)^2\\ & =\left \| \vec{a} \right \|^2\left \| \vec{b} \right \|^2-(\vec{a}\cdot\vec{b})^2\\ \end{aligned} a ×b 2=(ya2zb2+za2yb2+za2xb2+xa2zb2+xa2yb2+ya2xb2)+(xa2xb2+ya2yb2+za2zb2)+(2yazbzayb2zaxbxazb2xaybyaxb)(xa2xb2+ya2yb2+za2zb2)=(ya2zb2+za2yb2+za2xb2+xa2zb2+xa2yb2+ya2xb2+xa2xb2+ya2yb2+za2zb2)(xa2xb2+ya2yb2+za2zb2+2yazbzayb+2zaxbxazb+2xaybyaxb)=(xa2+ya2+za2)(xb2+yb2+zb2)(xaxb+yayb+zazb)2=a 2b 2(a b )2

    而根据前面证明的向量点乘的几何意义可知:
    a ⃗ ⋅ b ⃗ = ∥ a ⃗ ∥ ⋅ ∥ b ⃗ ∥ c o s θ \vec{a}\cdot\vec{b} =\left \| \vec{a} \right \|\cdot\left \| \vec{b} \right \|cos\theta a b =a b cosθ

    所以:
    ∥ a ⃗ × b ⃗ ∥ 2 = ∥ a ⃗ ∥ 2 ∥ b ⃗ ∥ 2 − ∥ a ⃗ ∥ 2 ∥ b ⃗ ∥ 2 ⋅ ( c o s θ ) 2 = ∥ a ⃗ ∥ 2 ∥ b ⃗ ∥ 2 ⋅ ( 1 − ( c o s θ ) 2 ) \begin{aligned} \left \|\vec{a}\times\vec{b}\right \| ^2 & = \left \| \vec{a} \right \|^2\left \| \vec{b} \right \|^2-\left \| \vec{a} \right \|^2\left \| \vec{b} \right \|^2\cdot (cos\theta)^2\\ & = \left \| \vec{a} \right \|^2\left \| \vec{b} \right \|^2\cdot (1- (cos\theta)^2) \end{aligned} a ×b 2=a 2b 2a 2b 2(cosθ)2=a 2b 2(1(cosθ)2)

    又因为【 ( c o s θ ) 2 + ( s i n θ ) 2 = 1 (cos\theta)^2+(sin\theta)^2=1 (cosθ)2+(sinθ)2=1 】一定成立
    所以:
    ∥ a ⃗ × b ⃗ ∥ 2 = ∥ a ⃗ ∥ 2 ∥ b ⃗ ∥ 2 ⋅ ( s i n θ ) 2 \left \|\vec{a}\times\vec{b}\right \| ^2= \left \| \vec{a} \right \|^2\left \| \vec{b} \right \|^2\cdot (sin\theta)^2 a ×b 2=a 2b 2(sinθ)2

    开方得:
    ∥ a ⃗ × b ⃗ ∥ = ∥ a ⃗ ∥ ∥ b ⃗ ∥ ⋅ s i n θ \left \|\vec{a}\times\vec{b}\right \|= \left \| \vec{a} \right \|\left \| \vec{b} \right \|\cdot sin\theta a ×b =a b sinθ

    6. 证明:向量叉乘的几何意义——结果的模为原先两向量构成三角形的面积二倍

    在前者证明之后,此证明变得很容易,因为:

    ∥ b ⃗ ∥ ⋅ s i n θ \left \| \vec{b} \right \|\cdot sin\theta b sinθ 的长度就是以a为底边的三角形的高度:

    在这里插入图片描述
    所以:
    ∥ a ⃗ × b ⃗ ∥ = ∥ a ⃗ ∥ ∥ b ⃗ ∥ ⋅ s i n θ = ( ∥ a ⃗ ∥ ) × ( ∥ b ⃗ ∥ ⋅ s i n θ ) = 底 × 高 = 2 × ( 底 × 高 2 ) = 2 × S 三 角 形 \begin{aligned} \left \|\vec{a}\times\vec{b}\right \| & = \left \| \vec{a} \right \|\left \| \vec{b} \right \|\cdot sin\theta\\ & = (\left \| \vec{a} \right \|)\times (\left \| \vec{b} \right \|\cdot sin\theta)\\ & = 底 \times 高\\ & = 2\times (\frac{底 \times 高}{2})\\ & = 2\times S_{三角形} \end{aligned} a ×b =a b sinθ=(a )×(b sinθ)=×=2×(2×)=2×S

    总结

    向量点乘

    定义

    a ⃗ ⋅ b ⃗ = x a x b + y a y b + z a z b \vec{a}\cdot\vec{b} = x_ax_b+y_ay_b+z_az_b a b =xaxb+yayb+zazb

    几何意义与作用举例

    a ⃗ ⋅ b ⃗ = ∥ a ⃗ ∥ ⋅ ∥ b ⃗ ∥ c o s θ \vec{a}\cdot\vec{b} =\left \| \vec{a} \right \|\cdot\left \| \vec{b} \right \|cos\theta a b =a b cosθ

    • 可以算出向量的夹角
    • 可以直接根据此值判断两向量方向的关系:-1~ 0 ~1对应于相反 ~ 垂直 ~ 相同

    向量叉乘

    定义

    a ⃗ × b ⃗ = ( y a z b − z a y b , z a x b − x a z b , x a y b − y a x b ) \vec{a}\times\vec{b} = (y_az_b-z_ay_b,z_ax_b-x_az_b,x_ay_b-y_ax_b) a ×b =(yazbzayb,zaxbxazb,xaybyaxb)

    几何意义与作用举例1

    结果的向量与原先两个向量都垂直

    • 可以用来快速算出两个向量确定的一个平面的法向量方向。
    几何意义与作用举例2

    ∥ a ⃗ × b ⃗ ∥ = ∥ a ⃗ ∥ ∥ b ⃗ ∥ s i n θ \left \|\vec{a}\times\vec{b}\right \| =\left \| \vec{a} \right \|\left \| \vec{b} \right \|sin\theta a ×b =a b sinθ

    • 可以用来在已知顶点位置情况下,快速算出空间内一个三角形的面积。
    展开全文
  • 向量点乘和叉乘

    千次阅读 2021-03-07 10:36:29
    向量点乘和叉乘2019-12-09 15:46:24文/董月点乘,也叫数量积。结果是一个向量在另一个向量方向上投影的长度,是一个标量。叉乘,也叫向量积。结果是一个已有两个向量都垂直的向量点乘和叉乘的区别点乘向量的...
  • 一、高三数学向量公式二、高三数学向量知识点梳理看过""的还:...向量a=(x1,y1),向量b=(x2,y2),x1y2-x2y1=0。a⊥b的充要条件是a·b=0,即(x1x2+y1y2)=0。“在数学中,向量(也称为欧几里得向量、几何向量、矢量),指...
  • 向量: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)对于向量的运算,还有两个“乘法”,那就是点乘和叉乘了。点乘的结果...
  • 向量点乘叉乘推导公式

    千次阅读 2019-10-02 22:52:52
    ======点乘====== 推导公式1: a•b = ax*bx + ay*by = (|a|*sinθ1) * (|b| * sinθ2) +(|a| * cosθ1) * (|b| * cosθ2) = |a||b|(sinθ1*sinθ2 + cosθ1*cosθ2) =|a||b|(cos(θ1-θ2)) =|a||b|cosθ 推导...
  • 向量点乘\叉乘,矩阵向量乘法

    千次阅读 2020-03-29 21:23:28
    公式:a ·b = |a| * |b| * cosθ 点乘又叫向量的内积、数量积,是一个向量和它在另一个向量上的投影的长度的乘积;是标量。 点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大。 例:若向量a=...
  • Unity中点乘和叉乘点乘(API: Vector3.Dot())点乘的计算公式点乘的几何意义用途之一:判断一个物体当前方位利用点乘求出角度叉乘(API: Vector3.Cross())叉乘计算公式叉乘的几何意义判断物体是在左侧还是右侧 点乘...
  • 向量点乘叉乘应用

    千次阅读 2021-01-13 19:27:25
    先阐述一下向量的概念和公式,再结合例子去验证这些公式1、向量的模:向量的大小就是向量各分量平方的平方根。向量的模公式: 设 a = (x, y, z),|a|= sqr(x * x + y * y + z * z);对应unity中的Vector3.magnitude...
  • 点乘和叉乘

    千次阅读 2020-03-25 21:26:17
    向量 向量是由n个实数组成的一个n行1列(n1)或一个1行n列(1n)的有序数组; 点乘 向量点乘,也叫向量的内积、数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘...aXb等于由向量a和向量b构成的...
  • 向量和矩阵的点乘和叉乘

    千次阅读 2021-01-29 10:40:23
    向量 定义:向量是由N个实数组成的一...叉乘:又叫向量积、外积、叉积,叉乘向量a[x1,y1,z1]和向量b[x2,y2,z2]叉乘的运算结果是一个向量,并且两个向量的叉积与这两个向量组成的坐标平面垂直,记作axb; 计算方式:.
  • 【Unity】向量点乘叉乘

    千次阅读 2017-11-20 19:17:29
    【参考原文】Unity3D之Vector3.DotVector3.Cross的使用 【参考原文】Unity3D之点乘和差乘  在Unity3D中,Vector3.Dot表示求两个向量的点积;... 简单的说,点乘判断角度,叉乘判断方向。 形象的说当一个敌
  • Unity游戏开发——向量运算(点乘和叉乘) 0.前言 在游戏开发中,确定目标得方向,朝向,夹角等相关数据需要用到向量的计算,其中最常用到的就时点乘和叉乘。 因为我们主要研究的是游戏开发中的3D世界向量,所以小面...
  • 点乘和叉乘运算法则

    千次阅读 2021-01-13 19:27:52
    点乘,也叫向量的内积、数量积。运算法则为向量向量b=|a||b|cos叉乘,也叫向量的外积、向量积。运算法则为|向量c|=|向量向量b|=|a||b|sin。运算法则点乘点乘,也叫向量的内积、数量积。顾名思义,求下来的结果...
  • 向量点乘叉乘

    千次阅读 2019-03-30 21:07:44
    点乘又叫向量的内积、数量积,是一个向量和它在另一个向量上的投影的长度的乘积;是标量。 点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大。 向量叉乘: a ∧ b a...
  • 定义向量 以OSG (OpenSceneGraph)为例 定于向量的数据类型 typedef float value_type 向量的维度 enum{num_components = 3; //这里以三维为例子} 三维向量的各个分量可以用一维数组表示 ; value_type _v[3]; ##...
  • 假如 向量a 为(x1, y1),向量b为(x2, y2) 点积(也叫内积)结果 为 x1 * x2 + y1 * y2 = |a||b| cos<a,b>,可以理解为向量a在向量b上投影的长度乘以向量b的长度。 叉积(也叫外积)的模为 x1 * y2 - x2 * y1...
  • 3维向量点乘叉乘运算

    万次阅读 2020-11-04 20:30:36
    3维向量点乘叉乘运算 文章目录3维向量点乘叉乘运算三维向量的点乘三维向量的叉乘点到直线的距离点到平面的距离 三维向量的点乘 点乘得到的是对应元素乘积的,是一个标量,没有方向 V1( x1, y1, z1)·V2(x2, y2...
  • 向量点乘和叉乘在游戏中的应用

    千次阅读 2017-04-16 12:26:45
    公式:abcosθ,向量夹角θ为90度,则垂直) (2)本质上其实是判断两个向量相似的程度(2个向量夹角越小,越相似)。 (3)计算敌人在你的正方向上行走的距离,利用的是计算一个向量在另一个向量上的投影分量...
  • 关于向量点乘和叉乘的基本知识

    千次阅读 2017-03-06 20:47:20
    向量是由n个实数组成的一个n行1列(n*1)或一个1行n列(1*n)的有序数组; ...向量点乘,也叫向量的内积、数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘...对于向量a和向量b:  

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,881
精华内容 752
关键字:

向量点乘和叉乘的公式