A *アルゴリズムを使用して、限られたハードウェア(CPU:Vortex86,256MB)上のポイントAからポイントBまでの良好なパスを見つけたいと考えています。私は固定された障害を持つ300x200のセルのグリッドを持っています。障害物を避けるためのヒットボックスはディスクです。サークルに関数を適用するためのトリックがありますか?
私はヒットボックスがA *で非常に頻繁に行われるように障害物と衝突しているかどうかをチェックする最適な方法を探しています。
最も明白な方法は次のようにディスクの全領域をチェックすることでした:
radius
は、ディスクおよびディスクの中央の
center
座標の半径である
bool check(std::function<bool(const Coordinates &)> collide)
{
const std::uint32_t RADIUS2 = radius * radius;
Coordinates cell(-radius, -radius);
for (; cell.x <= radius; cell.x++)
{
for (cell.y = -radius; cell.y <= radius; cell.y++)
{
if (cell.x * cell.x + cell.y * cell.y <= RADIUS2 && !collide(center + cell))
{
return false;
}
}
}
return true;
}
。
もっと良い解決策は、ディスクの外周をチェックすることだけかもしれません。しかし、両方のソリューションは2 for
のループを使用する必要があり、時間の大部分を占めるディスク領域には適合しません。
あなたはそれを賢明なやり方で解決する方法はありますか?
マップを生成するときに障害物を膨らませることはできませんか?その後、衝突テストは単一ピクセルに減少します。 –
どうやってそれをするのか分かりません。コーナーにあるディスクの四分の一のような障害物を想像してみましょう。どのようにあなたはそれを膨らませるのですか? – didil
@didile障害物を膨らませるのは簡単です。障害物までの距離がR未満のすべてのセルを「インフレーション」とマークするだけです。一度だけ行うだけです。その後すぐに、このセルに入ることが許可されているかどうかをチェックします。 – Ilya