2013-05-09 386 views
1

我有一个环(宽度25px)作为UIView。当用户选择环上的任何位置时,我想要计算圆上固定点上选择的点之间的角度,考虑圆心。 我发现了一些例子,但他们没有考虑到中心。确定圆上两点之间相对于中心的角度

什么是最佳的方式来做到这一点?

回答

0

这可能会帮助你,我在我的一个项目中使用过同样的东西。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    beginPoint = [[[event allTouches] anyObject] locationInView:self]; 
    currentAngle = 0.0f; 
    centerPoint = self.center; 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    endPoint = [[[event allTouches] anyObject] locationInView:self]; 

    float fromAngle = atan2(beginPoint.y - self.center.y, beginPoint.x - self.center.x); 
    float toAngle = atan2(endPoint.y - self.center.y, endPoint.x - self.center.x); 
    float newAngle = [self wrapd:currentAngle + (toAngle - fromAngle) min:0 max:2 * 3.14]; 

    currentAngle = newAngle; 

    CGAffineTransform cgaRotate = CGAffineTransformMakeRotation(newAngle); 
    [self setTransform:cgaRotate]; 
} 


-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    endPoint = [[[event allTouches] anyObject] locationInView:self]; 

    float fromAngle = atan2(beginPoint.y - self.center.y, beginPoint.x - self.center.x); 
    float toAngle = atan2(endPoint.y - self.center.y, endPoint.x - self.center.x); 
    float newAngle = [self wrapd:currentAngle + (toAngle - fromAngle) min:0 max:2 * 3.14]; 

    currentAngle = newAngle; 
} 

- (double) wrapd:(double)_val min:(double)_min max:(double)_max { 
    if(_val < _min) return _max - (_min - _val); 
    if(_val > _max) return _val - _max; /*_min - (_max - _val)*/; 
    return _val; 
} 
+0

感谢Pavan的回复。 – pankaj 2013-05-09 11:24:49

+0

[self wrapd:currentAngle +(toAngle - fromAngle)min:0 max:2 * 3.14];你也可以添加包装方法。此方法缺失 – pankaj 2013-05-09 11:30:19

+0

编辑答案有该方法 – 2013-05-09 11:39:18

0

我们知道 ((center.x +半径* COS(THETA)),(center.y +半径* SIN(THETA)))〜(X,Y)

其中( X,Y)属于任何圆周点

这样就可以计算出角度即THETA任何圆周点为:

X = center.x +半径* COS(THETA)

COS( theta)=(X - center.x )/半径..........等式-1

同样

Y = center.y +半径* SIN(THETA)

SIN(THETA)=(Y - 中心.Y)/半径..........等式-2

通过利用等式1等式除以-2,我们有

黄褐色(THETA)=(Y - center.y)/ (X - center.x)-----------------最终方程式

1

您必须亲自处理代码(我是一名Java开发人员),但获取圆上两点之间角度的最简单方法(针对其中心进行测量)是回想起情况的几何形状。由圆周上的任意两点形成的三角形和圆的中心必然是isosceles

一个等腰三角形记得,至少有两个相同长度的边 - 径向片段与你的两个点。平分角度产生一个径向分段,该分段垂直于并且平分连接两个点的直线。这形成了一对直角三角形,其半径为斜边,两点之间的距离为“相反”的一半。

将2的因子移到分母上并确认半径是两倍,只需计算两点之间的距离(圆周上),再除以直径即可。你得到的价值是半角的正弦(你想要整个角度)。就拿反正弦,你就会有一半的角度:

θ/ 2 =罪-1(d/d)

随着d因为这两个点之间的距离,和D作为圆的直径。由于直径是给定的,并且两点之间的距离是simple to calculate,所以到这一点应该很容易,然后您只需要将计算的值加倍以获得两点之间的整个角度。

相关问题