我需要计算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代码中有什么问题吗,我是忘了做什么,还是应该用完全不同的方式来做?
发布于 2013-08-01 15:55:56
你好,你的数学和计算都很完美。你遇到的问题和大多数人在计算器上遇到的问题一样,那就是定位。我要做的是找出这个点是在向量的左边还是右边,由前两个点使用这段代码,这是我从
Determine which side of a line a point lies
isLeft = function(ax,ay,bx,by,cx,cy){
return ((bx - ax)*(cy - ay) - (by - ay)*(cx - ax)) > 0;
}在这里,ax和ay在你的第二点组成你的第一点bx,而cy在你的第三点。
如果是在左边,只需在你的角度加上180。
发布于 2013-08-01 15:24:52
我有一个有用的例子,但不一定是简单的例子,说明了它的工作原理:
var point1x = 0, point1y = 0,
point2x = 10, point2y = 10,
point3x = 20, point3y = 10,
point4x = 10, point4y = 20;
var slope1 = Math.atan2(point2y-point1y,point2x-point1x)*180/Math.PI;
var slope2 = Math.atan2(point3y-point2y,point3x-point2x)*180/Math.PI;
var slope3 = Math.atan2(point4y-point3y,point4x-point3x)*180/Math.PI;
alert(slope1);
alert(slope2);
alert(slope3);
var Angle1 = slope1-slope2;
var Angle2 = slope2-slope3;
alert(180-Angle1);
alert(180-Angle2);(见http://jsfiddle.net/ZUESt/1/)
为了解释多个步骤,slopeN变量是单个线段的斜率。AngleN是在每个交界处(即N+1点)转动的量。正角是右转,负角是左转。
然后,你可以从180减去这个角度,得到你想要的实际内部角度。
应该注意的是,这段代码当然可以被压缩,五行只是输出变量来查看正在发生的事情。我将让您担心为您自己的使用优化它,这是一个概念的证明。
发布于 2013-08-01 14:34:52
你需要检查边界条件(显然,如果点是共线性的),并应用适当的计算,以找到角度。此外,三角形不能有任何(内部)角大于180度。三角角之和为180度。
https://stackoverflow.com/questions/17996979
复制相似问题