2012-04-19 39 views
1

本質上,我試圖計算兩點之間的平分線。我有兩種方法,一種是另一種不行。我無法弄清楚爲什麼另一個不工作。一個工作是計算密集一點,因爲這個例程運行了很多,我想用更簡單的一個...除非它不工作。我可能錯過了一些簡單的東西,但是我覺得這很有趣,因爲我似乎比我高中代數的掌握更好。計算垂直於另一條線的中點的線

注意:函數傳遞結束點(endPoint1,endPoint2)。 下面是工作(使用三角函數計算平分線)之一:

CGPoint midPoint = CGPointMake((endPoint1.x + endPoint2.x)/2, (endPoint1.y + endPoint2.y)/2); 

//Normalize an end point 
CGPoint nPoint = CGPointMake(endPoint1.x - endPoint2.x, endPoint1.y - endPoint2.y); 

//Find theta and rotate 90° 
CGFloat theta = atanf(nPoint.y/nPoint.x); 
if (nPoint.x < 0.0f) theta += M_PI; 
else if (nPoint.x > 0.0f && nPoint.y < 0.0f) theta += (M_PI * 2); 
theta += M_PI_2; 

//Calculate another point along new theta and de-normalize the point 
CGPoint centerPoint = CGPointMake(cosf(theta) * 10, sinf(theta) * 10); 
centerPoint.x += midPoint.x; 
centerPoint.y += midPoint.y; 

//Create the line definition 
LineDef def = LineDefForPoints(midPoint, centerPoint); 

這裏是一個沒有,但我想它想:

CGPoint midPoint = CGPointMake((endPoint1.x + endPoint2.x)/2, (endPoint1.y + endPoint2.y)/2); 
//Calculate the slope and invert 
CGFloat m = (endPoint1.y - endPoint2.y)/(endPoint1.x - endPoint2.x); 
//Take the negative reciprocal 
m = -1/m;  

//Calculate another point on the line   
CGPoint centerPoint = CGPointMake(midPoint.x + 10, midPoint.y + (m * 10)); 
//Create the line definition 
LineDef def = LineDefForPoints(midPoint, centerPoint); 

所以我發誓這應該工作。 Y的變化等於x的變化的m倍。我計算了中點,計算了垂直線的斜率並計算了該線上的另一點。然而,當給定相同的終點時,創建的行定義不等同,所以我錯過了一些東西。

順便說一下,LindeDef是一個簡單的結構,它具有三個CGFloat變量,用於直線的a,b & c分量。從兩點創建一個LineDef是微不足道的(我碰巧使用一個塊來做到這一點):

LineDef (^LineDefForPoints)(CGPoint, CGPoint) = ^LineDef(CGPoint p1, CGPoint p2){ 
    LineDef line = {0,0,0}; 
    line.a = p2.y - p1.y; 
    line.b = p1.x - p2.x; 
    line.c = line.a*p1.x + line.b*p1.y; 
    return line; 
}; 
+0

你能給我們兩個defs嗎?特別是,看看第二個LineDef是否是第一個LineDef的倍數。如果是這樣,那麼他們是同一條線,只是係數不同而已。 – 2012-04-19 16:21:34

+1

如果直接計算斜率,你會得到更好的結果:'CGFloat m =(endPoint2.x - endPoint1.x)/(endPoint1.y - endPoint2.y);'? – 2012-04-19 16:35:41

+0

@NoOneinParticular如果你確實需要它,我可以,但它們不是同一條線。我用wolfram-alpha對它們進行了繪圖以確保(在幾種情況下)。此外,由於我正在創建依賴於此的Core圖形形狀,因此我可以快速判斷是否有錯誤。 – 2012-04-19 16:36:50

回答

0

該死的,這很簡單。我重新格式化了我的實際生產代碼,所以我可以把它放在Stack Exchange上,並在這個過程中編輯出我的錯誤。我在問題中發佈的代碼實際上完美無缺。最初的行:m = -1/m;被摺疊成原來的作業,如下所示:CGFloat m = -1/(endPoint1.y - endPoint2.y)/(endPoint1.x - endPoint2.x);。當然,現在問題很明顯......我忘了括號。我把這條線分成兩堆,所以我可以在評論中解釋我的「推理」,希望能找到問題所在。

對不起,所有的麻煩。

0

斜截距形式對此很脆弱;使用矢量。

= B - 甲

中點= /2 + A

= ÿ,-V X>

相關問題