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

육각형 속 마름모(@puzzlist의 기하문제)

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

 

머리도 식힐 겸 이리저리 웹서핑을 하다 재미있는 문제를 발견해서 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 지정하여 추출해야 함)
728x90
반응형

댓글