본문 바로가기
파이썬으로 풀어보는 고딩수학/평면좌표

삼각형의 무게중심을 sympy로 구하기

by hustler78 2023. 12. 6.
728x90
반응형

 직각삼각형 만들기

 

직각삼각형 만들기

이번 글은 삼각형의 외접원 구하기 삼각형의 외접원 구하기 저번 글 두 점에서 거리가 같은 직선상의 점 구하기 두 점에서 거리가 같은 직선상의 점 구하기 저번 글에서는 2023.11.17 - [파이썬으로

sine-qua-none.tistory.com

 

에 이어서 또 삼각형에 대한 이야기를 해볼게. 이번엔 

 

삼각형의 무게중심

 

에 대한 주제로 이야기를 해볼까 해.

 

 

삼각형의 무게중심

삼각형의 무게중심은 각 꼭짓점에서 대변의 이등분점에 내린 직선들의 교점이야. 이런 직선들은 세 개가 나오는데, 신기하게도 한 점에서 만나게 되지. 이게 바로 무게중심!

 

 

 

 

보통 우리는 무게중심의 공식을

한 꼭지점과  대변의 중점을 2:1로 내분한 점

 

으로 알고 있어.  즉

$A(x_1, y_1)$과 $BC$의 중점인 $\left( \frac{x_2+x_3}{2},  \frac{y_2+y_3}{2} \right)$ 를 2:1로 내분해 보도록 하자.

내분점은

$$ \left( \frac{2 \frac{x_2+x_3}{2} + x_1}{3}~,~ \frac{2\frac{y_2+y_3}{2}+y_1}{3} \right),$$ 즉,

$$ \left( \frac{x_1+x_2+x_3}{3}~,~ \frac{y_1+y_2+y_3}{3} \right) \tag{1}$$

이지.

 

 

Python Code

 

아래는 무게중심의 정의, 즉 세 각에서 각각의 대변의 중점으로 연결하는 선분들이 만나는 교차점이 무게중심이라는 사실을 이용해 보는 코드야.

from sympy import *

x1, x2, x3 = symbols("x1 x2 x3")
y1, y2, y3 = symbols("y1 y2 y3")

# 삼각형 ABC의 점 A,B,C 를 각각 아래와 같이 정의
A = Point([x1, y1])   # A(x1,y1)
B = Point([x2, y2])   # B(x2,y2)
C = Point([x3, y3])   # C(x3,y3)

BC_middle = B.midpoint(C)   # B와 C의 중점 :BC_middle
line1 = Line(A, BC_middle)  # A와 BC_middle 을 잇는 직선1

AC_middle = A.midpoint(C)   # A와 C의 중점을 AC_middle 이라 정의
line2 = Line(B, AC_middle)  # B와 AC_middle을 잇는 직선2


pt = line1.intersection(line2)  # 직선1과 직선2의 교차점을 pt라 한다. 주의: pt는 list형

print(f'center G  of triangle : {pt[0]}')  #pt가 list형이므로 pt[0]으로 index로 값 추출


print(f'line CG meets AB at the point {Line(pt[0], C).intersection(Line(A,B))}')
# pt[0]라는 점과 C를 연결하는 직선이, AB와 만나는 점을 찍어본다
# 이게 과연 AB의 중점이 나올까?

 

결과를 보자면! 

center G  of triangle : Point2D(x1/3 + x2/3 + x3/3, y1/3 + y2/3 + y3/3)
line CG meets AB at the point [Point2D(x1/2 + x2/2, y1/2 + y2/2)]

 

위와 같이 나오고, 첫 번째 결과를 보자고. 식(1)과 똑같지?

 

두 번째 결과는 위에서 말했듯이,  점 $C$에서 $G$를 잇는 직선이 선분 $AB$와 만나는 점을 구해본 거야. 결과가

$$ \left( \frac{x_1+x_2}{2}~,~ \frac{y_1+y_2}{2} \right)$$

이고 이것은 바로 선분 $AB$의 중점이지!

 

역으로 말해 $AB$의 중점과 $C$를 잇는 선분은 바로 위에서 구한 점 pt[0], 즉, $G$를 지난다는 애기지.

 

 

주의할 점

 

위의 코딩을 할 때, pt를 출력해 보면,

pt = line1.intersection(line2)
print(pt)

 

출력결과가

[Point2D(x1/3 + x2/3 + x3/3, y1/3 + y2/3 + y3/3)]

 

위와 같이 list 형을 나타내는 꺾쇠 기호에 둘러싸여서 나와. list형을 반환한다는 이야기야. 그래서 이 list형의 원소를 다루고 싶다면 pt[0]가 같이 index를 매칭하여 끄집어내 줘야 한다는 것!

 

 

그런데 당연스럽게도(?) 무게중심은 삼각형의 중요한 내용 중 하나니, 왠지 python이 내장함수로 제공해 줄 것 만 같아. 바로 다음과 같이!

 

 

무게중심 - python 함수

from sympy import *
import matplotlib.pyplot as plt
import numpy as np

x1, x2, x3 = symbols("x1 x2 x3")
y1, y2, y3 = symbols("y1 y2 y3")
A = Point([x1, y1])
B = Point([x2, y2])
C = Point([x3, y3])

tr = Triangle(A,B,C)    # 점 A,B,C로 삼각형 구성
pt = tr.centroid        # centriod라는 함수를 이용하여 무게중심 산출

print(pt)

 

결과는?

 

Point2D(x1/3 + x2/3 + x3/3, y1/3 + y2/3 + y3/3)

 

오! 바로 무게중심 공식이 나오는구먼. 게다가 list형도 아니고 간결하게 Point2D 형으로 나오네!

 

 

정리

이 글에서 나온 함수나 중요사항 정리.

 

A.midpoint(B) 점 A와 B의 중점 
A,B는 Point 형
Triangle.centroid Triangle의 무게중심

 

 

 

 

728x90
반응형

댓글