我有一個環(寬度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