Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで2つの三角形の相似を判定するプログラム(SSS・SAS・AAA)

本記事では、Pythonを使って2つの三角形が相似しているかどうかを判定するプログラムを紹介します。判定には、幾何学でよく知られる相似条件「SSS」「SAS」「AAA」の3つを使用し、これらの条件をもとに三角形の相似関係を証明します。

三角形の相似条件とは

2つの三角形が相似であるかを調べる際に用いられる主な条件は以下のとおりです。

  • SSS(三辺比相等):対応する3組の辺の比がすべて等しい
  • SAS(二辺比・挟角相等):2組の対応する辺の比が等しく、それらに挟まれた角も等しい
  • AAA(三角相等):対応する3つの角がすべて等しい

なお、「合同」は対応する辺の長さが完全に一致する場合を指すのに対し、「相似」は辺の比と角が一致する場合を指します。このプログラムでは辺の比を比較しているため、厳密には「相似」の判定を行っている点に注意してください。

サンプルコード

以下のコードでは、条件ごとに関数を分けて判定を行い、成立した条件を出力しています。辺や角度のリストをあらかじめソートしておくことで、入力の並び順に左右されない判定を実現しています。

def side_side_side(sides_one, sides_two):
    """SSS(三辺比相等)の判定"""
    # 同じ順序でソート
    sides_one.sort()
    sides_two.sort()
    # 3組すべての辺の比が等しいかを確認
    if sides_one[0] / sides_two[0] == sides_one[1] / sides_two[1] \
            and sides_one[1] / sides_two[1] == sides_one[2] / sides_two[2] \
            and sides_one[2] / sides_two[2] == sides_one[0] / sides_two[0]:
        return True
    return False


def side_angle_side(sides_one, sides_two, angles_one, angles_two):
    """SAS(二辺比・挟角相等)の判定"""
    # 同じ順序でソート
    sides_one.sort()
    sides_two.sort()
    angles_one.sort()
    angles_two.sort()
    # 条件1:辺[0]と辺[1]の比が等しく、角[0]も等しいか
    if sides_one[0] / sides_two[0] == sides_one[1] / sides_two[1] \
            and angles_one[0] == angles_two[0]:
        return True
    # 条件2:辺[1]と辺[2]の比が等しく、角[1]も等しいか
    if sides_one[1] / sides_two[1] == sides_one[2] / sides_two[2] \
            and angles_one[1] == angles_two[1]:
        return True
    # 条件3:辺[2]と辺[0]の比が等しく、角[2]も等しいか
    if sides_one[2] / sides_two[2] == sides_one[0] / sides_two[0] \
            and angles_one[2] == angles_two[2]:
        return True
    # どの条件も満たさなければFalseを返す
    return False


def angle_angle_angle(angles_one, angles_two):
    """AAA(三角相等)の判定"""
    # 同じ順序でソート
    angles_one.sort()
    angles_two.sort()
    # 3つの角がすべて一致するかを確認
    if angles_one[0] == angles_two[0] \
            and angles_one[1] == angles_two[1] \
            and angles_one[2] == angles_two[2]:
        return True
    return False


if __name__ == '__main__':
    # 辺の初期化
    sides_one = [2.0, 3.0, 3.0]
    sides_two = [4.0, 6.0, 6.0]
    # 角度の初期化
    angles_one = [80.0, 60.0, 40.0]
    angles_two = [40.0, 60.0, 80.0]
    # 各条件での判定結果を出力
    print("相似と判定された条件:", end=' ')
    if side_side_side(sides_one, sides_two):
        print("SSS", end=' ')
    if side_angle_side(sides_one, sides_two, angles_one, angles_two):
        print("SAS", end=' ')
    if angle_angle_angle(angles_one, angles_two):
        print("AAA", end='')

実行結果

上記のコードを実行すると、次のような出力が得られます。

相似と判定された条件: SSS SAS AAA

コードのポイント

  • side_side_side():3組すべての対応する辺の比が一致するかを確認します。
  • side_angle_side():「2辺の比+挟角」の組み合わせを3パターンに分けて確認します。
  • angle_angle_angle():3つの角がすべて一致するかを確認します。
  • 各関数はリストを昇順にソートしてから比較するため、データの渡す順序に依存せずに判定できます。

注意点:浮動小数点数の比較

浮動小数点数の除算結果を==で直接比較すると、丸め誤差により意図しない判定結果になることがあります。より堅牢な実装にしたい場合は、標準ライブラリのmath.isclose()を使った近似比較を検討してください。

まとめ

本記事では、SSS・SAS・AAAという3つの相似条件を使って、2つの三角形の相似関係を判定するPythonプログラムを紹介しました。辺と角度のデータを整えてから比較するシンプルな構成のため、幾何学アルゴリズムの学習にも最適です。チュートリアルについて質問がある場合は、ぜひコメント欄でお知らせください。

  1. Pythonで素数を判定するプログラムの書き方を徹底解説

    はじめに この記事では、「与えられた数値が素数かどうかを判定する」という問題に対する解決策を、Pythonのコード例とともにわかりやすく解説します。 問題の概要 問題設定:ある数値が与えられたとき、その数が素数であるかどうかを判定するプログラムを作成します。 まず「素数」の定義をおさらいしましょう。1より大きい正の整数のうち、1とその数自身以外に約数を持たない数を素数(そすう)と呼びます。たとえば、2、3、5、7などはそれ以外の約数を持たないため、素数です。 プログラムの考え方 今回作成するプログラムでは、入力された数値が素数かどうかを以下の手順で判定します。 1以下の数値は素数ではない

  2. Pythonでアームストロング数を判定するプログラムの書き方

    この記事では、与えられた整数が「アームストロング数(Armstrong number)」であるかどうかを判定するための考え方と、Pythonによる具体的な実装方法を解説します。 問題の定義 整数 n が与えられたとき、その整数がアームストロング数であるかどうかを判定することを目標とします。 アームストロング数とは? n 桁の正の整数 abcd… が次の条件を満たすとき、この数は「n 次(オーダー n)のアームストロング数」と呼ばれます。 abcd... = a^n + b^n + c^n + d^n + … つまり、各桁の数字を「桁数乗」した値の総和が、元の数と一致するかを確認す