向量向量叉乘向量点乘_第1页
向量向量叉乘向量点乘_第2页
向量向量叉乘向量点乘_第3页
向量向量叉乘向量点乘_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、向量-向量叉乘向量点乘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)下图表示了四个向量相加。注意就像普通的加法一样,相加的次序对结果

2、没有影响(满足交换律),减法也是一样的。Thesum&.fvectorsA+3+C+D点乘(DotProduct)如果说加法是凭直觉就可以知道的,另外还有一些运算就不是那么明显的,比如点乘和叉乘。点乘比较简单,是相应元素的乘积的和:V1(x1,y1)V2(x2,y2)=x1*x2+y1*y2注意结果不是一个向量,而是一个标量(Scalar)。点乘有什么用呢,我们有:AB=IAIIBIos()是向量A和向量B见的夹角。这里IAI我们称为向量A的模(norm),也就是A的长度,在二维空间中就是IAI=sqrt(x2+y2)。这样我们就和容易计算两条线的夹角:os()=AB/(IAIIBI)当然你知

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

4、。上述结果是它的模。在二维空间里,让我们暂时忽略它的方向,将结果看成一个向量,那么这个结果类似于上述的点积,我们有:AxB=IAIIBIin()然而角度和上面点乘的角度有一点点不同,他是有正负的,是指从A到B的角度。下图中为负。另外还有一个有用的特征那就是叉积的绝对值就是A和B为两边说形成的平行四边形的面积。也就是AB所包围三角形面积的两倍。在计算面积时,我们要经常用到叉积。(译注:三维及以上的叉乘参看维基:/wiki/Cross_product)点-线距离找出一个点和一条线间的距离是经常遇见的几何问题之一。假设给出三个点,A,B和C,你想找出点C到点A、B定出的直线间距离。第一步是找出A到B

5、的向量AB和A到C的向量AC,现在我们用该两向量的叉积除以|ABI,这就是我们要找的的距离了(下图中的红线)。d=(ABxAC)/IABI如果你有基础的高中几何知识,你就知道原因了。上一节我们知道(ABXAC)/2是三角形ABC的面积,这个三角形的底是IABI,高就是C到AB的距离。有时叉积得到的是一个负值,这种情况下距离就是上述结果的绝对值。当我们要找点到线段的距离时,情况变得稍稍复杂一些。这时线段与点的最短距离可能是点到线段的某一端点,而不是点到直线的垂线。例如上图中点C到线段AB的最短距离应该是线段BC。我们有集中不同的方法来判断这种特殊情况。第一种情况是计算点积ABBe来判定两线段间。

6、如果点积大于等于零,那么表示AB到BC是在-90到90度间,也就是说C到AB的垂线在AB夕卜,那么AB上到C距离最近的点就是B。同样,如果BAAC大于等于零,那么点A就是距离C最近的点。如果两者均小于零,那么距离最近的点就在线段AB中的莫一点。源代码参考如下:/ComputethedotproduetABBCintdot(intA,intB,intC)AB=newint2;BC=newint2;AB0=B0-A0;AB1=B1-A1;BC0=C0-B0;BC1=C1-B1;intdot=AB0*BC0+AB1*BC1;returndot;/ComputetheerossproduetABxAC

7、inteross(intA,intB,intC)AB=newint2;AC=newint2;AB0=B0-A0;AB1=B1-A1;AC0=C0-A0;AC1=C1-A1;inteross=AB0*AC1-AB1*AC0;returneross;/ComputethedistaneefromAtoBdoubledistanee(intA,intB)intd1=A0-B0;intd2=A1-B1;returnsqrt(d1*d1+d2*d2);/ComputethedistaneefromABtoC/ifisSegmentistrue,ABisasegment,notaline.doubleli

8、nePointDist(intA,intB,intC,booleanisSegment)doubledist=cross(A,B,C)/distance(A,B);if(isSegment)intdot1=dot(A,B,C);if(dot10)returndistance(B,C);intdot2=dot(B,A,C);if(dot20)returndistance(A,C);returnabs(dist);上面的代码看起来似乎是很繁琐。不过我们可以看看在C+和C#中,采用了运算符重载的类point,用我代表点乘,用人代表叉乘(当然+-还是你所希望的),那么看起来就简单些,代码如下:/ComputethedistancefromABtoC/ifisSegmentistrue,ABisasegment,notaline.doublelinePointDist(pointA,pointB,pointC,boolisSegment)doubledist=(B-A)人(C-A)/sqrt(B-A)*(B-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论