計算しようとしていることを示すために、この素晴らしい図を描きました。わからない場合は、城の壁と塔です。城を「閉じる」ためには、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 度を超える角度を考慮していないことはわかっていますが、それはおそらく問題ですが、ここから先に進む方法が本当にわかりません。助けてくれてありがとう!