머리도 식힐 겸 이리저리 웹서핑을 하다 재미있는 문제를 발견해서 sympy로 한번 풀어보면 재밌겠다 싶어서 도전해 본 문제가 있어.
교수님 존함을 보아하니, 수하 퍼즐 쪽으로 아주 유명하신 박부성 교수님이네. 어렸을 때도 많이 사서 풀어보고 했던 수학퍼즐 책들의 저자이시기도 하지. 박부성 교수님의 X (전 트위터) 계정은 링크 걸었으니 참고하시고~
위의 그림처럼 정육각형이 있고, 그림과 같이 4개의 대각선(?) 비슷한 것들을 그려 만나는 점으로 이루어진 녹색 사각형, 이 놈의 면적이 정육각형에서 차지하는 비율을 구하는 문제야.
풀이
위 문제를 python의 sympy를 이용하여 풀어보자구.
from sympy import *
p = Polygon((0,0), 1, n=6) # 정6각형 정의 (외접원 중심을 원점, 외접원의 반지름을 1)
vtx = p.vertices # vtx는 위에서 정의한 정육각형의 꼭지점(vertex)
reg_hexagon_area = p.area # area 함수를 사용하여 넓이 구함
line1 = Line(vtx[2], vtx[0].midpoint(vtx[5])) # 꼭지점3과, 꼭지점1,5의 중점을 잇는 직선
line2 = Line(vtx[5], vtx[2].midpoint(vtx[3]))
line3 = Line(vtx[1], vtx[3].midpoint(vtx[4]))
line4 = Line(vtx[4], vtx[0].midpoint(vtx[1]))
pt13 = line1.intersection(line3) # 직선끼리 만나는 점을 구함, list형 반환
pt14 = line1.intersection(line4)
pt23 = line2.intersection(line3)
pt24 = line2.intersection(line4)
new_polygon = Polygon(pt14[0], pt13[0], pt23[0], pt24[0]) # polygon vertex의 writing 순서를 잘 고려해야 한다.
# 위의 new_polygon 생성시, 점들의 순서에 주의해야 함!! (반시계 방향으로 돌게끔 설정)
# pt14[0], pt13[0], pt23[0], pt24[0] 이 아래 그림에서 보듯이 시계반대방향으로 회전하며 위치
# pt14[0] 처럼 index 0으로 추출하는 이유는 intersection함수가 list형을 반환하기 때문
# new_polygon = Polygon(pt13[0], pt14[0], pt23[0], pt24[0]) 와 비교
new_pol_area = new_polygon.area # 위에 설정한 new_polygon의 면저 구함
ratio =new_polygon.area / p.area # 비율
print(f'Area of Regular hexagon : {reg_hexagon_area}')
print(f'Area of new Polygon : {new_pol_area}')
print(f'Ratio : {ratio}')
참고로, 위의 코드에서 선언한 변수명들을 그림으로 정리하면,
자, 그럼 결과는?
Area of Regular hexagon : 3*sqrt(3)/2
Area of new Polygon : 2*sqrt(3)/15
Ratio : 4/45
정육각형 안에 새로 생성된 녹색 마름모의 넓이는 전체 육각형 면적의 $ 4/45$ 임을 알 수 있네.
주의 사항
위 코드의 주석에서 new_polygon 생성 시, 점들을 시계 반대방향으로 순차적으로 써 줬잖아? 이걸 한번 다르게 써봅시다.
점을 시계 방향으로 배치한 경우
new_polygon = Polygon(pt14[0], pt24[0], pt23[0], pt13[0])
new_polygon을 위와 같이 바꿔보자. pt14, pt24, pt23, pt13은 시계방향으로 돌고 있어.
결과는?
Area of Regular hexagon : 3*sqrt(3)/2
Area of new Polygon : -2*sqrt(3)/15
Ratio : -4/45
넓이가 (-) 음의 부호가 나오네? python의 area 함수는 이처럼 점의 배치까지 고려하여 넓이를 제공해 준다는 점!
점을 교차로 배치한 경우
new_polygon = Polygon(pt13[0], pt24[0], pt14[0], pt23[0])
결과를 보면,
Area of Regular hexagon : 3*sqrt(3)/2
Area of new Polygon : 0
Ratio : 0
아예 넓이가 0이 나와버리지.
결론은 sympy Polygon의 area 함수를 쓸 때는, Point 들의 배열 순서도 고려해 줘야 한다는 것!
정리
본문에 나온 함수들 정리해 보면,
Polygon(pt, radius, n) | 외접원의 중심이 pt, 반지름이 radius인 정n각형 생성 |
Polygon.vertices | 도형의 꼭지점 list를 반환 |
Polygon.area | 도형이 면적을 계산 (Polygon 생성시 주의!!) |
pt1.midpoint(pt2) | pt1과 pt2의 중점 |
line1.intersection(line2) | 직선 line1과 직선 line2의 교점을 list형으로 반환 (따라서 교점을 추출할 때는 index 지정하여 추출해야 함) |
'파이썬으로 풀어보는 고딩수학 > 평면좌표' 카테고리의 다른 글
원의 방정식 (0) | 2023.12.21 |
---|---|
수직으로 만나는 점, 직선 구하기 (0) | 2023.12.18 |
파푸스 정리의 일반화, 스튜어트 정리 (0) | 2023.12.13 |
파푸스의 중선 정리 with Sympy (0) | 2023.12.13 |
삼각형의 무게중심을 sympy로 구하기 (0) | 2023.12.06 |
댓글