私はいくつかのベクトルロジックに取り組んでいるので、この不等式を単純化することでプロセッサ時間を節約できますか?
distance(vector1, vector2) < distance(vector1, vector3)
vector1
どちらの場合も同じことが繰り返されます。
私はいくつかのベクトルロジックに取り組んでいるので、この不等式を単純化することでプロセッサ時間を節約できますか?
distance(vector1, vector2) < distance(vector1, vector3)
vector1
どちらの場合も同じことが繰り返されます。
回答:
はい、これを簡素化できます。まず、それらのベクターの呼び出しを停止します。それらはポイントです。それらを呼ぶことにしましょうA
、B
とC
。
だから、あなたはこれが欲しい:
dist(A, B) < dist(A, C)
距離に置き換え距離は、の定義から(その後、ドットの製品で、乗ユークリッド長さ交換してください。AC
でAB + BC
、今、これらは実数ベクトルです)(、要因を、展開が簡素化されます。:
dist(A, B)² < dist(A, C)²
dot(AB, AB) < dot(AC, AC)
dot(AB, AB) < dot(AB + BC, AB + BC)
dot(AB, AB) < dot(AB, AB) + dot(BC, BC) + 2 dot(AB, BC)
0 < dot(BC, BC) + 2 dot(AB, BC)
0 < dot(BC + 2 AB, BC)
そこにあります:
dot(AB + AC, BC) > 0
ベクトル表記で:
dot(v2 - v1 + v3 - v1, v3 - v2) > 0
これは、以前の2つのドット積の代わりにいくつかの追加と1つのドット積です。
はい。あなたの仮定distance
関数が平方根を使用平方根を削除することでこれを簡素化できます。
距離の大きい(または小さい)を見つけようとしてx^2 > y^2
も、に当てはまりますx > y
。
しかし、方程式を数学的に単純化するさらなる試みは無意味である可能性があります。間の距離vector1
とは、vector2
間の距離と同じではないvector1
とvector3
。Samの答えが示すように、この方程式は数学的に単純化できますが、現在使用されている形式は、プロセッサ使用率の観点から得られるのと同じくらい簡単です。
いくつかの数学が役立ちます。
あなたがやろうとしているのは:
<v1, v2> < <v1, v3> =>
sqrt((y2-y1)^2+(x2-x1)^2) < sqrt((y3-y1)^2+(x3-x1)^2) =>
y2^2 - 2*y2y1 + y1^2 + x2^2 - 2*x2x1 + x1^2 < y3^2 - 2*y3y1 + y1^2 + x3^2 - 2*x3x1 + x1^2
繰り返し変数を削除し、他のいくつかをグループ化できるものから。確認する必要がある操作は次のとおりです。
y3^2 - y2^2 - 2*y1(y3-y2) + x3^2 - x2^2 - 2*x1(x3-x2) > 0
それが役に立てば幸い。
本当の問題は、最も近いオブジェクトを決定するための計算をどのように削減するかです。
これを最適化することは、多くの場合ゲームで行われますが、すべての最適化ではプロファイルに基づく必要があり、多くの場合、物事を単純化しません。
不必要な距離計算を回避して最も近いもの、または特定の範囲内のすべてのものを決定する方法は、空間インデックス、たとえばoctreeを使用することです。
これは、多数のオブジェクトがある場合にのみ効果があります。オブジェクトが3つだけの場合、成果が得られる可能性は低く、確かにコードは単純化されません。
それは、distance(v1、v2)の出力が何であるかに依存します
ベクトル上の小数(浮動小数点または倍精度)の場合、distancesquaredの方がはるかに高速になる可能性があります
float
。