교점 탐색기
2D 평면기하 / 교점 탐색기
2.5 교점 탐색기
도형과 도형이 만나는 지점을 찾는 교점 연산은 기하 그래픽의 핵심입니다. 직선과 원, 원과 원, 곡선과 곡선은 여러 개의 교점을 가질 수 있으므로, 원하는 교점을 정확하게 골라내는 네 가지 필터링 기법을 반드시 숙지해야 합니다.
배열 구조분해 할당
교점이 여러 개 발생하는 것이 확실할 때 대괄호 문법으로 여러 변수에 동시에 나누어 담는 방식입니다.
C1 = circle(center=(0,0), r=3)
L1 = line((-4, -1)--(4, 1))
[P1, P2] = isect(C1, L1)Mathit은 발견된 교점들을 가로 좌표가 작은 순서대로 정렬합니다. 만약 가로 좌표가 같다면 세로 좌표가 작은 순서대로 정렬됩니다.
따라서 P1에는 왼쪽 교점이, P2에는 오른쪽 교점이 자동으로 담기게 됩니다.
근접 점 기준 필터링
수많은 교점 중 특정 기준점에 가장 가까운 교점 하나만을 선택할 때 사용합니다.
RefPoint = (3, 2)
P = isect(C1, L1, near=RefPoint)복잡한 다각형이나 원호가 뒤엉켜 교점의 순서를 가늠하기 어려울 때 매우 유용합니다. 대략적인 기준 위치를 near= 뒤에 지정하면, 두 교점 중 해당 위치와 유클리드 거리가 가장 가까운 점 하나가 반환됩니다.
부등식 조건식 필터링
좌표의 범위 조건을 부등식으로 직접 명시하여 해를 거르는 방식입니다.
P_upper = isect(Curve1, Curve2, y > 0)
P_right = isect(Circle1, Line1, x >= 2)교점 함수 내부의 세 번째 인자에 y > 0과 같은 논리식을 전달합니다. 이를 통해 사분면 조건이나 특정 좌표축 위쪽의 점만을 명확하게 한정하여 변수에 대입할 수 있습니다. 조건에 맞는 점이 하나뿐이라면 점 객체가 바로 반환됩니다.
순번/방향 태그 필터링
가장 직관적인 방식으로, 위치 관계를 나타내는 예약어 태그를 샵(#) 기호와 함께 부여합니다.
지원되는 태그는 순번을 나타내는 #1, #2와 공간 방향을 나타내는 #top, #bottom, #left, #right입니다.
// 두 원의 교점 중 위쪽에 위치한 점 선택
P_top = isect(Circle1, Circle2, #top)
// 아래쪽 교점 선택
P_bot = isect(Circle1, Circle2, #bottom)#top은 세로 좌표가 더 큰 점을, #left는 가로 좌표가 더 작은 점을 즉시 골라냅니다. 기하학 문제를 코딩할 때 위쪽 교점, 왼쪽 교점이라는 문제지 발문을 그대로 코드로 직결시킬 수 있는 가장 간결한 방법입니다.
예제
배운 내용을 종합하여 두 원의 교점을 구하고, 그 교점과 중심점을 연결하는 삼각형을 구성해 봅니다.
@view: [-4, 6], [-4, 4]
// 두 원 정의
O1 = (0, 0)
O2 = (3, 0)
C1 = circle(center=O1, r=2.5)
C2 = circle(center=O2, r=2)
// 위쪽 교점 추출
P = isect(C1, C2, #top)
// 원 렌더링
circle: center=O1, r=2.5, stroke=1pt, color=#gray
circle: center=O2, r=2, stroke=1pt, color=#gray
// 세 점을 잇는 삼각형 렌더링
poly: O1--O2--P, stroke=1.5pt, fill=#blue/10
// 각 꼭짓점 점 및 라벨 표시
dot: O1"O_1"(sw), O2"O_2"(se), P"P"(n)이 코드는 두 원의 크기와 중심 거리에 의해 결정되는 위쪽 교점 P를 오차 없이 찾아내고, 두 중심점과 함께 파란색 음영이 들어간 삼각형을 깨끗하게 렌더링합니다.