点乘(内积)

今天在项目中看到了“点到线段最短距离”的函数:

float GetDistanceToLine(Vector2 point, Vector2 p0, Vector2 p1)
{ //2D
    Vector2 v = p1 - p0;
    Vector2 w = point - p0;

    float c1 = Vector2.Dot(w,v);
    if ( c1 <= 0 )
        return w.Length();

    float c2 = Vector2.Dot(v);
    if ( c2 <= c1 )
        return Vector2.Distance(point,p1);

    Vector2 pb = Vector2.Lerp(p0,p1,c1 / c2); //垂直交点
    return Vector2.Distance(point,pb);
}

上边代码是2D,3D代码也一样,稍作修改即刻。其中点在线段两端,即没有垂直交点的情况看懂了(主要用到了点乘的夹角等)。反而在垂直情况下却没看明白(c1 / c2)。

因为数学基础不好(图形学就更甭说了)。平时只会调用API的我,决定要弄明白点乘的几何意义。

首先是查了查书,然后又请教了同事,同事研究了一回后说这是物理上的做功!

我们先看看书中的介绍:

书中说的几何意义只有两点:
1.向量的相似度
2.向量a在向量b上的投影(注意:投影向量a需要b的单位向量,稍作推导即可,[点乘符合交换率])

再说一下点乘的定义: a•b = |a||b|cosθ 
虽然说是定义,但我固执地认为这是推导出来的(事实上我错了),所以请教了同事:已知向量a,b,和其夹角θ.如何求cosθ?
他给了一个答案:cosθ = a•b / (|a||b|)

。。。三观崩裂了, a•b = |a||b|cosθ,然后再cosθ = a•b / (|a||b|)。。。 这是无法证明的死循环啊~~可能当时他的世界观被我带进坑去了,暂时没转出这个弯~

然后在请教了我哥(他数学比我好吧=m=),然后他说这是定义,无法推导 =。=
以我的脾气肯定不会放过他~然后问他cosθ怎么求,然后他跟我说自己看余弦定理。。。(我擦,这初中的知识啊!!!我都忘了!!当然还有正弦定理也忘了!!!)
然后他给我一个更简单但运算起来更复杂的方法:求a与x轴的夹角再减去b与x轴的夹角,就得到θ的角度。。。(好吧,还是好好回去补习余弦定理好了)

补习了余弦定理后再相应补了正弦定理,此时,已经是下班的节奏了。然后我决定推导成功后再回家!当然最后是失败了(那些过程略掉)
回家途中梳理了下思路,为什么我哥说这是定义,无法推导?后来发现这是一个简单的逻辑错误!!


  图1中点乘运算法则:(先假设成定义1)

 图2中的几何解释:a•b = |a||b|cosθ(假设成定义2)

其实我想要表达的意思是:定义1 和定义2 为何能划上等号!!??
也就是:a1b1+a2b2+...anbn = |a||b|cosθ 这个简化过程是怎么推导出来的!
所以a1b1+a2b2+...anbn 是定义(a•b = |a||b|cosθ)的简化过程!
(在回家路上想到了推导方法,就是两边平方)


推导过程:
a•b=axbx+ayby 

根据余弦定理: c2=a2+b2-2ab•cosθ → cosθ =(a2+b2-c2)/2ab

又因为:c = (a-b) -> c2 = (a-b)2 所以:cosθ2=(a2+b2-(a-b)2)2/4a2b2

 => (|a||b|cosθ)= a2b2•cosθ(a2+b2-(a-b)2)2/4 = (a2+b2-(a2+b2-2ab))2/4 = (a2+b2-a2-b2+2ab)2/4 = (a•b)2

注意:(a•b)中的“•”,不能忽略,因为是向量相乘,这里可能会想到是一种“死循环”,其实我们直接换成坐标来计算就知道了:(假设是2D)

a•b=axbx+ayby  为何能→ (a•b)2=(axbx+ayby)2 ?

上文推导到:
a2b2•cosθ2 
=  (a2+b2-(a-b)2)2/4
= ((ax2+ay2)+(bx2+by2) - ((ax-bx)2+(ay-by)2))2/4 {注意c(ax-bx,ay-by)=>c2=(ax-bx)2+(ay-by)2
((ax2+ay2)+(bx2+by2) - ((ax2+bx2-2axbx)+(ay2+by2-2ayby)))2/4  
= (ax2+ay2+bx
2+by
2 - (ax2+bx2-2axbx+ay2+by2-2ayby)2/4
= (ax2+ay2+bx2+by2 - (ax2+bx2-2axbx+ay2+by2-2ayby)2/4
= (ax2+ay2+bx2+by2 - ax2-bx2+2axbx-ay2-by2+2ayby)2/4
(最后这里不推导了。。博客园有BUG,这里试了很多次都一样。。。)2ab+2ab)/4 = = (xxyy2ab+ab)(xxyy2
= (2axb+2ab)/4 = xxyy


下图是手动的推导过程,一开始就拆散cosΘ计算,也不会联系上下文,没留意到可以直接将4约分,而是直接计算,搞得拐了个大弯。这些都是需要加强的部分。

至于它的几何意义,可能真的就那两个,如果硬算的话,拿它和做功联系起来也是不错的方式。
再回来看点乘,以书中向量投影一节为例,点乘其实就是v在n向量上的投影(v||)乘以n。也就是物理上的做功~(v在n向量上的投影(v||)就是功率)

在看看最初c1/c2为何成了插值? 其实c1 除以c2首先吧“路径长度”消除,成为了单纯的“功率比”。


参考资料:

维基百科,自由的百科全书 :

https://zh.wikipedia.org/wiki/%E5%8A%9F

不明白点积的几何意义: http://zhidao.baidu.com/question/43769423.html (这里也有人提到做功哦 -m-)

在网上搜了很多资料,都说两个向量A和B的点积的几何意义是A到B的投影,我是想不明白,根据点积的定义

A.B = |A||B|cos x, x 是A和B之间的夹角

这里,我们看到|A|cos x的确是向量A投影在向量B上的长度,但是它还要乘上B的长度呀,这样点积的值不是单纯的投影,请问各位向量A在B上投影长度乘上B的长度,如果是物理上的力和位移,这个量不难理解,它就是功,但几何上这个量是甚麼?到底怎样理解点积的几何意义?

先谢谢各位。
回复楼下的答题者:我不同意你后面的说法,符号是人为定义的,那有非遵循不可的?费曼也曾不屑旧符号而创造了自己的一套。再说,国外教材也不少使用大写,难道他们治学都不严谨!那治学严谨与否准则是谁定的?
我有更好的答案
 
提问者采纳
2008-01-14 06:55
几何上的意义没有什么重要意义, 正如楼主所说, 是一条边向另一边的投影乘以另一条边的长度. 不像叉乘, 其绝对值为以此二向量为相邻两边的平行四边形面积.

不过我们不需要理解它的几何意义, 我们只需要知道它衡量着两个向量的角度关系就够了. 这个可以帮助我们解决很多向量问题.

最后, 纠正一下楼主的表达方式, 大写字母一般用来表示点, 如果想表示向量, 最好还是用小写字母. 也许考试中不会被扣分, 不过这是一个治学严谨与否的态度问题.
提问者评价
谢谢。我不同意你后面的说法,如果遇到这样的老师,我倒想问他哪本数学书说不使用约定符号是错的?

原文地址:https://www.cnblogs.com/godzza/p/3013470.html