結果は大まかですが、非常に高速な、手っ取り早い 3D 距離チェックを実行する方法はありますか? 深度ソートを実行する必要があります。sort
次のような STL を使用します。
bool sortfunc(CBox* a, CBox* b)
{
return a->Get3dDistance(Player.center,a->center) <
b->Get3dDistance(Player.center,b->center);
}
float CBox::Get3dDistance( Vec3 c1, Vec3 c2 )
{
//(Dx*Dx+Dy*Dy+Dz*Dz)^.5
float dx = c2.x - c1.x;
float dy = c2.y - c1.y;
float dz = c2.z - c1.z;
return sqrt((float)(dx * dx + dy * dy + dz * dz));
}
平方根を使わず、あるいは掛け算をせずにそれを実行する方法はあるでしょうか?
ベストアンサー1
x
すべての正の(または実際には非負の)数およびに対して のy
場合、sqrt(x) < sqrt(y)
となるため、平方根を省略できますx < y
。実数の平方を合計しているので、すべての実数の平方は非負であり、すべての正の数の合計は正であるため、平方根条件が成り立ちます。
ただし、アルゴリズムを変更せずに乗算を省略することはできません。反例を示します。x
が (3, 1, 1) で がy
(4, 0, 0) の場合、であり、 である|x| < |y|
ため、 ですが、 です。sqrt(1*1+1*1+3*3) < sqrt(4*4+0*0+0*0)
1*1+1*1+3*3 < 4*4+0*0+0*0
1+1+3 > 4+0+0
最近の CPU は、オペランドをメモリから実際にロードするよりも速くドット積を計算できるため、乗算を省略しても何も得られそうにありません (最新の CPU には、3 サイクルごとにドット積を計算できる特別な命令があると思います)。
最初にプロファイリングを行わずにアルゴリズムを変更することは考えないでください。アルゴリズムの選択は、データセットのサイズ (キャッシュに収まるか)、実行頻度、結果の処理方法 (衝突検出、近接、オクルージョン) によって大きく異なります。