如何从三个点计算角度?[已关闭]
如何从三个点计算角度?[已关闭]
假设你有以下内容:
P1 = (x=2, y=50) P2 = (x=9, y=40) P3 = (x=5, y=20)
假设P1
是一个圆的中心点。它始终保持不变。
我想要计算由P2
和P3
组成的角度,或者换句话说,紧邻P1
的角度。确切地说,它始终是一个锐角,所以小于-90度。
我想:哇,这是简单的几何数学问题。但是我已经花了大约6个小时寻找公式,只找到了人们谈论复杂的NASA相关的内容,比如反余弦和向量标量积之类的东西。我感觉像是头被放进了冰箱里。
这里有数学大师认为这是一个简单的问题吗?我不认为编程语言在这里有什么影响,但是对于那些认为有影响的人来说:Java和Objective-C。我需要这两种语言的解决方案,但是我没有为它们打标签。
问题:如何从三个点计算角度?
原因:这个问题的出现是因为需要计算三个点之间的角度,但很多人对于如何计算角度存在困惑。
解决方法:最好的解决方法是使用atan2(y, x)
函数。给定一个点x, y
,该函数会返回从该点到X轴正方向的角度。具体的计算方法是将两个点通过-P1
进行平移(也就是将所有点平移,使得P1
位于原点),然后计算P3
和P2
的绝对角度之差。使用atan2
的优点是可以表示整个圆周(可以得到-π到π之间的任意角度),而使用acos
则需要根据正负值来处理多种情况才能计算正确的结果。唯一的特殊情况是当点为(0, 0)
时,此时P2
和P3
必须与P1
不同,否则谈论角度就没有意义。
补充回答:感谢你的回答,这正是我想要的。这是一个简单的解决方案,如果值为负数,只需加上2pi即可轻松得到逆时针角度。
补充回答:确实,atan2
正是这个问题所需要的,但看起来大多数人不会阅读或者不理解为什么基于acos
的解决方案是不好的。幸运的是,我已经过了多年前的“互联网上有人错了”的阶段,我不会为了捍卫显而易见的事实而开始争论。
补充回答:感谢你的回答,但你能处理三维情况吗?
补充回答:在三维空间中,如何定义角度?更具体地说,角度是否可以为负数或超过π(180度)?在三维空间中,两个非平行向量定义了一个平面,但这个平面可以从两个方向“看到”:从一边看,A看起来“在B的左边”,从另一边看,A看起来“在B的右边”...
补充回答:感谢你的回答,我在思考问题之前就发布了回答。现在我已经弄清楚了。
如何从三个点计算角度?
如果你指的是以P1为顶点的角度,可以使用余弦定理进行计算:
arccos((P12^2 + P13^2 - P23^2) / (2 * P12 * P13))
其中,P12是从P1到P2的线段长度,计算方法如下:
sqrt((P1x - P2x)^2 + (P1y - P2y)^2)
在某些语言中,acos常用的符号是cos^-1,但acos的表示更加明确。
只有少数语言使用符号'^'表示乘方,所以如果你不想使用arcos,可以直接输入cos⁻¹。(如果你使用的是商业操作系统,并且很难输入指数,我相信你可以购买一些键盘应用程序,或者安装一个浏览器插件。或者你可以在网络上搜索并复制粘贴。)
在实际回答中,我只在注释中使用'^',因为HTML的限制。在任何实际回答中,我肯定会使用上下标符号。
它是arccos,而不是arcos。
值得一提的是,这个公式是从“余弦定理”推导出来的。所以人们不要以为我们在施展魔法 🙂
如果你想要找到角度的符号,请查看下面的atan2解决方案。