我有一个环(宽度25px)作为UIView
。当用户选择环上的任何位置时,我想要计算圆上固定点上选择的点之间的角度,考虑圆心。 我发现了一些例子,但他们没有考虑到中心。确定圆上两点之间相对于中心的角度
什么是最佳的方式来做到这一点?
我有一个环(宽度25px)作为UIView
。当用户选择环上的任何位置时,我想要计算圆上固定点上选择的点之间的角度,考虑圆心。 我发现了一些例子,但他们没有考虑到中心。确定圆上两点之间相对于中心的角度
什么是最佳的方式来做到这一点?
这可能会帮助你,我在我的一个项目中使用过同样的东西。
-(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;
}
我们知道 ((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)-----------------最终方程式
您必须亲自处理代码(我是一名Java开发人员),但获取圆上两点之间角度的最简单方法(针对其中心进行测量)是回想起情况的几何形状。由圆周上的任意两点形成的三角形和圆的中心必然是isosceles。
一个等腰三角形记得,至少有两个相同长度的边 - 径向片段与你的两个点。平分角度产生一个径向分段,该分段垂直于并且平分连接两个点的直线。这形成了一对直角三角形,其半径为斜边,两点之间的距离为“相反”的一半。
将2的因子移到分母上并确认半径是两倍,只需计算两点之间的距离(圆周上),再除以直径即可。你得到的价值是半角的正弦(你想要整个角度)。就拿反正弦,你就会有一半的角度:
θ/ 2 =罪-1(d/d)
随着d
因为这两个点之间的距离,和D
作为圆的直径。由于直径是给定的,并且两点之间的距离是simple to calculate,所以到这一点应该很容易,然后您只需要将计算的值加倍以获得两点之间的整个角度。
感谢Pavan的回复。 – pankaj 2013-05-09 11:24:49
[self wrapd:currentAngle +(toAngle - fromAngle)min:0 max:2 * 3.14];你也可以添加包装方法。此方法缺失 – pankaj 2013-05-09 11:30:19
编辑答案有该方法 – 2013-05-09 11:39:18