首页 > 试题

向量叉乘公式

更新时间:2022-11-12 08:06:28 阅读: 评论:0

中考数学解题规律总结-三点水心


2022年11月12日发(作者:天天有喜的歌曲)

向量-向量叉乘向量点乘

2010年07月28日星期三14:33

向量(Vector)

在几乎所有的几何问题中,向量(有时也称矢量)是一个基本点。向量的定义包含方向和一

个数(长度)。在二维空间中,一个向量可以用一对x和y来表示。例如由点(1,3)到(5,1

的向量可以用(4,-2)来表示。这里大家要特别注意,我这样说并不代表向量定义了起点和终

点。向量仅仅定义方向和长度。

向量加法

向量也支持各种数学运算。最简单的就是加法。我们可以对两个向量相加,得到的仍然是一

个向量。我们有:

V1(x1,y1)+V2(x2,y2)=V3(x1+x2,y1+y2)

下图表示了四个向量相加。注意就像普通的加法一样,相加的次序对结果没有影响(满足交

换律),减法也是一样的。

点乘(DotProduct)

如果说加法是凭直觉就可以知道的,另外还有一些运算就不是那么明显的,比如点乘和叉乘。

点乘比较简单,是相应元素的乘积的和:

V1(x1,y1)V2(x2,y2)=x1*x2+y1*y2

注意结果不是一个向量,而是一个标量(Scalar)。点乘有什么用呢,我们有:

AB=|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维空间,他可以推广到任意维空间。(译注:不少人对量子力学

中的高维空间无法理解,其实如果你不要试图在视觉上想象高维空间,而仅仅把它看成三维

空间在数学上的推广,那么就好理解了)

叉乘(crossproduct)

相对于点乘,叉乘可能更有用吧。2维空间中的叉乘是:

V1(x1,y1)XV2(x2,y2)=x1y2–y1x2

看起来像个标量,事实上叉乘的结果是个向量,方向在z轴上。上述结果是它的模。在二维

空间里,让我们暂时忽略它的方向,将结果看成一个向量,那么这个结果类似于上述的点积,

我们有:

AxB=|A||B|Sin(θ)

然而角度θ和上面点乘的角度有一点点不同,他是有正负的,是指从A到B的角度。下图

中θ为负。

另外还有一个有用的特征那就是叉积的绝对值就是A和B为两边说形成的平行四边形的面

积。也就是AB所包围三角形面积的两倍。在计算面积时,我们要经常用到叉积。

(译注:三维及以上的叉乘参看维基:/wiki/Cross_product)

点-线距离

找出一个点和一条线间的距离是经常遇见的几何问题之一。假设给出三个点,A,B和C,

你想找出点C到点A、B定出的直线间距离。第一步是找出A到B的向量AB和A到C的

向量AC,现在我们用该两向量的叉积除以|AB|,这就是我们要找的的距离了(下图中的红

线)。

d=(ABxAC)/|AB|

如果你有基础的高中几何知识,你就知道原因了。上一节我们知道(ABXAC)/2是三角形

ABC的面积,这个三角形的底是|AB|,高就是C到AB的距离。有时叉积得到的是一个负

值,这种情况下距离就是上述结果的绝对值。

当我们要找点到线段的距离时,情况变得稍稍复杂一些。这时线段与点的最短距离可能是点

到线段的某一端点,而不是点到直线的垂线。例如上图中点C到线段AB的最短距离应该

是线段BC。我们有集中不同的方法来判断这种特殊情况。第一种情况是计算点积ABBc来

判定两线段间。如果点积大于等于零,那么表示AB到BC是在-90到90度间,也就是

说C到AB的垂线在AB外,那么AB上到C距离最近的点就是B。同样,如果BAAC大

于等于零,那么点A就是距离C最近的点。如果两者均小于零,那么距离最近的点就在线

段AB中的莫一点。

源代码参考如下:

//ComputethedotproductABBC

intdot(int[]A,int[]B,int[]C){

AB=newint[2];

BC=newint[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];

intdot=AB[0]*BC[0]+AB[1]*BC[1];

returndot;

}

//ComputethecrossproductABxAC

intcross(int[]A,int[]B,int[]C){

AB=newint[2];

AC=newint[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];

intcross=AB[0]*AC[1]-AB[1]*AC[0];

returncross;

}

//ComputethedistancefromAtoB

doubledistance(int[]A,int[]B){

intd1=A[0]-B[0];

intd2=A[1]-B[1];

returnsqrt(d1*d1+d2*d2);

}

//ComputethedistancefromABtoC

//ifisSegmentistrue,ABisagment,notaline.

doublelinePointDist(int[]A,int[]B,int[]C,booleanisSegment){

doubledist=cross(A,B,C)/distance(A,B);

if(isSegment){

intdot1=dot(A,B,C);

if(dot1>0)returndistance(B,C);

intdot2=dot(B,A,C);

if(dot2>0)returndistance(A,C);

}

returnabs(dist);

}

上面的代码看起来似乎是很繁琐。不过我们可以看看在C++和C#中,采用了运算符重载的

类point,用‘*’代表点乘,用'^'代表叉乘(当然'+''-'还是你所希望的),那么看起来就简单些,

代码如下:

//ComputethedistancefromABtoC

//ifisSegmentistrue,ABisagment,notaline.

doublelinePointDist(pointA,pointB,pointC,boolisSegment){

doubledist=((B-A)^(C-A))/sqrt((B-A)*(B-A));

if(isSegment){

intdot1=(C-B)*(B-A);

if(dot1>0)returnsqrt((B-C)*(B-C));

intdot2=(C-A)*(A-B);

if(dot2>0)returnsqrt((A-C)*(A-C));

}

returnabs(dist);

}

本文发布于:2022-11-12 08:06:28,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/88/3341.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:nfp
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图