3. 칼과 방어막: 직선과 평면의 수직 충돌
[도입부] 학습 목표 (Learning Objectives)
- 무한히 뻗어나가는 레이저 광선(직선)과 거대한 데이터 필드 방어막(평면)이 우주 공간에서 어떤 각도로 격돌하고 스쳐 지나가는지 위치 관계를 규명합니다.
- 특히 직선이 평면을 정면으로 꿰뚫어버리는 ‘직선과 평면의 수직 관통(Perpendicularity)’ 이 성립하기 위해 필요한 무시무시한 증명 조건(평면 내 두 직선과의 수직)을 해킹합니다.
- 파이썬(Python) 3D 벡터 내적 연산을 활용해 레이저 빔이 방어막 평면에 90도로 완벽하게 꽂혔는지 충돌 픽셀 판정 코드를 짜 봅니다.
1. 레이저 빔(직선) vs 홀로그램 방패(평면)
허공에 끝없이 펼쳐진 거대한 전광판(평면 P)이 있고, 여러분이 제다이가 되어 광선검(직선 l)을 아무렇게나 휘둘러 봅니다. 공간상에서 이 선과 면이 취할 수 있는 공격 포지션은 딱 3패턴으로 귀결됩니다.
- 관통 공격 (한 점에서 만난다): 광선검이 전광판을 뚫고 꽂힌 상태입니다. 교점은 무조건 1개가 생성됩니다.
- 비껴가기 (평행하다): 광선검을 전광판과 완벽하게 나란한 각도로 들고 허공을 저어가며 절대 닿지 못하는 헛방 상태입니다. (수학 기호: $l \parallel P$)
- 방패에 숨기 (포함된다): 광선검을 전광판 화면 위에 딱 밀착시켜 붙여버린 상태입니다. 광선검의 모든 픽셀점이 평면 레이어 안에 속하게 됩니다. (수학 기호: $l \subset P$)
2. 수직 관통의 절대 조건: “평면 코어 격파”
위 3가지 포지션 중 가장 역학적으로 중요하게 다뤄지는 순간은 광선검이 방패를 뚫어버리는 관통 공격 중에서도, 완벽한 90도 각도로 꽂히는 ‘수직(직교, $l \perp P$)’ 스펙입니다.
단순히 모니터 화면(평면)에 볼펜을 세웠다고 해서 그 펜이 정말 모니터와 90도로 수직일까요? 내가 볼 땐 수직 같지만, 옆에서 보면 85도로 기울어져 있을 수 있습니다. 따라서 수학에서는 직선 l이 평면 P와 완벽한 ‘진짜 수직’ 이기 위한 악랄한 판정 조건을 걸어두었습니다.
🛡️ [평면 수직 판정의 철칙]
평면 바닥(P)에 광선검(l)을 딱 꽂았을 때, 이것이 90도 수직으로 인정받으려면? $\Rightarrow$ 평면 바닥에 마구잡이로 그어져 있는 ‘선풍기 날개’ 같은 두 개의 교차 직선(m, n)과 모두 90도를 이루고 있어야만 한다!
거기 바닥 면에 그어진 직선 m(x축 방향)과도 수직(90도)이고, 동시에 다른 방향의 직선 n(y축 방향)과도 수직을 유지해야만 비로소 광선검은 사방팔방 어디서 돌려봐도 기울어지지 않은 완벽한 제트축(z축)의 수직성을 보증받게 되는 것입니다.
3. 💻 파이썬(Python) 엔진: 수직 꽂힘(내적 0) 데미지 판독
3D 벡터 시스템에선 두 개의 작대기가 수직(90도)인지 알아내기 위해 ‘내적(Dot Product) 이 0 이다’ 라는 우주 절대 마법의 치트키를 씁니다. 파이썬 넘파이 연산으로 광선검이 바닥의 두 줄기 방어선과 수직인지 판독해 봅니다.
🐍 파이썬 예제: 벡터 내적(Dot Product)을 통한 직교(수직) 스캐너
import numpy as np
print("--- ⚔️ 레이저 빔 수직 관통(Perpendicular) 판독 엔진 가동 ---")
# 레이저 빔 벡터 방향(l): 위아래 탑승축 (0, 0, 1) 이라 가정 (Z축 방향)
laser_beam = np.array([0, 0, 1])
# 평면 레이어 속에 그어져 있는 무작위 두 개의 선분 텍스처 (X축, Y축 베이스)
surface_line_m = np.array([1, 0, 0]) # 평면 위 m선분
surface_line_n = np.array([0, 1, 0]) # 평면 위 n선분
print("[데이터 수집] 평면 속 십자 방어막 두 개 확보 완료")
# [알고리즘] 두 벡터의 내적(Dot)이 0 이면 무조건 각도는 90도(수직)!!
dot_m = np.dot(laser_beam, surface_line_m)
dot_n = np.dot(laser_beam, surface_line_n)
print("-" * 50)
print(f"📡 [내적 스캔 1] 레이저빔 vs 선분m 내적 에너지 = {dot_m} (에너지 0 이면 90도 수직)")
print(f"📡 [내적 스캔 2] 레이저빔 vs 선분n 내적 에너지 = {dot_n} (에너지 0 이면 90도 수직)")
if dot_m == 0 and dot_n == 0:
print("\n🚨 [최종 판정: PERFECT PERPENDICULAR]")
print(" 👉 레이저 빔이 평면 내의 교차하는 두 선과 모두 0데미지(90도 수직)를 달성했습니다!")
print(" 👉 수학 법칙에 의해, 이 레이저 빔은 평면 전체(P)에 대하여 완벽한 수직(⊥) 상태로 박혀 있습니다.")
else:
print("\n[최종 판정: WARNING] 빔이 기울어졌습니다. 수직 관통 실패.")
# 결과창:
# --- ⚔️ 레이저 빔 수직 관통(Perpendicular) 판독 엔진 가동 ---
# [데이터 수집] 평면 속 십자 방어막 두 개 확보 완료
# --------------------------------------------------
# 📡 [내적 스캔 1] 레이저빔 vs 선분m 내적 에너지 = 0 (에너지 0 이면 90도 수직)
# 📡 [내적 스캔 2] 레이저빔 vs 선분n 내적 에너지 = 0 (에너지 0 이면 90도 수직)
#
# 🚨 [최종 판정: PERFECT PERPENDICULAR]
# 👉 레이저 빔이 평면 내의 교차하는 두 선과 모두 0데미지(90도 수직)를 달성했습니다!
# 👉 수학 법칙에 의해, 이 레이저 빔은 평면 전체(P)에 대하여 완벽한 수직(⊥) 상태로 박혀 있습니다.
코드가 증명하듯, 평면 바닥(방향 벡터 m, n)의 뼈대 역할을 하는 2개의 선형 벡터와 레이저빔(laser_beam)이 90도의 관계(내적 0)를 통과하게 되면, 컴퓨터 그래픽 시스템은 해당 평면에 나무 기둥을 수직으로 똑바로 심은 좌표 결괏값을 자신 있게 화면에 송출할 수 있습니다.
[결론] 학습 정리 (Summary)
- 상황 인식: 광활한 3차원에서 막대기 하나와 유리판 하나를 던져놓으면, 셋 중 하나입니다. (뚫거나, 나란하거나, 완전히 눕혀져 들러붙거나).
- 조건 증명의 핵심: 우리가 방바닥(평면)에 연필(직선)을 똑바로 90도로 세웠다고 보증하려면, 방바닥에 대각선으로 선을 2개 긋고 각각의 선과 연필 사이의 틈 각도가 모두 90도인지 검열 절차를 거쳐야만 합니다.
- 법선 벡터의 씨앗: 훗날 대학교 혹은 파이썬 넘파이로 3D 프로그래밍을 할 때 가장 많이 쓰는 기법이 바로 이 “평면 내 2개의 선(벡터)을 외적하여 수직으로 꽂히는 막대기(법선 벡터)의 좌표 스탯 뽑아내기” 인 점을 기억하십시오.