サークル間の衝突は簡単です。2つの円があると想像してください。
- 中心(x1、y1)と半径r1のC1。
- 中心(x2、y2)と半径r2のC2。
これらの2つの中心点の間に線が走っていると想像してください。中心点からいずれかの円の端までの距離は、定義上、それぞれの半径に等しくなります。それで:
- 円のエッジが接触している場合、中心間の距離はr1+r2です。
- それ以上の距離では、円は接触したり衝突したりしません。と
- それ以下で衝突します。
したがって、次の場合に衝突を検出できます。
(x2-x1)^2 + (y2-y1)^2 <= (r1+r2)^2
つまり、中心点間の距離は半径の合計よりも小さくなります。
同じ原理を、3次元での球間の衝突の検出にも適用できます。
編集:衝突点を計算したい場合は、いくつかの基本的な三角法で計算できます。あなたは三角形を持っています:
(x1,y1)
|\
| \
| \ sqrt((x2-x1)^2 + (y2-y1)^2) = r1+r2
|y2-y1| | \
| \
| X \
(x1,y2) +------+ (x2,y2)
|x2-x1|
式|x2-x1|
と|y2-y1|
は絶対値です。したがって、角度Xの場合:
|y2 - y1|
sin X = -------
r1 + r2
|x2 - x1|
cos X = -------
r1 + r2
|y2 - y1|
tan X = -------
|x2 - x1|
角度が決まったら、新しい三角形に適用して交点を計算できます。
+
|\
| \
b | \ r2
| \
| X \
+-----+
a
どこ:
a
cos X = --
r2
それで
a = r2 cos X
前の式から:
|x2 - x1|
a = r2 -------
r1 + r2
aとbができたら、必要に応じて(a、b)でオフセットされた(x2、y2)の観点から衝突点を計算できます。このために、正弦、余弦、逆正弦、または余弦を計算する必要はありません。またはその問題の平方根。だからそれは速いです。
ただし、正確な角度や衝突点が必要なく、八分儀が必要な場合は、接線について理解することで、これをさらに最適化できます。
- 0 <= tan X <= 1 for 0 <= X<=45度;
- tan X> = 1 for 45 <= X <= 90
- 0> = tan X> = -1 for 0> = X => -45;
- tan X <= -1 for -45> = X => -90; と
- tan X = tan(X + 180)= tan(X-180)。
これらの4度の範囲は、円の4つの八分象限に対応します。他の4つは180度オフセットされています。上に示したように、接線は次のように簡単に計算できます。
|y2 - y1|
tan X = -------
|x2 - x1|
絶対値を失うと、この比率により、衝突が4つのオクタントのどれにあるかがわかります(上記の接線範囲による)。正確なオクタントを計算するには、x1とx2を比較して、どちらが左端かを判断します。
他のシングルの衝突のオクタントはオフセットされます(C1のオクタント1は、C2、2と6、3と7、4と8などのオクタント5を意味します)。