【Python】円同士(2D)・球同士(3D)の当たり判定の作り方

Pythonを使って、2Dの円同士や3Dの球同士がぶつかっているかどうかを判定する方法を学びます。

この記事では、円や球の基本的な定義から始めて、実際に当たり判定を行うための具体的なコード例までをわかりやすく解説します。

ゲームやシミュレーションでの利用も視野に入れた応用例も紹介しますので、初心者の方でも安心して読み進められます。

目次から探す

円同士の当たり判定 (2D)

基本概念

円の定義

円同士の当たり判定を行うためには、まず円の定義を理解する必要があります。

円は2D空間において、中心座標と半径によって定義されます。

中心座標 (x, y)

円の中心座標は、2D空間上の一点を示します。

通常、これらの座標は (x, y) という形式で表されます。

例えば、中心が (3, 4) にある円は、x座標が3、y座標が4の位置に中心を持つ円です。

半径 r

半径は、円の中心から円周までの距離を示します。

半径が大きいほど、円のサイズも大きくなります。

例えば、半径が5の円は、中心から5単位の距離に円周が存在します。

当たり判定の基本原理

距離の計算

円同士の当たり判定の基本は、2つの円の中心間の距離を計算することです。

この距離が2つの円の半径の合計以下であれば、円同士が重なっている、つまり当たっていると判定します。

判定条件

具体的には、2つの円の中心間の距離が、2つの円の半径の合計以下である場合に当たりと判定します。

例えば、円Aの半径が3、円Bの半径が4で、中心間の距離が7以下であれば、円Aと円Bは当たっていると判定されます。

実装方法

必要なライブラリ

mathライブラリの使用

Pythonで円同士の当たり判定を行うためには、数学的な計算が必要です。

特に、平方根を計算するためにmathライブラリを使用します。

mathライブラリは標準ライブラリの一部であり、特別なインストールは不要です。

距離の計算方法

ユークリッド距離の計算

ユークリッド距離は、2点間の直線距離を計算する方法です。

2つの点 (x1, y1) と (x2, y2) のユークリッド距離は、次の式で計算されます。

判定ロジックの実装

距離と半径の比較

2つの円の中心間の距離が、2つの円の半径の合計以下であるかどうかを比較します。

これにより、円同士が当たっているかどうかを判定します。

コード例

基本的な当たり判定の関数

以下に、円同士の当たり判定を行う基本的な関数の例を示します。

import math
def is_collision(x1, y1, r1, x2, y2, r2):
    # 中心間の距離を計算
    distance = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
    # 距離が半径の合計以下であれば当たりと判定
    return distance <= (r1 + r2)

関数の定義

この関数 is_collision は、2つの円の中心座標 (x1, y1) と (x2, y2)、およびそれぞれの半径 r1 と r2 を引数として受け取ります。

中心間の距離を計算し、その距離が半径の合計以下であれば True を返し、そうでなければ False を返します。

使用例

以下に、この関数を使用した例を示します。

# 円Aの中心座標と半径
x1, y1, r1 = 0, 0, 5
# 円Bの中心座標と半径
x2, y2, r2 = 4, 3, 5
# 当たり判定を実行
if is_collision(x1, y1, r1, x2, y2, r2):
    print("円Aと円Bは当たっています")
else:
    print("円Aと円Bは当たっていません")

応用例

複数の円の当たり判定

複数の円同士の当たり判定を行う場合、全ての円の組み合わせについて当たり判定を行う必要があります。

以下にその例を示します。

# 複数の円のデータ
circles = [
    (0, 0, 5),
    (4, 3, 5),
    (10, 10, 2)
]
# 全ての円の組み合わせについて当たり判定を実行
for i in range(len(circles)):
    for j in range(i + 1, len(circles)):
        x1, y1, r1 = circles[i]
        x2, y2, r2 = circles[j]
        if is_collision(x1, y1, r1, x2, y2, r2):
            print(f"円{i}と円{j}は当たっています")
        else:
            print(f"円{i}と円{j}は当たっていません")

ゲームやシミュレーションでの利用

