点积公式详解

说点积之前,先回顾一下我们之前对余弦定理的应用。

已知m、o、n 三点,求∠nom

1.将点o 归零

m.x-=o.x;
m.y-=o.y;
n.x-=o.x;
n.y-=o.y;

2.求cos(∠nom) 的值

const dot=(m.x*n.x+m.y*n.y);
const len=Math.sqrt(m.x*m.x+m.y*m.y)*Math.sqrt(n.x*n.x+n.y*n.y);
const cosTheta=dot/len;

3.使用反余弦方法acos() 从cos(∠nom)解析出∠mon

const theta=Math.acos(cosTheta);

cos(∠nom) 中的∠mon 和最后解析出来的∠mon 可能是不一样的,解析出的∠mon 会在[0,Math.PI] 之间,如:

Math.acos(Math.cos(-Math.PI)) = 3.141592653589793

接下来咱们就说一下上面第2步中,cosTheta=dot/len 是怎么来的。

首先咱们先看一下点积公式。

已知向量A(Ax,Ay)、B(Bx,By),C在零点上,其夹角为∠ACB=γ

点积公式:A*B=|A|*|B|*cos(γ)
cos(γ)作因变量:cos(γ)=(A*B)/(|A|*|B|)

这就是cosTheta=dot/len 的由来,那点积公式是怎么来的呢?

这个得从余弦定理说起。

余弦定理:对于任意三角形,任何一边的平方等于其他两边平方的和减去这两边与它们夹角的余弦的积的两倍。

余弦公式:c²=a²+b²-2*a*b*cos(γ)

接下来咱们推理一下余弦公式。

因为c 边的长度可以看成AD和DB的和

所以:

c=a*cos(β)+b*cos(α)

把等号两边都乘以c:

c²=a*c*cos(β)+b*c*cos(α)

同理:

a²=a*c*cos(β)+a*b*cos(γ)
b²=b*c*cos(α)+a*b*cos(γ)

a²和 b²两两相加:

a²+b²=a*c*cos(β)+a*b*cos(γ)+b*c*cos(α)+a*b*cos(γ)

从中分析可以发现:a*c*cos(β)+b*c*cos(α) 正好等于 c²,

所以把c²代入上式中得:

a²+b²=c²+a*b*cos(γ)+a*b*cos(γ)
a²+b²=c²+2*a*b*cos(γ)

把c²作因变量,可得余弦公式:

c²=a²+b²-2*a*b*cos(γ)

有了余弦定理,我们就可以得到点积公式:

A*B=|A|*|B|*cos(γ)

这是一个边长和向量的换算问题。

因为:

c²=(A-B)²
a²=A²
b²=B²
a=|A|
b=|B|

所以:

(A-B)²=B²+A²-2*|B|*|A|*cos(γ)
A²-2AB+B²=B²+A²-2*|B|*|A|*cos(γ)
-2A*B=-2*|B|*|A|*cos(γ)
A*B=|B|*|A|*cos(γ)
cos(γ)=(A*B)/(|A|*|B|)

若把向量中的点位解开,因为:

A*B=Ax*Bx+Ay*By
|A|=Math.sqr(Ax*Ax+Ay*Ay)
|B|=Math.sqr(Bx*Bx+By*By)

所以:

cos(γ)=(Ax*Bx+Ay*By)/(Math.sqr(Ax*Ax+Ay*Ay)*Math.sqr(Bx*Bx+By*By))
我来评几句
登录后评论

已发表评论数()

相关站点

热门文章