0

ここに画像の説明を入力してください

ベクトル(-0.7、-0.3)に沿って移動するスプライトがあります。私が持っている座標を持つ別の点があります-それらを(xB | yB)と呼びましょう。さて、かなり前に、ベクトルから点までの垂直距離を計算することを学びました(このページの最初の式http://en.wikipedia.org/wiki/Perpendicular_distance)。しかし、私はそれを試しました、そして私がそれを記録するならば、それは100%偽である信じられないほど高い値を返します。だから私は何を間違えますか?私が提供した画像を見てください。

comingVector =(-0.7、-0.3) //これはスプライトが移動しているベクトルです

bh.positionは、距離を計算したいポイントです。

コードは次のとおりです。

        // first I am working out the c Value in the formula in the link given above
        CGPoint pointFromVector = CGPointMake(bh.incomingVector.x*theSprite.position.x,bh.incomingVector.y*theSprite.position.y);
        float result = pointFromVector.x + pointFromVector.y;
        float result2 = (-1)*result;

        //now I use the formula
        float test = (bh.incomingVector.x * bh.position.x + bh.incomingVector.y * bh.position.y + result2)/sqrt(pow(bh.incomingVector.x, 2)+pow(bh.incomingVector.y, 2));

        //the distance has to be positive, so I do the following
        if(test < 0){
            test *= (-1);
        }
4

1 に答える 1

2

元のリンクの内容に従って、式を再度実装しましょう。

  • 直線のベクトルがあります:V(a; b)
  • 線上(スプライトの中心)に点があります:P x1、y1)
  • 別の場所に別のポイントがあります:B(xB、yB)

ここでのテストでは、2行のランダムな値があります。

  1. a = -0.7; b = -0.3; x1 = 7; y1 = 7; xB = 5; yB = 5;
  2. a = -0.7; b = -0.3; x1 = 7; y1 = 7; xB = 5.5; yB = 4;

分子は次のようになります:(分子を未知の方法で計算しているようです。これがリンクされた数式の分子を計算する適切な方法であるため、なぜそれを行ったのかわかりません。おそらくこれが完全に得られた理由です。間違った距離。)

float _numerator = abs((b * xB) - (a * yB) - (b * x1) + (a * y1));
// for the 1. test values: (-0.3 * 5) - (-0.7 * 5) - (-0.3 * 7) + (-0.7 * 7) = -1.5 + 3.5 + 2.1 - 4.9 = -0.8 => abs(-0.8) = 0.8
// for the 2. test values: (-0.3 * 5.5) - (-0.7 * 4) - (-0.3 * 7) + (-0.7 * 7) = -1.65 + 2.8 + 2.1 - 4.9 = -1.65 => abs(-1.65) = 1.65

その場合、分母は次のようになります。

float _denomimator = sqrt((a * a) + (b * b));
// for the 1. test values: (-0.7 * -0.7) + (-0.3 * -0.3) = 0.49 + 0.09 = 0.58 => sort(0.58) = 0.76
// for the 2. test values: (-0.7 * -0.7) + (-0.3 * -0.3) = 0.49 + 0.09 = 0.58 => sort(0.58) = 0.76

距離は今明らかです:

float _distance = _numerator / _denominator;
// for the 1. test values: 0.8 / 0.76 = 1.05
// for the 2. test values: 1.65 / 0.76 = 2.17

これらの結果(1.05および2.17)は、ランダムな値に対して正確に正しい距離です。紙に線と点を描くことができれば、距離を測定でき、標準の定規を使用して同じ値を取得できます。

于 2012-07-16T18:53:51.473 に答える