Ios 使用反余弦的线间绝对角度

Ios 使用反余弦的线间绝对角度,ios,inverse,trigonometry,Ios,Inverse,Trigonometry,我想用反余弦函数计算由三个点(其中一个点是两条线的交点)形成的两条线之间的角度,如下所示: CGFloat a = initialPosition.x - origin.x; CGFloat b = initialPosition.y - origin.y; CGFloat c = currentPosition.x - origin.x; CGFloat d = currentPosition.y - origin.y; CGFloat angle = (180/M_PI) * acosf((

我想用反余弦函数计算由三个点(其中一个点是两条线的交点)形成的两条线之间的角度,如下所示:

CGFloat a = initialPosition.x - origin.x;
CGFloat b = initialPosition.y - origin.y;
CGFloat c = currentPosition.x - origin.x;
CGFloat d = currentPosition.y - origin.y;
CGFloat angle = (180/M_PI) * acosf(((a*c) + (b*d)) / ((sqrt(a*a + b*b)) * (sqrt(c*c + d*d))));

不幸的是,acosf只返回0到pi之间的值。如何找到介于0和2*pi之间的值(比如说,以逆时针的方式)?

我不知道您使用的是什么语言,但通常有一个atan2函数,可以为您提供360度的值。在这种情况下,您需要使用它两次,然后添加一点额外的逻辑

一些伪代码有助于澄清问题:

initialAngle = atan2(initialPosition.y - origin.y, initialPosition.x - origin.x)
currentAngle = atan2(currentPosition.y - origin.y, currentPosition.x - origin.x)
# angle is measured from x axis anti-clock, so lets find the value starting from
# initial and rotating anti-clock to current, as a positive number
# so we want current to be larger than initial
if (currentAngle < initialAngle) {currentAngle += 2 pi}
# and then we can subtract
return currentAngle - initialAngle
initialAngle=atan2(initialPosition.y-origin.y,initialPosition.x-origin.x)
currentAngle=atan2(currentPosition.y-origin.y,currentPosition.x-origin.x)
#角度是从x轴反时钟开始测量的,所以让我们从
#初始和旋转反时钟电流,作为正数
#所以我们希望电流比初始值大
如果(currentAngle

我知道这不是使用acos,但它是多值的,所以要这样做,最终会使用大量关于差异迹象的逻辑,这是容易出现错误的。atan2就是你想要的。

找到了一个简单的解决方案……这来自高中数学!首先,从原点和表格的初始位置开始建立一条直线的方程式
y=mx+c
。位于该线两侧的点将满足
y
y>mx+c
,具体取决于其所在位置。如果发现角度为顺时针或逆时针方向,请进行以下检查:

currentPosition.y < (currentPosition.x *(initialPosition.y - origin.y) + (initialPosition .x * origin.y - initialPosition.y * origin.x))  / (initialPosition.x - origin.x)
currentPosition.y<(currentPosition.x*(initialPosition.y-origin.y)+(initialPosition.x*origin.y-initialPosition.y*origin.x))/(initialPosition.x-origin.x)

如果上述条件为真,则从原点和当前位置形成的线与从原点和初始位置形成的线形成小于180度的角度(顺时针方向)。否则,顺时针方向的角度大于180度,逆时针方向的角度小于180度……以此类推。根据要求,最终角度可以是
(acos返回的角度)
(360-(acos返回的角度))

ya…我找到了atan2,它做了我想做的事情。谢谢但是为了挑战起见……acos()怎么可能做到这一点呢?我没有现成的解决方案——我需要坐下来用铅笔+纸,计算出不同的案例,并为它们编写测试。我想你最终会比较x和y的delta,这实际上是在使用切线。。。但atan2仍然是首选方式!