As angle(v1, v2) = acos( (v1x * v2x + v1y * v2y) / (sqrt(v1x^2+v1y^2) * sqrt(v2x^2+v2y^2)) ) https://stackoverflow.com/a/3441867/1615483我们知道v2 = [1, 0]
var v = {x: 0, y: 1},
angleRad = Math.acos( v.x / Math.sqrt(v.x*v.x + v.y*v.y) ),
angleDeg = angleRad * 180 / Math.PI;
where v
是向量[point2.x - point1.x , point2.y - point1.y]
编辑 - 我刚刚意识到你可能意味着将每个点视为一个向量,在这种情况下它是
var v1 = {x: 0, y: 1}, v2 = {x: 1, y: 0},
angleRad = Math.acos( (v1.x * v2.x + v1.y * v2.y) / ( Math.sqrt(v1.x*v1.x + v1.y*v1.y) * Math.sqrt(v2.x*v2.x + v2.y*v2.y) ) ),
angleDeg = angleRad * 180 / Math.PI;
where v1
是向量[point1.x , point1.y]
and v2
is [point2.x , point2.y]
Edit 2
如果您多次使用向量长度,为了加快速度,请将其保存为例如v.length = ...
这样你就可以得到它而无需再次重新计算。
如果您知道每个向量都需要多次计算其角度,请使用我编写的第一个方法并将其缓存,即v.angle = ...
。你可以然后你可以做v2.angle - v1.angle
找到两者之间的角度等
即有
function Vector(x, y){
this.x = x;
this.y = y;
this.length = Math.sqrt(x*x + y*y);
this.angle = Math.acos( x / this.length );
}
jsperf http://jsperf.com/shhacos-vs-array预先计算并在数组中查找3601
物品与使用acos https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Math/acos直接地