我需要计算3点之间的角度。为此,我执行以下操作:
- 抓住 3 个点(上一个、当前和下一个,它在一个循环中)
- 用毕达哥拉斯计算点之间的距离
- 使用计算角度
Math.acos
这似乎适用于没有超过 180 度角的形状,但是如果形状有这样的角,它会计算短边。这是一个说明我的意思的插图(红色值是错误的):
这是进行计算的代码:
// Pythagoras for calculating distance between two points (2D)
pointDistance = function (p1x, p1y, p2x, p2y) {
return Math.sqrt((p1x - p2x)*(p1x - p2x) + (p1y - p2y)*(p1y - p2y));
};
// Get the distance between the previous, current and next points
// vprev, vcur and vnext are objects that look like this:
// { x:float, y:float, z:float }
lcn = pointDistance(vcur.x, vcur.z, vnext.x, vnext.z);
lnp = pointDistance(vnext.x, vnext.z, vprev.x, vprev.z);
lpc = pointDistance(vprev.x, vprev.z, vcur.x, vcur.z);
// Calculate and print the angle
Math.acos((lcn*lcn + lpc*lpc - lnp*lnp)/(2*lcn*lpc))*180/Math.PI
代码中是否有问题,是我忘记做某事,还是应该以完全不同的方式完成?