2012-04-19 13 views
1

本質的には、2点間の二等分線を計算しようとしています。私は2つの方法を持っています。なぜ私は他の人がうまくいかないのか分かりません。動作するものは少し計算量が多く、このルーチンは多く実行されているので、より単純なものを使用したいと思います。私はおそらく単純なものを見逃しているかもしれませんが、私は高校代数よりも三角をよく理解しているように見えるので、これは面白いです。別の行の中点に垂直な線を計算する

注:関数はエンドポイント(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は、直線のa、b &c成分の3つのCGFloat変数を持つ単純な構造体です。 2点から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

あなたは私たちに2つのデフを教えてもらえますか?特に、2番目のLineDefが最初のLineDefの倍数であるかどうかを調べます。そうであれば、それらは同じ行であり、係数が異なるだけです。 –

+1

勾配を直接計算すると、より良い結果が得られますか? 'CGFloat m =(endPoint2.x - endPoint1.x)/(endPoint1.y - endPoint2.y);'? –

+0

@NoOneinParticular本当に必要なら、私はできるが、彼らは同じ行ではない。私はwolfram-alphaの両方でグラフを作って(いくつかのケースで)確認しました。さらに、これに依存しているコアグラフィックシェイプを作成しているので、何か問題があるかどうかをすぐに知ることができます。 –

答えて

0

Dammit、それは何か簡単だった。私は実際の生産コードを再フォーマットしてStack Exchangeに入れ、私の間違いを編集しました。質問に投稿したコードは、実際には完全に機能します。もともとの行:m = -1/m;は、そのように元の割り当てに折りたたまれました:CGFloat m = -1/(endPoint1.y - endPoint2.y)/(endPoint1.x - endPoint2.x);。もちろん、今問題は明らかです...私は括弧を忘れました。私はスタック交換で2行に分けたので、コメントに「推論」を説明し、問題を見つけることを望みました。

申し訳ありませんが、すべてのトラブル。

0

スロープインターセプトフォームは脆弱です。使用ベクター。

= B -

中点= /2 +

= Y、-V X>