円同士の当たり判定は、ゲームやシミュレーションにおいて非常に重要です。

例えば、キャラクター同士の衝突判定や、物理シミュレーションにおける物体の衝突判定などに利用されます。

これにより、リアルな動作やインタラクションを実現することができます。

球同士の当たり判定 (3D)

基本概念

球の定義

3D空間における球の定義は、2D空間の円と似ていますが、もう一つの次元が加わります。

球は中心座標と半径で定義されます。

中心座標 (x, y, z)

球の中心は3次元空間の座標 (x, y, z) で表されます。

これにより、球の位置が決まります。

半径 r

球の半径 r は、中心から球の表面までの距離を示します。

この値が球の大きさを決定します。

当たり判定の基本原理

距離の計算

球同士の当たり判定の基本は、2つの球の中心間の距離を計算することです。

この距離が2つの球の半径の合計以下であれば、球同士が接触していると判定します。

判定条件

具体的には、2つの球の中心間の距離 d が、球1の半径 r1 と球2の半径 r2 の合計以下であれば、当たり判定が成立します。

[ d \leq r1 + r2 ]

実装方法

必要なライブラリ

Pythonで球同士の当たり判定を行うためには、数学的な計算を行うための math ライブラリを使用します。

mathライブラリの使用

math ライブラリには、平方根を計算するための sqrt関数が含まれています。

これを使用して、中心間の距離を計算します。

距離の計算方法

3次元空間でのユークリッド距離の計算

3次元空間でのユークリッド距離は、次の式で計算されます。

ここで、(x1, y1, z1) と (x2, y2, z2) はそれぞれ2つの球の中心座標です。

判定ロジックの実装

距離と半径の比較

計算した距離 d と2つの球の半径の合計を比較します。

距離が半径の合計以下であれば、球同士が接触していると判定します。

コード例

基本的な当たり判定の関数

以下に、球同士の当たり判定を行うPythonの関数を示します。

import math
def are_spheres_colliding(x1, y1, z1, r1, x2, y2, z2, r2):
    # 中心間の距離を計算
    distance = math.sqrt((x2 - x1)**2 + (y2 - y1)**2 + (z2 - z1)**2)
    # 距離と半径の合計を比較
    return distance <= (r1 + r2)

関数の定義

この関数 are_spheres_colliding は、2つの球の中心座標と半径を引数として受け取り、球同士が接触しているかどうかを判定します。

使用例

以下は、この関数を使用した例です。

# 球1の中心座標と半径
x1, y1, z1, r1 = 0, 0, 0, 5
# 球2の中心座標と半径
x2, y2, z2, r2 = 3, 4, 0, 5
# 当たり判定を実行
if are_spheres_colliding(x1, y1, z1, r1, x2, y2, z2, r2):
    print("球同士が接触しています")
else:
    print("球同士は接触していません")

応用例

複数の球の当たり判定

複数の球の当たり判定を行う場合、全ての球の組み合わせについて当たり判定を行う必要があります。

以下はその例です。

# 複数の球のデータ
spheres = [
    (0, 0, 0, 5),
    (3, 4, 0, 5),
    (10, 10, 10, 2)
]
# 全ての組み合わせについて当たり判定を行う
for i in range(len(spheres)):
    for j in range(i + 1, len(spheres)):
        x1, y1, z1, r1 = spheres[i]
        x2, y2, z2, r2 = spheres[j]
        if are_spheres_colliding(x1, y1, z1, r1, x2, y2, z2, r2):
            print(f"球 {i} と 球 {j} が接触しています")

ゲームやシミュレーションでの利用

球同士の当たり判定は、ゲームや物理シミュレーションで非常に重要です。

例えば、3Dゲームでのキャラクターの衝突判定や、物理シミュレーションでの粒子の相互作用などに利用されます。

これにより、リアルな動作や反応を実現することができます。

以上が、Pythonを用いた球同士の当たり判定の基本的な方法とその応用例です。

これを基に、さらに複雑なシステムやアルゴリズムを構築することが可能です。

目次から探す