06. 여섯 번째 수업: 파이썬 기하학과 무리수 응용 (Python Irrational Math)
우리는 무리수 기호($\sqrt{\quad}$)를 다루는 법, 그리고 그것들이 방정식에서 두 갈래($\pm$)로 튀어나온다는 사실을 깨달았습니다. 이제 이 모든 무기들을 컴퓨터 파이썬 환경의 math 모듈 내에 장착하여 실전 코딩 미션들을 우아하게 해결해 보는 것으로 실수 단원을 완전히 졸업하겠습니다!
1. 정수 부분과 소수(무리수) 부분 분리하기
시험에 항상 나오는 전설의 문제입니다. “$\sqrt{5}$ 의 정수 부분을 $a$, 소수 부분을 $b$라고 할 때 대답하시오!”
$\sqrt{5}$ 는 $\sqrt{4} (즉, 2)$ 보다 큽니다. 따라서 $\sqrt{5}$ 는 $2.236\dots$ 입니다.
- 정수 부분($a$) = $2$
- 소수 부분($b$) = 전체 무리수에서 정수통을 빼면 남는 자투리 = $\sqrt{5} - 2$
왜 소수 부분을 찌질하게 수식($\sqrt{5}-2$)으로 표현할까요? “0.2360679774…” 라고 적어버리는 순간 반올림 오차가 생겨버려서 무리수의 자격을 영영 잃게 되기 때문입니다! 원형 100% 무결성을 위해 저 상태 그대로 놔둬야 합니다.
2. 점과 점 사이의 거리 (유클리드 거리 공식)
게임 속 캐릭터가 2D 맵을 뛰어다닐 때, 몬스터(A좌표)에서 마법사(B좌표)까지 날아가는 파이어볼의 직선거리는 어떻게 잴까요? 여기서도 루트 기호의 무리수 연산이 컴퓨터 그래픽스 심장 엔진 역할을 합니다.
바로 피타고라스의 정리를 좌표로 옮겨 쓴 거리 공식(Distance Formula)입니다.
점 $P(x_1, y_1)$ 와 점 $Q(x_2, y_2)$ 가 주어지면, \(D(거리) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}\)
직각삼각형의 가로 밑변(x 길이)과 세로 높이(y 길이)를 구해서, 각각 제곱한 뒤 더하고 루트 씌우는 메커니즘! ($ c = \sqrt{a^2 + b^2} $)

3. 파이썬 실전 거리 판독기 작전
두 플레이어의 좌표 정보를 입력받아 거리를 계산해 봅시다.
# [Python] 무리수를 이용한 게임 좌표 거리 추적 시스템 (유클리드 거리)
import math
class Player:
def __init__(self, name, x, y):
self.name = name
self.x = x
self.y = y
# 플레이어 생성: 전사(0, 0) / 마법사(3, 4) / 몬스터(5, 7)
warrior = Player("Knight", 0, 0) # 원점
wizard = Player("Mage", 3, 4)
monster = Player("Goblin", 5, 7)
def calculate_distance(p1, p2):
# 유클리드 거리 공식: sqrt((x2-x1)^2 + (y2-y1)^2)
# math.pow(x, 2) 대신 간결한 x**2 를 씁니다.
x_dist_sq = (p2.x - p1.x) ** 2
y_dist_sq = (p2.y - p1.y) ** 2
# 두 숫자를 합친 후 루트(제곱근)을 씌움
distance = math.sqrt(x_dist_sq + y_dist_sq)
return distance
# 1. 전사와 마법사 사이의 거리 계산
dist_ww = calculate_distance(warrior, wizard)
print(f"[{warrior.name}] 과 [{wizard.name}] 의 거리는: {dist_ww}")
# 2. 마법사와 몬스터 사이의 거리 계산 (무리수 지뢰밭)
dist_wm = calculate_distance(wizard, monster)
print(f"[{wizard.name}] 과 [{monster.name}] 의 몬스터 사거리: {dist_wm}")
print("-> 어어? 3.60555... 이 숫자는 뭘까요?")
# 3. 그 정체를 sympy 로 기호 해석
import sympy as sp
dist_symbolic = sp.sqrt((monster.x - wizard.x)**2 + (monster.y - wizard.y)**2)
print(f"\n정밀 수학 엔진이 밝혀낸 실제 몬스터 사거리 원형(Root): {dist_symbolic}")
[실행 결과]
[Knight] 과 [Mage] 의 거리는: 5.0
[Mage] 과 [Goblin] 의 몬스터 사거리: 3.605551275463989
-> 어어? 3.60555... 이 숫자는 뭘까요?
정밀 수학 엔진이 밝혀낸 실제 몬스터 사거리 원형(Root): sqrt(13)
전사에서 마법사까지 거리는 $\sqrt{3^2 + 4^2} = \sqrt{25} = 5$ 이며 운 좋게 유리수(정수)로 뚝 떨어집니다.
그러나 마법사와 몬스터의 거리는 $\sqrt{2^2 + 3^2} = \sqrt{13}$ 입니다. 13 은 밖으로 빠져나올 수도 없는 독한 소수(Prime)이므로, 게임 엔진은 이 거리를 평생 3.60555... 라는 float 형 소수점 무리수로 저장하여 연산하게 됩니다.
우리가 아무 생각 없이 플레이하는 3D 게임 수천 만 픽셀 폴리곤 안에서는, 1초에 이 거리 무리수 연산($\sqrt{x^2+y^2+z^2}$)이 그래픽 카드에서 수억 번씩 터져 나오며 우주와 허공에 빛을 칠하고 있는 셈입니다.
실제로 우리 눈에 보이는 아날로그 세계(실수)는 이 무리수 없이는 절대로 존재할 수 없습니다. 수고하셨습니다. 이것으로 찬란하고 위대했던 실수(Real Number) 세계관의 대단원을 마칩니다!