2012-08-07 180 views
0

我想在固定大小的圓的中心畫線。請檢查圖像,它會解釋一切。我在圈子的邊界有P1的中心和P2。 P1將始終保持固定,P2將隨着鼠標移動而不斷變化,並且它將成爲圓圈邊界上的任意點。現在,我想繪製綠色固定長度的線。我想找到具有固定距離的(x1,y1)和(x2,y2),每當P2發生變化時,我想繪製面向P2的綠線。在圓的中心繪製線,角度在objective-c

enter image description here

希望,形象說明了一切,總之我需要以下。

  1. P1和P2之間的角度。
  2. 用圓心中心的角度繪製固定距離的綠線。

感謝

回答

0

既然你(顯然)要綠線是垂直的紅線,你不需要計算P1和P2之間的角度。將矢量旋轉90˚非常簡單。

我假設你有p1和p2爲CGPoint(或NSPoint)變量。

首先,讓我們計算從P1到P2的向量:

CGPoint p1p2 = CGPointMake(p2.x - p1.x, p2.y - p1.y); 

接下來,我們將計算一個向量垂直於P1-> P2載體:

CGPoint p1p2Perp = CGPointMake(p1p2.y, -p1p2.x); 

現在,讓我們找到垂直矢量的長度:

CGFloat radius = hypot(p1p2Perp.x, p1p2Perp.y); 

請注意,如果圓的半徑恆定,您可以只是使用它而不是計算它。如果您使用iOS,請使用hypotf而不是hypot

所以現在我們可以「正常化」的垂直矢量,使得它具有長度1,通過其長度除以它的座標:

p1p2Perp.x /= radius; 
p1p2Perp.y /= radius; 

接下來,我們可以通過所期望的長度的一半乘以綠線。我假設你在一個名爲greenLineLength的常量或變量中具有所需的綠線長度。

p1p2Perp.x *= greenLineLength/2; 
p1p2Perp.y *= greenLineLength/2; 

現在我們可以爲綠線創建一條路徑。我假設你CGContextRef是在一個名爲gc變量:

CGContextBeginPath(gc); 
CGContextMoveToPoint(gc, p1.x - p1p2Perp.x, p1.y - p1p2Perp.y); 
CGContextAddLineToPoint(gc, p1.x + p1p2Perp.x, p1.y + p1p2Perp.y); 

您可以描邊路徑,只要你喜歡。例如:

CGContextSetRGBStrokeColor(gc, 0, 1, 0, 1); 
CGContextSetLineWidth(gc, 2); 
CGContextSetLineCap(gc, kCGLineCapRound); 
CGContextStrokePath(gc); 
0

根據您的問題,兩者之間的角度總是垂直 - 90˚或π/ 2弧度。您可以使用atan2()獲得紅色線段的角度;然後減去M_PI_2爲綠色的角度。

從那裏,你試圖找到一個圓的圓周上的兩個點,其直徑是段的長度。你可以考慮一下這款極座標(R,THETA)並轉換爲笛卡爾(X,Y):

x = (segment_length/2) * cos(theta) 
y = (segment_length/2) * sin(theta) 

添加M_PItheta拿到另一個端點。