首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不正确的角度,计算错误的边

不正确的角度,计算错误的边
EN

Stack Overflow用户
提问于 2013-08-01 14:32:34
回答 3查看 390关注 0票数 7

我需要计算3分之间的角度。为此,我做以下工作:

  1. 抓取三个点(前一点、当前点和下一个点,都在一个循环内)
  2. 用毕达哥拉斯计算各点之间的距离
  3. Math.acos计算角度

对于没有超过180度天使的形状,这似乎很好,但是如果一个形状有这样一个角,它计算短边。这里有一个例子来说明我的意思(红色值是错误的):

这是进行计算的代码:

代码语言:javascript
复制
// 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

代码中有什么问题吗,我是忘了做什么,还是应该用完全不同的方式来做?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-01 15:55:56

你好,你的数学和计算都很完美。你遇到的问题和大多数人在计算器上遇到的问题一样,那就是定位。我要做的是找出这个点是在向量的左边还是右边,由前两个点使用这段代码,这是我从

Determine which side of a line a point lies

代码语言:javascript
复制
isLeft = function(ax,ay,bx,by,cx,cy){
 return ((bx - ax)*(cy - ay) - (by - ay)*(cx - ax)) > 0;
}

在这里,ax和ay在你的第二点组成你的第一点bx,而cy在你的第三点。

如果是在左边,只需在你的角度加上180。

票数 4
EN

Stack Overflow用户

发布于 2013-08-01 15:24:52

我有一个有用的例子,但不一定是简单的例子,说明了它的工作原理:

代码语言:javascript
复制
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减去这个角度,得到你想要的实际内部角度。

应该注意的是,这段代码当然可以被压缩,五行只是输出变量来查看正在发生的事情。我将让您担心为您自己的使用优化它,这是一个概念的证明。

票数 1
EN

Stack Overflow用户

发布于 2013-08-01 14:34:52

你需要检查边界条件(显然,如果点是共线性的),并应用适当的计算,以找到角度。此外,三角形不能有任何(内部)角大于180度。三角角之和为180度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17996979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档