让我们说你有这个:
P1 = (x=2, y=50)
P2 = (x=9, y=40)
P3 = (x=5, y=20)
假设 P1
是圆的中心点 . 它总是一样的 . 我想要由 P2
和 P3
组成的角度,或者换句话说是 P1
旁边的角度 . 内角是精确的 . 它总是一个锐角,所以小于-90度 .
我想:伙计,这是简单的几何数学 . 但我现在已经找了一个大约6个小时的公式,并且只找到人们谈论复杂的美国宇航局的东西,如arccos和矢量标量产品 . 我的头感觉像在冰箱里 .
一些数学大师认为这是一个简单的问题吗?我不认为编程语言在这里很重要,但对于那些认为它的人来说:java和objective-c . 我需要它,但没有标记它们 .
16 回答
如果你的意思是P1是顶点的角度那么使用Law of Cosines应该工作:
其中P12是从P1到P2的段的长度,由...计算
如果你认为它是两个向量,一个从点P1到P2,一个从P1到P3,它变得非常简单
所以:
a =(p1.x - p2.x,p1.y - p2.y)
b =(p1.x - p3.x,p1.y - p3.y)
然后,您可以反转点积公式:
获得角度:
请记住
只是意味着:a1 * b1 a2 * b2(这里只有2个尺寸......)
处理角度计算的最佳方法是使用
atan2(y, x)
给定一个点x, y
返回该点的角度和X+
轴相对于原点 .鉴于计算是
即你基本上将两个点翻译为
-P1
(换句话说,你翻译所有内容,以便P1
在原点结束),然后你考虑P3
和P2
的绝对角度的差异 .atan2
的优点是表示整圆(您可以在-π和π之间得到任何数字),而使用acos
,您需要根据符号处理几种情况以计算正确的结果 .atan2
的唯一奇点是(0, 0)
...意味着P2
和P3
必须与P1
不同,因为在这种情况下谈论一个角度是没有意义的 .让我举一个JavaScript的例子,我已经与之斗争了很多:
额外奖励:Example with HTML5-canvas
基本上你有两个向量,一个从P1到P2,另一个从P1到P3 . 所以你需要的是一个计算两个向量之间角度的公式 .
看看here有一个很好的解释和公式 .
如果你认为P1是圆圈的中心,你会觉得太复杂了 . 你有一个简单的三角形,所以law of cosines可以解决你的问题 . 不需要任何极坐标变换或某些 . 假设距离为P1-P2 = A,P2-P3 = B且P3-P1 = C:
您需要做的就是计算距离A,B和C的长度 . 您可以从点的x坐标和y坐标轻松获得这些距离.Pythagoras' theorem
我最近遇到了类似的问题,只是我需要区分正角度和负角度 . 如果这对任何人都有用,我建议我从this mailing list获取有关检测Android触摸事件的旋转的代码片段:
带解释的非常简单的几何解法
几天前,一个人遇到了同样的问题,不得不坐在数学书上 . 我通过组合和简化一些基本公式解决了这个问题 .
让我们考虑这个数字 -
我们想知道Θ,所以我们需要先找出α和β . 现在,对于任何直线 -
设A =(ax,ay),B =(bx,by),O =(ox,oy) . 所以对于OA-线
以同样的方式,对于线OB-
现在,我们需要
ϴ = β - α
. 在三角学中,我们有一个公式 -在eqn-4中替换
tan α
(来自eqn-2)和tan b
(来自eqn-3)的值,并应用简化后,我们得到 -所以,
这就对了!
现在,采取以下数字 -
这个C#或Java方法计算角度(Θ) -
在Objective-C中你可以做到这一点
或者阅读更多here
你提到过有角度的角度(-90) . 在许多应用中,角度可能有迹象(正面和负面,见http://en.wikipedia.org/wiki/Angle) . 如果这些点是(例如)P2(1,0),P1(0,0),P3(0,1)那么角度P3-P1-P2通常是正的(PI / 2),而角度P2-P1- P3是否定的 . 使用边长不会区分和 - 所以如果这很重要,你将需要使用向量或函数,如Math.atan2(a,b) .
角度也可以超过2 * PI,虽然这与当前的问题无关,但是我编写自己的Angle类非常重要(同时也要确保度和弧度不会混淆) . 关于angle1是否小于角度2的问题关键取决于如何定义角度 . 确定一行(-1,0)(0,0)(1,0)是否表示为Math.PI或-Math.PI也很重要 .
最近,我也有同样的问题...在Delphi中它与Objective-C非常相似 .
这是一个C#方法,可以从一个圆上的点水平方向逆时针返回角度(0-360) .
干杯,保罗
使用高中数学有一个简单的答案 .
假设你有3分
获得从A点到B点的角度
angle = atan2(A.x - B.x, B.y - A.y)
获得从B点到C点的角度
angle2 = atan2(B.x - C.x, C.y - B.y)
我刚刚在我最近的项目中使用了这个代码,将B更改为P1 ..如果你想要你也可以删除“180”
好吧,其他答案似乎涵盖了所需的一切,所以如果您使用的是JMonkeyEngine,我想添加它:
Vector3f.angleBetween(otherVector)
因为那就是我来这里寻找:)
}