基本的に、2点間の二等分線を計算しようとしています。私には2つの方法があり、1つは機能し、もう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は、直線の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;
};