2013-05-09 388 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,所以到這一點應該很容易,然後您只需要將計算的值加倍以獲得兩點之間的整個角度。

相關問題