0

http://i.imgur.com/3OAAH.jpg

計算しようとしていることを示すために、この素​​晴らしい図を描きました。わからない場合は、城の壁と塔です。城を「閉じる」ためには、2 本の赤い線が交差する点を見つけて、両方の壁をつなぐ塔を作る必要があります。

この問題のために、壁のサイズは固定されているため、3 つの辺の長さがすべてわかっています。これは、コサインの法則を使用して、静的な壁から回転する壁の 1 つの角度を見つけることができることを意味します。しかし、私はそれを実装しようとしましたが、正しく動作させることができません。

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

function FindIntersection(vector Tower1, vector Tower2, float Wall1, float Wall2, out vector Point)
{
    local float S1; // Length of side between the two towers.
    local float S2; // Length of the first wall.
    local float S3; // Length of the second wall.
    local float CosA, A; // Stores the angle between S1 and S2.
    local vector Vec, Vec2;

    Tower1.Z = 0; // Make sure the towers are level.
    Tower2.Z = 0;
    S1 = VSize(Tower2 - Tower1); // Get the first side length.
    S2 = Wall1; // Get the second side length.
    S3 = Wall2; // Get the third side length.

    `log("---------- S1: " $ S1 $ " S2: " $ S2 $ " S3: " $ S3 $ " -----------");

    // Perform cosine law to get angle between S1 and S2.
    CosA = (Sq(S2) + Sq(S1) - Sq(S3)) / (2 * S2 * S1);
    A = ACos(CosA);

    `log("--------------------- " $ A*57.2957795131 $ " ---------------------");

    // Get a vector angle between up and S1.
    Vec = Normal(Tower2-Tower1);

    // Get a vector angle between S1 and S2.
    Vec2.X = Cos(A);
    Vec2.Y = Sin(A);
    Vec2.Z = 0;
    Vec2 = Normal(Vec2);

    // Determine the location of the new tower.
    Point = Tower1 + Normal(Vec+Vec2) * S2;
}

入力が正しいことはほぼ確実です。90 度を超える角度を考慮していないことはわかっていますが、それはおそらく問題ですが、ここから先に進む方法が本当にわかりません。助けてくれてありがとう!

4

2 に答える 2

0

これを試してみてください:

function FindIntersection(vector Tower1, vector Tower2, float Wall1, float Wall2, out vector Point)
{
    local float S1; // Length of side between the two towers.
    local float S2; // Length of the first wall.
    local float S3; // Length of the second wall.
    local float CosA, A; // Stores the angle between S1 and S2.
    local vector Vec1;

    Tower1.Z = 0; // Make sure the towers are level.
    Tower2.Z = 0;
    S1 = VSize(Tower2 - Tower1); // Get the first side length.
    S2 = Wall1; // Get the second side length.
    S3 = Wall2; // Get the third side length.

    `log("---------- S1: " $ S1 $ " S2: " $ S2 $ " S3: " $ S3 $ " -----------");

    // Perform cosine law to get angle between S1 and S2.
    CosA = (Sq(S2) + Sq(S1) - Sq(S3)) / (2 * S2 * S1);
    A = ACos(CosA);

    `log("---------------------  Angle in degrees" $ (A* 180.f) / M_PI $ " ---------------------");

    // Get a vector angle between up and S1.
    Vec1 = Normal(Tower2-Tower1);

    // rotate the normalized vector around axis (0,1,0) (assuming Unreals co-ordinate system is x,y,z and Y is UP
    local quat quatRot =  QuatFromAxisAndAngle( Vect(0,0,1), -A ); //angle accepted in radians NOTE: Could just be A instead of -A, depends on which way the point will rotate

    local vector corectedS2Vector = Normal ( QuatRotateVector ( quatRot , Vec1 ));

     // Determine the location of the new tower.
    Point = Tower1 + corectedS2Vector * S2;
}
于 2012-06-14T15:34:28.880 に答える
0

あなたが望むのは、A三角形の辺S1S2およびの角度ですS3余弦の法則を使用して取得できます

A = ACOS( (S1*S1+S2*S2-S3*S3)/(2*S1*S2) )

頂点の座標は、ベース ウォール (S1) の方向がわかっている場合に見つかります。

TH = ATAN( (Tower2.Y-Tower1.Y)/(Tower2.X-Tower1.X) )
Tower3.X = S2*COS(A+TH)
Tower3.Y = S2*SIN(A+TH)
于 2012-06-14T14:54:19.183 に答える