本質的には、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;
};
あなたは私たちに2つのデフを教えてもらえますか?特に、2番目のLineDefが最初のLineDefの倍数であるかどうかを調べます。そうであれば、それらは同じ行であり、係数が異なるだけです。 –
勾配を直接計算すると、より良い結果が得られますか? 'CGFloat m =(endPoint2.x - endPoint1.x)/(endPoint1.y - endPoint2.y);'? –
@NoOneinParticular本当に必要なら、私はできるが、彼らは同じ行ではない。私はwolfram-alphaの両方でグラフを作って(いくつかのケースで)確認しました。さらに、これに依存しているコアグラフィックシェイプを作成しているので、何か問題があるかどうかをすぐに知ることができます。 –