我的响铃(宽度为25像素)为UIView
。当用户选择环上的任何位置时,我想计算考虑圆心的圆上固定点上所选点之间的角度。
我找到了一些例子,但他们没有考虑到中心。
这样做的最佳方式是什么?
答案 0 :(得分:1)
您必须自己处理代码(我是Java开发人员),但获取圆上两点之间的角度(以其中心为单位)的最简单方法是调用情境的几何形状。由圆周上的任意两点和圆的中心形成的三角形必然为isosceles。
一个等腰三角形,回想起来,(至少)有两条相同长度的边 - 你的两点的径向段。将角度平分导致径向段,该径向段垂直于连接两点的线并将其平分。这形成一对直角三角形,半径为斜边,两点之间的距离为“相对”侧的一半。
将因子2移动到分母并识别半径的两倍,只需计算两点之间的距离(在圆周上),并将其除以直径。你得到的值是半角的正弦(你想要整个角度)。拿弧形,你将有一半的角度:
θ/ 2 = sin -1 (d / D)
d
作为两点之间的距离,D
作为圆的直径。既然给出了直径,并且两点之间的距离是simple to calculate,那么到达这一点应该很容易,然后你只需要将计算出的值加倍,得到两点之间的整个角度。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
我们知道 ((center.x + radius * cos(theta)),(center.y + radius * sin(theta)))〜(X,Y)
其中(X,Y)属于任何圆周点
因此您可以计算角度,即任何圆周点的theta为:
X = center.x + radius * cos(theta)
cos(theta)=(X - center.x)/ radius .......... eqn-1
同样Y = center.y + radius * sin(theta)
sin(theta)=(Y - center.y)/ radius .......... eqn-2
通过将eqn-2除以eqn-1,我们有
tan(theta)=(Y - center.y)/(X - center.x)-----------------最终方程式