三角形クラスのプログラム

外接円の中心座標と半径を求めるプログラムの予備段階として、三点の座標で三角形を表すクラスを作ってみることにしました。

■プログラム triangle.py

# 三角形クラス
import math
from decimal import Decimal

class Triangle:
    def __init__(self, points):
        '''
        points = [(x1, y1), (x2, y2), (x3, y3)]
        '''
        self.x1 = points[0][0]
        self.y1 = points[0][1]
        self.x2 = points[1][0]
        self.y2 = points[1][1]
        self.x3 = points[2][0]
        self.y3 = points[2][1]

        self._edges()
        self._angles()

    def edges(self):
        return self.a, self.b, self.c

    def angles(self):
        return self.alpha, self.beta, self.gamma
    
    def _edges(self):
        # 三平方の定理により三辺の長さを求める
        self.a = math.sqrt((self.x2 - self.x3) ** 2 +
                           (self.y2 - self.y3) ** 2)
        self.b = math.sqrt((self.x1 - self.x3) ** 2 +
                           (self.y1 - self.y3) ** 2)
        self.c = math.sqrt((self.x2 - self.x1) ** 2 +
                           (self.y2 - self.y2) ** 2)

    def _angles(self):
        # 余弦定理により三角形の3つの角を求める
        self.alpha = math.acos((self.b ** 2 + self.c ** 2 - self.a ** 2) / (self.b * self.c * 2))

        self.beta = math.acos((self.c ** 2 + self.a ** 2 - self.b ** 2) / (self.c * self.a * 2))

        self.gamma = math.acos((self.a ** 2 + self.b ** 2 - self.c ** 2) / (self.a * self.b * 2))

    def _outer_radius(self):
        # 正弦定理により外接円の半径を求める
        self.outer_radius = self.a / math.sin(self.alpha) / 2
        
if __name__ == '__main__':
    t = Triangle([(Decimal('0.0'), Decimal('0.0')),
                  (Decimal('3.0'), Decimal('0.0')),
                  (Decimal('0.0'), Decimal('4.0'))])
    print(t.edges())
    print(t.angles())

    sum_angles = 0
    for i in t.angles():
        sum_angles += i

    print(sum_angles)

二点間の距離は、三平方の定理で求めることができます。
たとえば、(x1,y1)と(x2,y2)の距離は、

距離 = √( (x1 – x2)2 + (y1 – y2)2 )

になります。

二点間の距離が求まったので、辺に対する角の大きさは余弦定理で求めることができます。

さらに、関数_outer_radius()では正弦定理を用いて外接円の半径を求めています。

■実行結果

$ python3 triangle.py
(5.0, 4.0, 3.0)
(1.5707963267948966, 0.9272952180016123, 0.6435011087932843)
2.5
3.141592653589793

3.141592653589793ラジアンを度数法で表すと180°になります。
なんとなく、ちゃんと動いてるっぽいです。

ここまでくれば、あとは外接円の中心座標を求めれば「Circumscribed Circle of a Triangle」は、ほぼ解けたと言っても過言ではありません。

さて、どうすればいいのかな。

Pythonプログラミング物語 © 2016 Frontier Theme