【发布时间】:2019-08-25 20:40:02
【问题描述】:
计算两个向量之间的角度,你必须使用Math.acos(EDIT:原来一个不必使用Math.acos,因为有Math.atan2-way),它只接受[-1..1] 的范围。但是,如果 vector1.x==vector2.x 和 vector1.y==vector2.y AND 由于 JS 的性质,会导致 0.1+0.2>0.3 有时 Math.acos 得到 >1 的东西,并且毫不奇怪地返回 NaN。
我在所有计算之前通过 if-check 解决它,if (v1.x==v2.x&&v1.y==v2.y) 我只是 return 0
还有if (v1.x==-v2.x&&v1.y==-v2.y) return Math.PI。
我就是这样做的(EDIT 接受的答案有更好的版本):
function angle(origin, p1, p2, sign=false){
if (p1.x==p2.x && p1.y==p2.y) return 0
if (p1.x==-p2.x && p1.y==-p2.y) return Math.PI
const a = {x: p1.x-origin.x, y: p1.y-origin.y}
const b = {x: p2.x-origin.x, y: p2.y-origin.y}
sign = sign && a.x*b.y < a.y*b.x ? -1 : 1
return sign * Math.acos(
(a.x*b.x+a.y*b.y)/(Math.sqrt(a.x**2+a.y**2)*Math.sqrt(b.x**2+b.y**2))
)
}
它可以工作,但如果你做一些动态图形,是否有比以约 60fps 进行一堆中等复杂逻辑检查更好、更有效的方法?
【问题讨论】:
-
请访问help center,使用tour查看内容和How to Ask。做一些研究,搜索关于 SO 的相关主题;如果您遇到困难,请发布您的尝试minimal reproducible example,并注明输入和预期输出。
-
你可以
isNaN(NaN)。它与Math.acos函数无关,归结为三角函数。 acos 函数的结果永远不能大于 1 或小于 -1。因此,acos 函数的逆函数不能接受大于 1 或小于 -1 的参数。 -
@mplungjan srsly?我确实得到了这个问题,但没有答案,所以这实际上是一个好问题。
-
但是请点击编辑和sn-p编辑器给我们看一些代码
-
我用一个听起来很有趣的 if-check 解决了这个问题,你能给我们展示一些示例数据吗?
标签: javascript math trigonometry