1

基本的に、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;
};
4

2 に答える 2

0

スロープインターセプトフォームはこのために壊れやすいです。ベクトルを使用します。

〈v〉 = B-A

中点=〈V〉 / 2 + A

⟂〈V〉 = 〈V y、-V x〉 </ p>

于 2012-04-19T16:23:45.983 に答える
0

くそー、それは単純なものでした。実際の製品コードを再フォーマットして、Stack Exchangeに配置し、その過程で間違いを編集しました。質問に投稿したコードは実際には完全に機能します。元々、行:m = -1 / m;は次のように元の割り当てに折りたたまれました:CGFloat m = -1 / (endPoint1.y - endPoint2.y) / (endPoint1.x - endPoint2.x);。もちろん、今問題は明らかです...私は括弧を忘れました。問題を見つけることを期待して、コメントで私の「理由」を説明できるように、スタック交換で行を2つに分割しました。

ご面倒をおかけしてすみません。

于 2012-04-19T16:52:10.513 に答える