# Mathit Full Technical Documentation Corpus --- # Document: README (Category: 개요) URL: https://mathit-docs.pages.dev/README.html # mathit-document --- # Document: 개발자의 한마디 (Category: 들어가기 전에) URL: https://mathit-docs.pages.dev/0 들어가기 전에/개발자의 한마디.html 안녕하세요! 매스잇 개발자 페이너린입니다. ## 왜 오픈소스가 아닌가? AI가 소스코드를 훔쳐갈 가능성이 높아서요. ## 그래서 유지보수는 잘 될것인가? 네 당연하죠 ## 설계철학이 있다면? 개인적으로 프로그래밍의 본질은 선언이라고 생각합니다. 명령이 아니라요. 거기서 나온 언어입니다. ## 오류가 있으면? feynerin@gmail.com으로 제보 주세요. 최대한 고칠게요. ## 문법에 건의사항이 있다면? 역시 feynerin@gmail.com으로 주십쇼. ## 수학을 몰라도 배울수있나? 흠 당연히 배울수 있겠지만 노력을 해야 되겠죠 ## 개발자가 아닌데 왜 문서에 개발언어가 등장하나!! 제가 개발자기에 아무래도 개발언어가 편하여서 적었으나, 당연히 아래에 풀어설명 해놨고 AI에게 질문하면 매우 쉽게 배우실수 있습니다. ## 아니 그래서 지금 내가 쓸수 있나? 네 쓸수 있습니다. 기능 자체는 모두 구현이 돼 있고 지금 최적화 하고 있는데, 최적화할게 거의 없더라구요 걍 쓰시면 됩니다. ## TikZ보다는 쉽나? 예 확실히 쉬울 겁니다. ## 전체가 쉽나? 네 쉽긴 쉬운데 뒷 개념은 수학을 아셔야 쉽습니다. ## 한마디 남기자면? 간밧떼 쿠다사이 --- # Document: 식별자 규칙 (Category: 기초 개념) URL: https://mathit-docs.pages.dev/1 기초 개념/1.1 식별자 규칙.html # 1.1 식별자 규칙 Mathit 파서는 변수 이름의 첫 글자 대소문자를 보고 해당 데이터가 시각적 형태를 가진 기하 객체인지, 수치 계산에 쓰이는 스칼라 값인지 즉시 판별합니다. 이 규칙은 단순한 코딩 스타일 권장 사항이 아니라 문법 오류를 결정하는 강제 규약입니다. ## 대문자 식별자 알파벳 대문자로 시작하는 이름은 화면에 그려질 수 있는 형태를 가진 기하학적 객체에만 사용합니다. 점, 선분, 원, 다각형, 베지에 곡선, 3D 입체 등이 모두 여기에 해당합니다. ```mathit A = (1, 2) P1 = (3, 5) Circ = circle(center=A, r=2) Poly = poly(A--B--C) BaseLine = line(A--B) ``` 대문자로 선언된 객체는 고유한 기하학적 좌표 정보를 가지며, `--` 연결 연산자를 통해 다른 점과 이어지거나 `poly:`, `line:` 같은 렌더링 지시어의 대상이 될 수 있습니다. 만약 점의 좌표를 정의하면서 소문자로 시작하면, 파서는 이를 화면에 렌더링 가능한 점 객체로 등록하지 않습니다. ## 소문자 식별자 알파벳 소문자로 시작하는 이름은 크기와 수치 값만 가진 스칼라, 파라미터, 수학 함수에 사용합니다. ```mathit r = 3.5 len = 10 alpha = 45deg f(x) = x^2 - 2*x + 1 g(t) = 2*cos(t) ``` 소문자로 정의된 식별자는 다른 계산식의 파라미터로 대입되거나 기하 함수의 인자로 전달될 수는 있지만, 그 자체로 선을 연결하거나 꼭짓점 라벨을 달 수는 없습니다. ## 잘못된 식별자 사용 사례 식별자 규칙을 어겼을 때 발생하는 문제들을 확인합니다. 첫 번째는 점을 소문자로 선언하는 경우입니다. ```mathit // 잘못된 코드 p = (2, 3) q = (5, 3) line: p--q ``` 위 코드는 오류를 일으킵니다. `p`와 `q`는 소문자로 시작하여 단순 2차원 수치 순서쌍으로 파싱되었기 때문에, 기하 연결 연산자 `--`를 사용할 수 없습니다. 반드시 `P`, `Q`와 같이 대문자로 선언해야 합니다. 두 번째는 수치 변수를 대문자로 선언하는 경우입니다. ```mathit // 잘못된 코드 Radius = 5 C = circle(center=(0,0), r=Radius) ``` 수치 변수를 대문자로 시작하면 파서의 기하 객체 테이블에 등록을 시도하다가 좌표 데이터가 없는 스칼라 값이 들어와 경고가 발생하거나 타입 불일치 에러를 냅니다. 반지름, 각도, 길이와 같은 수치 파라미터는 `radius = 5`처럼 반드시 소문자로 시작해야 합니다. ## 이름 표기 규칙 식별자에는 알파벳, 숫자, 밑줄(`_`)을 조합하여 사용할 수 있습니다. 단, 숫자로 이름을 시작할 수는 없습니다. 올바른 표기: `P1`, `Point_A`, `Circ_sub`, `len_x`, `theta_1` 잘못된 표기: `1P`, `2_Point`, `my-len` (하이픈은 뺄셈 연산자로 처리됨) --- # Document: 캔버스와 뷰포트 설정 (Category: 기초 개념) URL: https://mathit-docs.pages.dev/1 기초 개념/1.2 캔버스와 뷰포트 설정.html # 1.2 캔버스와 뷰포트 설정 문서의 맨 위에 `@` 기호로 시작하는 전역 설정 블록을 작성하여 렌더링 영역의 물리적 크기, 좌표계의 범위, 인쇄 해상도를 통제합니다. ## 2D 좌표 범위 설정 `@view` 지시어는 화면에 노출할 2차원 좌표계의 가로 범위와 세로 범위를 지정합니다. ```mathit @view: [-5, 5], [-3, 7] ``` 앞의 대괄호 `[-5, 5]`는 가로축의 최소값과 최대값을 의미하고, 뒤의 대괄호 `[-3, 7]`은 세로축의 최소값과 최대값을 의미합니다. `@view`를 작성하지 않으면 Mathit은 코드 내에 선언된 모든 도형이 한 화면에 들어오도록 뷰포트를 자동으로 계산합니다. 하지만 시험 문제나 교재 삽화처럼 여백을 일정하게 유지해야 하거나, 함수의 특정 구간만을 의도적으로 잘라 보여주어야 할 때는 반드시 `@view`를 명시적으로 고정해야 합니다. ```mathit @view: [-1, 6], [-1, 4] A = (0, 0) B = (4, 0) C = (2, 3) poly: A--B--C ``` 위와 같이 범위를 고정하면 삼각형 주변에 사방으로 일정한 여백이 생겨나며, 축이나 라벨이 캔버스 모서리에 잘려 나가는 현상을 방지할 수 있습니다. ## 인쇄 규격과 해상도 `@canvas` 지시어는 출력될 이미지의 실제 물리적 크기와 인쇄 품질을 설정합니다. ```mathit @canvas: width=120mm, height=90mm, dpi=300 ``` `width`와 `height`에는 밀리미터(`mm`), 센티미터(`cm`), 포인트(`pt`), 픽셀(`px`) 단위를 사용할 수 있습니다. 교재나 시험지 인쇄를 목적으로 한다면 밀리미터 단위로 작업 크기를 지정하는 것이 가장 직관적입니다. `dpi`는 인치당 도트 수를 의미하는 해상도 설정입니다. 기본값은 화면 표시용인 96이지만, 인쇄 출판용 벡터 또는 래스터 이미지를 추출할 때는 `dpi=300` 이상을 지정하여 라벨과 얇은 선이 깨지지 않도록 출력 품질을 확보합니다. ## 3D 카메라 기본 설정 3차원 입체 도형을 다룰 때 시점과 투영 방식을 전역으로 선언합니다. ```mathit @3d: cam(elev=30deg, azim=45deg, dist=10, proj=oblique) ``` `elev`는 바닥면에서 위로 올려다보거나 내려다보는 앙각이며, `azim`은 방위각으로 좌우 회전 각도를 뜻합니다. `dist`는 물체로부터 카메라까지의 거리입니다. `proj`는 투영 방식을 결정합니다. 중고등 교과서 입체도형 삽화에서 평행선이 유지되는 사선 투영을 쓸 때는 `oblique`, 축 측정이 균일한 등각 투영을 쓸 때는 `iso`, 원근감을 사실적으로 살릴 때는 `persp`를 지정합니다. ## 예제 실제 문제집 삽화를 제작할 때 문서 최상단에 배치하는 표준 구성은 다음과 같습니다. ```mathit @canvas: width=80mm, height=60mm, dpi=300 @view: [-2, 6], [-1, 5] axis: x, y, O ``` --- # Document: 수치, 단위, 연산 (Category: 기초 개념) URL: https://mathit-docs.pages.dev/1 기초 개념/1.3 수치, 단위, 연산.html # 1.3 수치, 단위, 연산 Mathit은 수학적 표기 관례를 계산 엔진에 그대로 반영합니다. 단위의 종류와 연산 우선순위의 차이를 이해해야 수식이나 기하 파라미터를 정확히 지정할 수 있습니다. ## 단위 리터럴 숫자 바로 뒤에 공백 없이 단위 표기를 붙여 고유한 물리적 의미를 부여합니다. 출력 크기 단위로는 `10mm`, `15pt`, `20px` 등이 사용됩니다. 이 단위들은 도형의 선 두께(`stroke=1.5pt`), 각도 호의 반지름(`r=12pt`), 치수선의 이격 거리(`off=-10pt`)처럼 인쇄물 위의 절대적인 크기를 지정할 때 쓰입니다. 반면 `A = (3, 4)`처럼 점을 정의할 때 쓰는 숫자는 단위가 없는 순수 논리 좌표계 수치입니다. 각도 단위로는 `45deg`, `1.5rad`, `2pi`가 사용됩니다. 각도를 나타낼 때는 반드시 도 단위를 뜻하는 `deg`를 붙여야 합니다. `30`이라고만 적으면 라디안 수치로 계산되어 의도와 완전히 다른 각도가 그려지므로 주의해야 합니다. 내장 상수 `pi`는 원주율 수치 자체이므로 `pi/3`처럼 라디안 계산식에 바로 활용할 수 있습니다. ## 음수 거듭제곱 연산 순서 일반 프로그래밍 언어와 Mathit의 가장 큰 차이점 중 하나는 음수 기호와 거듭제곱 연산자의 결합 우선순위입니다. 대다수 코딩 언어에서는 `-x^2`를 계산할 때 거듭제곱보다 단항 음수 연산의 순위를 헷갈려 의도치 않은 결과가 나오곤 합니다. 하지만 Mathit은 엄격한 수학 표기법을 준수합니다. ```mathit f(x) = -x^2 + 4 ``` 위 식은 사용자가 괄호를 치지 않아도 내부적으로 `-(x^2) + 4`로 계산됩니다. 따라서 $x=3$을 대입하면 $(-3)^2 = 9$가 아니라 $-(3^2) = -9$가 되어 최종 결과는 $-5$가 나옵니다. 만약 밑 자체에 음수를 포함하고 싶다면 반드시 괄호를 묶어 `(-x)^2` 또는 `(-3)^2`로 명시해야 합니다. ## 곱셈 기호 생략 규칙 수학식에서 통용되는 곱셈 생략 표현을 기본적으로 지원합니다. 숫자와 변수가 연달아 붙어 있는 경우 파서는 이를 곱셈으로 자동 인식합니다. `2x`는 `2*x`로, `3(a + b)`는 `3*(a + b)`로, `4pi`는 `4*pi`로 처리됩니다. 단, 변수와 변수가 붙어 있는 `ab`는 두 글자짜리 새로운 변수 이름으로 파싱되므로, 서로 다른 두 변수를 곱할 때는 반드시 `a*b`처럼 명시적 곱셈 연산자를 사용해야 합니다. ## 특수 연산자 모음 기하 구조를 정의하기 위해 사용되는 전용 연산자들입니다. 첫째, `--` 연산자는 2D 평면 기하에서 두 점을 직선 경로로 연결합니다. 다각형, 선분, 꺾은선을 만들 때 사용합니다. ```mathit path = A--B--C ``` 둘째, `---` 연산자는 이산수학의 네트워크 그래프에서 방향성이 없는 노드 간의 간선을 정의할 때 사용합니다. ```mathit graph: { A --- B; B --- C } ``` 셋째, `..` 연산자는 연속적인 범위나 닫힌 구간을 지정합니다. 함수의 정의역 구간을 한정하거나, 원호의 각도 구간을 정할 때 씁니다. ```mathit x in -2..4 ang_range = 0deg..90deg ``` 넷째, `++` 연산자는 서로 다른 두 개 이상의 경로 리스트를 하나의 긴 곡선 데이터로 결합할 때 사용합니다. ```mathit CombinedPath = path1 ++ path2 ``` 다섯째, `?` 연산자는 역기하 제약 조건 블록에서 값을 모르는 미지수를 지정할 때 사용합니다. 이 연산자는 연립 방정식 풀이 엔진에 의해 수학적으로 수렴 계산됩니다. ```mathit B = (?, 0) ``` --- # Document: 색상과 텍스쳐 (Category: 기초 개념) URL: https://mathit-docs.pages.dev/1 기초 개념/1.4 색상과 텍스쳐.html # 1.4 색상과 텍스쳐 시험지 삽화는 주로 흑백 명암과 회색 톤을 사용하고, 해설지나 전자 교재는 다양한 색상을 사용합니다. Mathit은 이 두 환경 모두에서 일관된 방식으로 작동하는 색상 표기 체계를 갖추고 있습니다. ## 기본 색상명과 Hex 코드 이름이 미리 정해진 내장 색상명을 따옴표 없이 그대로 쓸 수 있습니다. 지원되는 기본 색상은 `red`, `blue`, `green`, `black`, `white`, `gray`, `orange`, `purple`, `cyan`입니다. 디자인 요구에 맞춰 정밀한 색을 지정해야 할 때는 웹 표준인 6자리 16진수 코드를 샵(`#`) 기호와 함께 적습니다. ```mathit poly: A--B--C, stroke=#1e293b, fill=#e2e8f0 ``` ## 투명도 슬래시 표기법 Mathit 색상 문법의 가장 독특하고 유용한 기능은 슬래시(`/`)를 이용한 투명도 제어입니다. 복잡한 수치 코드나 별도의 투명도 옵션을 찾을 필요 없이, 색상명이나 16진수 코드 바로 뒤에 슬래시와 함께 백분율 숫자를 붙입니다. ```mathit fill=#blue/20 stroke=#black/60 fill=#3b82f6/15 ``` `#blue/20`은 파란색을 20퍼센트의 불투명도로 연하게 칠하라는 의미입니다. 숫자가 작을수록 투명해져 배경이 비치며, 100에 가까울수록 진해집니다. 수학 문제지에서 두 곡선이 겹치는 넓이를 표시하거나, 원과 다각형의 교집합 영역에 옅은 음영을 넣을 때 주로 사용됩니다. 투명도가 적용된 영역들이 서로 겹쳐지면 교집합 부분이 자연스럽게 더 짙은 명암으로 표현됩니다. ## 스트로크와 필의 분리 도형을 칠할 때는 외곽선을 담당하는 `stroke`와 내부 면을 담당하는 `fill`을 분리하여 생각해야 합니다. 외곽선 없이 내부 면만 부드럽게 칠하고 싶다면 `stroke=none`을 주거나 채우기 전용 지시어인 `fill:`을 사용합니다. ```mathit // 외곽선 없이 면만 칠하기 fill: poly(A--B--C), fill=#gray/20 // 외곽선은 검은색 진한 선으로, 내부는 연한 파란색으로 칠하기 poly: A--B--C, stroke=1.5pt, color=#black, fill=#blue/10 ``` 색상 지시어에서 `color=`는 기본적으로 외곽선 색상을 변경하며, `stroke=`는 선의 굵기와 스타일을 지정합니다. 면의 색상은 반드시 `fill=` 옵션으로 제어합니다. --- # Document: 점과 좌표계 다루기 (Category: 2D 평면기하) URL: https://mathit-docs.pages.dev/2 2D 평면기하/2.1 점과 좌표계 다루기.html ## 2.1 점과 좌표계 다루기 평면 위의 모든 도형은 점으로부터 출발합니다. Mathit은 가로와 세로 위치를 기준으로 하는 직교좌표와 거리 및 회전각을 기준으로 하는 극좌표를 동일한 수준의 기하 객체로 처리합니다. ## 직교좌표 정의 직교좌표는 소괄호 안에 가로 위치와 세로 위치를 쉼표로 구분하여 선언합니다. ```mathit A = (0, 0) B = (4, 0) C = (-2.5, 3.8) D = (2 + sqrt(3), 1/2) ``` 정수와 소수뿐만 아니라 `sqrt()` 같은 제곱근이나 분수 사칙연산 표현식도 좌표값으로 직접 넣을 수 있습니다. 계산된 결과는 실수 좌표로 환산되어 평면 위에 정확히 배치됩니다. ## 극좌표 정의 원점을 기준으로 일정한 거리만큼 떨어져 있고 특정 각도를 이루는 점을 찍을 때는 극좌표 문법을 사용합니다. 소괄호 안에 거리 변수 `r`과 각도 변수 `theta`를 대입합니다. ```mathit P1 = (r=3, theta=45deg) P2 = (r=5, theta=2*pi/3) ``` 각도에는 육십분법 단위인 `deg`를 붙이거나, 호도법 수치인 라디안을 실수 혹은 `pi`를 조합하여 적을 수 있습니다. 정다각형의 꼭짓점이나 원 위의 특정 지점을 잡을 때 삼각함수 값을 직접 계산하지 않고 각도만 명시하면 되므로 작도 과정이 대폭 단축됩니다. ## 벡터와 점의 변위 연산 평면 위의 위치를 나타내는 점과 방향 및 크기를 나타내는 벡터는 밀접하게 연동됩니다. `vec()` 함수는 순수 벡터 객체를 생성합니다. ```mathit u = vec(3, 1) ``` 점과 점을 빼면 두 점 사이의 방향과 거리를 담은 변위 벡터가 생성됩니다. ```mathit A = (1, 2) B = (4, 6) v = B - A ``` 이 연산에서 `v`는 점 A에서 점 B로 향하는 벡터 `(3, 4)`가 됩니다. 반대로 기준 점에 벡터를 더하여 새로운 점을 생성하는 평행이동도 직관적으로 작성할 수 있습니다. ```mathit C = A + u D = B + v * 0.5 ``` `A + u`는 점 A의 좌표에서 벡터 `u`의 성분만큼 평행이동한 새로운 점 C를 반환합니다. `v * 0.5`처럼 벡터에 실수를 곱해 길이를 조절한 뒤 점에 더하는 연산도 유효합니다. --- # Document: 연결 연산자와 기본 도형 (Category: 2D 평면기하) URL: https://mathit-docs.pages.dev/2 2D 평면기하/2.2 연결 연산자와 기본 도형.html # 2.2 연결 연산자와 기본 도형 점들이 정의되면 이를 화면에 시각화하기 위해 연결 연산자와 도형 지시어를 조합합니다. ## 선분 연결 연산자 `--` 연산자는 두 개 이상의 점을 일직선으로 잇는 기하 경로를 만듭니다. ```mathit line: A--B, thick=2pt, color=#black ``` `line:` 지시어는 지정된 경로를 화면에 출력합니다. 옵션을 통해 선의 스타일을 변경할 수 있습니다. `thick`은 선의 두께를 지정하며, 점선을 표현할 때는 `dash` 옵션에 그어질 길이와 빈 공간의 길이를 묶어 전달합니다. ```mathit line: C--D, stroke=1pt, dash=(4pt, 2pt) ``` 이 코드는 4포인트 길이의 선과 2포인트 길이의 여백이 반복되는 점선을 렌더링합니다. ## 다각형 지시어 닫힌 다각형을 그릴 때는 `poly:` 지시어를 사용합니다. ```mathit poly: A--B--C--D, stroke=1.5pt, fill=#red/10 ``` `poly:`는 나열된 점들을 순서대로 연결한 후, 마지막 점 D와 첫 점 A를 자동으로 닫힌 선으로 이어 내부 영역을 생성합니다. 면에 색을 넣지 않고 외곽선만 그릴 때는 `fill` 옵션을 생략하면 됩니다. 정다각형을 그릴 때는 꼭짓점을 일일이 계산할 필요 없이 `regular_poly()` 함수를 활용합니다. ```mathit poly: regular_poly(center=(0,0), r=3, n=6), rot=15deg, stroke=1.2pt ``` `center`는 외접원의 중심, `r`은 외접원 반지름, `n`은 변의 개수입니다. `rot` 옵션을 통해 전체 다각형을 특정 각도만큼 회전시켜 배치할 수 있습니다. ## 원과 타원 지시어 원은 중심과 반지름을 지정하거나, 지름의 양 끝점을 지정하여 그립니다. ```mathit // 중심과 반지름으로 정의 circle: center=A, r=3 // 두 점을 지름으로 하는 원 정의 circle: diam=B--C, stroke=1.2pt, stroke=dash ``` 타원은 중심 좌표와 함께 가로 반지름 `rx`, 세로 반지름 `ry`, 그리고 회전 각도 `rot`를 부여합니다. ```mathit ellipse: center=(0, 0), rx=4, ry=2, rot=30deg, stroke=1.5pt ``` ## 원호와 베지에 곡선 원의 일부인 호를 그릴 때는 `arc()` 함수를 `draw:` 지시어와 함께 호출합니다. ```mathit draw: arc(center=(0,0), r=2, 30deg..120deg), stroke=1.5pt ``` 마지막 인자에 `..` 범위 연산자를 사용하여 시작 각도와 끝 각도를 지정합니다. 복잡한 유선형 곡선이나 부드러운 연결선은 제어점을 이용하는 3차 베지에 곡선 문법인 `path:`를 사용합니다. ```mathit path: A .. controls(C1, C2) .. B, stroke=2pt ``` 이 문법은 점 A에서 출발하여 제어점 C1과 C2의 곡률 유도를 받아 점 B에 도달하는 매끄러운 곡선을 렌더링합니다. --- # Document: 기하 내장 계산 엔진 (Category: 2D 평면기하) URL: https://mathit-docs.pages.dev/2 2D 평면기하/2.3 기하 내장 계산 엔진.html # 2.3 기하 내장 계산 엔진 작도 문제를 코딩할 때 좌표를 손수 삼각비로 계산하는 것은 비효율적입니다. Mathit은 교과서 기하학에 등장하는 핵심 위치 계산을 함수 형태로 내장하고 있습니다. ## 중점과 내분점 두 점의 정가운데 위치는 `mid()` 함수로 구합니다. ```mathit M = mid(A, B) ``` 선분을 특정 비율로 분할하는 점은 `on()` 함수를 사용합니다. ```mathit P = on(A--B, 1/3) ``` 두 번째 인자에는 선분 AB의 전체 길이를 1로 보았을 때 점 A로부터 떨어진 비율을 적습니다. `1/3`을 입력하면 선분 AB를 1대 2로 내분하는 점이 계산됩니다. 만약 1보다 큰 값을 넣으면 B 방향의 외분점이 되고, 음수를 넣으면 A의 바깥쪽 연장선 위에 점이 놓입니다. ## 선분의 연장선 선분을 지정한 길이만큼 바깥으로 늘인 위치를 찾을 때는 `ext()` 함수를 사용합니다. ```mathit P_ext = ext(A--B, len=2) ``` 이 코드는 점 A에서 시작하여 B를 통과하는 반직선 방향으로, 점 B로부터 정확히 2만큼 더 나아간 위치의 점을 반환합니다. 보조선을 긋거나 도형 바깥에 외각 표기를 위한 여백 점을 만들 때 유용합니다. 기준점 순서가 반대인 `ext(B--A, len=2)`를 적으면 점 A의 바깥쪽으로 연장된 점이 생성됩니다. ## 수선의 발과 선대칭 외부의 한 점에서 특정 직선에 수직으로 내린 점은 `proj()` 함수로 구합니다. ```mathit H = proj(P, A--B) ``` 점 P에서 직선 AB에 내린 수선의 발 좌표가 정확히 계산되어 H에 할당됩니다. 직각삼각형의 높이나 삼수선의 정리 문제를 구성할 때 필수적으로 쓰입니다. 특정 직선을 기준으로 점을 완전히 반대편으로 대칭 이동시킬 때는 `reflect()` 함수를 씁니다. ```mathit P_mirror = reflect(P, A--B) ``` 선분 AB를 거울면으로 삼아 점 P와 완벽한 대칭 위치에 있는 점을 찾아냅니다. 종이접기 문항이나 최단거리 반사 문제를 구현할 때 좌표 계산 없이 곧바로 점을 얻을 수 있습니다. ## 회전 변환과 각의 이등분선 평면 위의 점을 회전시킬 때는 `rot()` 함수를 사용합니다. ```mathit P_rot = rot(P, 45deg, center=C) ``` 점 P를 중심점 C를 기준으로 반시계 방향으로 45도 회전시킨 위치를 반환합니다. `center` 파라미터를 생략하면 좌표평면의 원점 `(0, 0)`을 기준으로 회전합니다. 각의 이등분선을 구할 때는 `bisect()` 함수를 씁니다. ```mathit Ray = bisect(A--B--C) ``` 세 점이 이루는 각 B를 정확히 반으로 가르는 반직선 객체를 생성합니다. 이 반직선은 후술할 교점 함수와 결합하여 대변과의 교점을 찾는 데 사용됩니다. --- # Document: 삼각형의 7대 심 (Category: 2D 평면기하) URL: https://mathit-docs.pages.dev/2 2D 평면기하/2.4 삼각형의 7대 심.html # 2.4 삼각형의 7대 심 삼각형의 여러 중심점과 관련 수치는 중고등 수학 문제의 핵심 단골 소재입니다. Mathit은 작도 계산식 없이 꼭짓점 세 개만 넘기면 각 중심점과 반지름을 즉시 추출하는 전용 함수군을 제공합니다. ## 내심과 내접원 내심은 세 내각의 이등분선이 만나는 교점입니다. ```mathit I = incenter(A, B, C) r_in = inradius(A, B, C) circle: center=I, r=r_in, stroke=1pt, color=#blue ``` `incenter()` 함수는 내심 점을 반환하고, `inradius()` 함수는 내접원의 반지름 길이를 스칼라 수치로 반환합니다. 이를 이용해 위와 같이 내접원을 완벽하게 작도할 수 있습니다. ## 외심과 외접원 외심은 세 변의 수직이등분선이 만나는 교점입니다. ```mathit O = circumcenter(A, B, C) r_out = circumradius(A, B, C) circle: center=O, r=r_out, stroke=1pt, color=#red ``` `circumcenter()`는 외심의 위치를, `circumradius()`는 외접원의 반지름을 구합니다. 둔각삼각형인 경우 외심 O가 삼각형 외부에 자동으로 정확히 찍힙니다. ## 무게중심과 수심 세 중선의 교점인 무게중심과 세 꼭짓점에서 대변에 내린 수선의 교점인 수심을 구합니다. ```mathit G = centroid(A, B, C) H = orthocenter(A, B, C) line: A--mid(B, C), stroke=0.8pt, dash=(3pt, 2pt) dot: G"G"(ne), H"H"(nw) ``` 무게중심 `G`는 세 점 좌표의 산술 평균값과 일치하며, 중선과 결합하여 2대 1 내분 관계를 설명하는 도식에 쓰입니다. 수심 `H` 역시 예각, 직각, 둔각 여부에 따라 내부 또는 외부의 올바른 기하 위치를 산출합니다. ## 방심과 방접원 방심은 한 내각의 이등분선과 다른 두 외각의 이등분선이 만나는 점으로, 삼각형 하나당 세 개가 존재합니다. Mathit에서는 어느 꼭짓점의 대변 쪽에 위치한 방심인지를 지정하기 위해 `on=` 옵션을 사용합니다. ```mathit J_a = excenter(A, B, C, on=A) ``` `on=A`를 전달하면 꼭짓점 A의 마주보는 변 바깥쪽에 위치한 방심을 찾아냅니다. 점 B나 점 C를 마주보는 방심을 구할 때는 각각 `on=B`, `on=C`를 대입합니다. --- # Document: 교점 탐색기 (Category: 2D 평면기하) URL: https://mathit-docs.pages.dev/2 2D 평면기하/2.5 교점 탐색기.html # 2.5 교점 탐색기 도형과 도형이 만나는 지점을 찾는 교점 연산은 기하 그래픽의 핵심입니다. 직선과 원, 원과 원, 곡선과 곡선은 여러 개의 교점을 가질 수 있으므로, 원하는 교점을 정확하게 골라내는 네 가지 필터링 기법을 반드시 숙지해야 합니다. ## 배열 구조분해 할당 교점이 여러 개 발생하는 것이 확실할 때 대괄호 문법으로 여러 변수에 동시에 나누어 담는 방식입니다. ```mathit C1 = circle(center=(0,0), r=3) L1 = line((-4, -1)--(4, 1)) [P1, P2] = isect(C1, L1) ``` Mathit은 발견된 교점들을 가로 좌표가 작은 순서대로 정렬합니다. 만약 가로 좌표가 같다면 세로 좌표가 작은 순서대로 정렬됩니다. 따라서 `P1`에는 왼쪽 교점이, `P2`에는 오른쪽 교점이 자동으로 담기게 됩니다. ## 근접 점 기준 필터링 수많은 교점 중 특정 기준점에 가장 가까운 교점 하나만을 선택할 때 사용합니다. ```mathit RefPoint = (3, 2) P = isect(C1, L1, near=RefPoint) ``` 복잡한 다각형이나 원호가 뒤엉켜 교점의 순서를 가늠하기 어려울 때 매우 유용합니다. 대략적인 기준 위치를 `near=` 뒤에 지정하면, 두 교점 중 해당 위치와 유클리드 거리가 가장 가까운 점 하나가 반환됩니다. ## 부등식 조건식 필터링 좌표의 범위 조건을 부등식으로 직접 명시하여 해를 거르는 방식입니다. ```mathit P_upper = isect(Curve1, Curve2, y > 0) P_right = isect(Circle1, Line1, x >= 2) ``` 교점 함수 내부의 세 번째 인자에 `y > 0`과 같은 논리식을 전달합니다. 이를 통해 사분면 조건이나 특정 좌표축 위쪽의 점만을 명확하게 한정하여 변수에 대입할 수 있습니다. 조건에 맞는 점이 하나뿐이라면 점 객체가 바로 반환됩니다. ## 순번/방향 태그 필터링 가장 직관적인 방식으로, 위치 관계를 나타내는 예약어 태그를 샵(`#`) 기호와 함께 부여합니다. 지원되는 태그는 순번을 나타내는 `#1`, `#2`와 공간 방향을 나타내는 `#top`, `#bottom`, `#left`, `#right`입니다. ```mathit // 두 원의 교점 중 위쪽에 위치한 점 선택 P_top = isect(Circle1, Circle2, #top) // 아래쪽 교점 선택 P_bot = isect(Circle1, Circle2, #bottom) ``` `#top`은 세로 좌표가 더 큰 점을, `#left`는 가로 좌표가 더 작은 점을 즉시 골라냅니다. 기하학 문제를 코딩할 때 위쪽 교점, 왼쪽 교점이라는 문제지 발문을 그대로 코드로 직결시킬 수 있는 가장 간결한 방법입니다. ## 예제 배운 내용을 종합하여 두 원의 교점을 구하고, 그 교점과 중심점을 연결하는 삼각형을 구성해 봅니다. ```mathit @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를 오차 없이 찾아내고, 두 중심점과 함께 파란색 음영이 들어간 삼각형을 깨끗하게 렌더링합니다. --- # Document: 좌표축과 모눈종이 셋팅 (Category: 주석과 스타일링) URL: https://mathit-docs.pages.dev/3 주석과 스타일링/3.1 좌표축과 모눈종이 셋팅.html # 3.1 좌표축과 모눈종이 세팅 좌표축과 모눈은 함수의 그래프나 기하 도형의 기준 좌표를 제시할 때 사용합니다. 시험지 스타일에 맞춰 화살표의 형태, 특정 축 구간의 생략, 사용자 정의 눈금 라벨을 정밀하게 제어할 수 있습니다. ## 기본 축과 원점 표시 가장 단순한 형태의 좌표축은 `axis:` 지시어에 가로축과 세로축, 그리고 원점 기호를 나열하는 것입니다. ```mathit axis: x, y, O ``` 이 코드는 양 끝에 화살표가 달린 직교좌표축을 생성하고, 가로축 끝에는 $x$, 세로축 끝에는 $y$, 축의 교점에는 원점 $O$ 라벨을 배치합니다. ## 축 범위와 라벨 커스텀 물리 그래프나 특정 변수를 사용하는 문항에서는 축의 명칭을 바꾸거나 표시 범위를 명시적으로 한정해야 합니다. 축 이름 뒤에 대괄호를 붙여 표시 구간과 라벨을 지정합니다. ```mathit axis: x[-2..10, label="$t$(s)"], y[-5..15, label="$v$(m/s)"], O=(0,0) ``` 가로축의 범위를 $-2$부터 $10$까지로 지정하고 끝에 시간 라벨 $t$(s)를 부여했습니다. 세로축 역시 속도 라벨 $v$(m/s)로 교체되었습니다. `O=(0,0)`을 명시하여 원점 기호가 배치될 위치를 지정할 수도 있습니다. ## 축 생략 물결선 함수 그래프가 원점에서 멀리 떨어진 위치에서 시작하거나, 중간에 불필요하게 긴 구간이 있을 때 교재에서 사용하는 지그재그 생략선을 넣습니다. ```mathit axis: x[0..100], y[0..50], O axis_break: x in 10..30, style=zigzag ``` `axis_break:` 지시어는 가로축 10부터 30 사이의 선분을 끊어내고 그 자리에 이중 지그재그 물결선을 삽입합니다. `style=zigzag` 외에도 두 개의 평행한 사선으로 끊는 `style=slash`를 사용할 수 있습니다. 이를 통해 캔버스 낭비 없이 핵심 데이터 구간만 축약하여 보여줄 수 있습니다. ## 커스텀 눈금 지정 자동으로 찍히는 정수 눈금 대신, 삼각함수나 무리수 좌표를 명시할 때는 `ticks:` 지시어를 사용합니다. ```mathit ticks: x[-pi="$- \pi $", 0="0", pi="$\pi$", 2*pi="$2\pi$"] ``` 대괄호 안에 눈금이 위치할 실수 값과 화면에 표시할 수식 문자열을 등호(`=`)로 연결하여 나열합니다. Mathit은 지정된 위치에 작은 눈금선을 긋고 그 아래에 주어진 수식 라벨을 중앙 정렬하여 인쇄합니다. 세로축의 눈금을 바꿀 때는 `y[...]` 형태로 쉼표 뒤에 이어 적습니다. ## 격자(모눈종이) 렌더링 모눈종이 형태의 배경은 `grid:` 지시어로 생성하며, 직교 격자, 극좌표 격자, 점 격자 세 가지 방식을 지원합니다. 첫째, 직교 격자입니다. ```mathit grid: cartesian, step=1, stroke=#gray/30, dash ``` 가로세로 1 간격으로 연한 회색의 점선 격자를 그립니다. 둘째, 점 격자입니다. 초등 및 중등 영재 문항에서 자주 쓰이는 도트 격자판을 만듭니다. ```mathit grid: dots, step=10mm, radius=1.5pt, color=#black/60 ``` 가로세로 10밀리미터 간격으로 반지름 1.5포인트 크기의 검은 점들을 바둑판 형태로 배열합니다. 셋째, 극좌표 격자입니다. 동심원과 방사선으로 구성되는 모눈을 그립니다. ```mathit grid: polar, step=1, ray_step=30deg, stroke=#gray/20 ``` --- # Document: 8방위 알아보기 (Category: 주석과 스타일링) URL: https://mathit-docs.pages.dev/3 주석과 스타일링/3.2 8방위 알아보기.html # 3.2 8방위 알아보기 기하 도판에서 가장 까다로운 작업은 점이나 선 위에 글자가 겹치지 않도록 글자의 배치 위치를 조절하는 일입니다. Mathit은 나침반의 8개 방위각을 기준점으로 삼는 8방위 앵커 시스템을 도입하여 텍스트를 배치합니다. ## 8방위 앵커의 구조 점이 찍힌 위치를 기준으로 라벨이 놓일 방향을 아래의 예약어로 지시합니다. ![8방위 이미지](/images/3-2-1.png) 정중앙을 뜻하는 `c`를 포함하여 총 9개의 위치 기준이 있습니다. 예를 들어 `ne`를 지정하면 글자의 좌측 하단 모서리가 기준점의 오른쪽 위로 오도록 밀어내어, 점의 중심과 텍스트가 겹치지 않도록 안전 여백을 둡니다. ## 라벨을 배치하는 세 가지 방식 문맥에 따라 세 가지 문법 중 가장 편리한 방식을 선택합니다. 첫째, 점 정의와 동시에 라벨을 부여하는 인라인 방식입니다. 가장 많이 쓰입니다. ```mathit dot: P"P"(nw), Q"Q_1"(se) ``` 점 P 위치에 검은 점을 찍고, 북서쪽에 문자 P를 표시합니다. 둘째, 독립 라벨 지시어를 사용하는 방식입니다. 도형의 특정 점이 아니라 임의의 좌표에 주석을 달 때 유용합니다. ```mathit label: (2.5, 4)"최댓값"(n) ``` 셋째, 곡선이나 함수를 그리면서 옵션 내부에서 직접 지정하는 방식입니다. ```mathit draw: f, label="$y=f(x)$"(ne) ``` 이 경우 함수의 오른쪽 끝점 부근에 접선의 기울기를 고려하여 자동으로 북동쪽 여백에 식 이름표가 배치됩니다. ## 수식 LaTeX 렌더링 규칙 모든 라벨 문자열 안에서 큰따옴표 내부에 달러 기호(`$`)를 넣으면 교재용 수식 모드로 작동합니다. ```mathit dot: A"$\alpha$"(sw), B"$A_k$"(se) label: (0, 3)"$S = \int_0^1 f(x)dx$"(e) ``` 그리스 문자, 윗첨자, 아랫첨자, 분수(`\frac{}{}`), 적분 기호 등을 완전하게 렌더링합니다. 한글과 수식을 혼용할 때는 `label: (1, 2)"점 $P$의 자취"(n)`와 같이 큰따옴표 안에서 자연스럽게 섞어 쓸 수 있습니다. --- # Document: 기호 지시어 (Category: 주석과 스타일링) URL: https://mathit-docs.pages.dev/3 주석과 스타일링/3.3 기호 지시어.html # 3.3 기호 지시어 수학 문제지의 기하 도형은 도형 자체의 선뿐만 아니라 각의 크기, 변의 동등성, 평행 관계를 표시하는 특수 기호가 반드시 결합됩니다. ## 각도 호와 좁은 각 인출선 세 점이 이루는 각을 표시할 때는 `ang:` 지시어를 사용합니다. 측정할 각의 꼭짓점을 항상 가운데에 둡니다. ```mathit ang: A--B--C, "$\theta$", r=15pt ``` 반지름 15포인트 크기의 각도 호가 그려지고, 호의 중앙 바깥쪽에 $\theta$ 라벨이 붙습니다. 각의 내부를 어둡게 칠해야 할 때는 `fill` 속성을 더합니다. ```mathit ang: A--B--C, fill=#gray/40, r=12pt ``` 각도가 10도나 20도처럼 매우 좁은 경우, 호와 글자가 겹쳐 알아보기 힘들어집니다. 이 때는 `pin` 옵션을 주어 밖으로 꺾인 화살표 인출선을 뽑아냅니다. ```mathit ang: A--B--C, "$15^\circ$", r=20pt, pin=w ``` 각도 호 내부에서 서쪽(`w`) 방향으로 화살표 지시선이 빠져나오며 그 끝에 $15^\circ$ 수식이 달립니다. 복잡한 수능 도형 문제 도판을 만들 때 겹침 현상을 해결하는 핵심 기능입니다. ## 직각 기호 직각 삼각형이나 수선의 발 위치에는 정사각형 모양의 직각 기호를 넣습니다. ```mathit right_ang: A--B--C, size=8pt ``` 가운데 위치한 점 B에 크기 8포인트의 직각 표시가 생성됩니다. 세 점이 실제로 이루는 각도가 90도가 아니더라도 지시어를 쓰면 강제로 직각 기호가 투영되어 그려집니다. ## 선분 길이 합동 표시 길이가 같은 선분임을 나타내는 짧은 수직 눈금선은 `tick:` 지시어로 그립니다. ```mathit // 선분 하나에 단일 눈금(|) tick: A--B, count=1, size=6pt // 두 선분에 이중 눈금(||) 동시 적용 tick: B--C, D--E, count=2, size=6pt, space=2pt ``` `count`는 눈금선의 개수입니다. 1을 주면 외눈금, 2를 주면 쌍눈금이 선분의 정중앙에 수직 방향으로 교차하여 배치됩니다. `space`는 쌍눈금 사이의 간격을 조절합니다. ## 평행 화살표 표시 마주 보는 두 변이 평행함을 알리는 화살표 깃발 기호는 `arrow_mark:` 지시어를 씁니다. ```mathit arrow_mark: A--B, D--C, count=1 arrow_mark: A--D, B--C, count=2 ``` 선분의 중간 지점에 진행 방향을 가리키는 화살촉 기호가 삽입됩니다. 평행사변형이나 사다리꼴 문항에서 한 쌍의 대변에는 단일 화살표(`count=1`), 다른 쌍에는 이중 화살표(`count=2`)를 달아 평행 관계를 직관적으로 표현합니다. ## 치수선 변의 길이 수치를 선분 바깥쪽에 화살표와 함께 표시하는 치수선 문법입니다. 첫째, 직선형 평행 치수선입니다. ```mathit dim: A--B, "10cm", off=-15pt, arrow=both ``` 선분 AB와 평행한 치수선이 15포인트 바깥으로 이격되어 생성되며, 양 끝에 화살표가 달리고 가운데에 "10cm" 라벨이 들어갑니다. `off` 값이 양수이면 진행 방향의 왼쪽, 음수이면 오른쪽으로 배치됩니다. 둘째, 문제지 스타일의 곡선형 치수선입니다. ```mathit dim: A--B, "$x$", curve=0.2 ``` 치수선이 직선 대신 부드러운 호를 그리며 배를 불리는 형태로 나타납니다. 시험지 기하 문제에서 특정 변의 길이를 미지수 $x$로 둘 때 가장 흔히 사용되는 형태입니다. --- # Document: 영역 채우기와 빗금 패턴 (Category: 주석과 스타일링) URL: https://mathit-docs.pages.dev/3 주석과 스타일링/3.4 영역 채우기와 빗금 패턴.html # 3.4 영역 채우기와 빗금 패턴 시험지는 대다수 흑백으로 인쇄되므로 면을 구분할 때 색상 대신 빗금 패턴을 필수적으로 사용합니다. `shade:` 지시어는 단색 면 채우기뿐만 아니라 정밀한 선형 빗금과 교차 빗금을 생성합니다. ## 단색 반투명 면 채우기 가장 기초적인 영역 강조 방식으로, 도형의 내부를 연한 단색조로 채웁니다. ```mathit shade: poly(A--B--C), fill=#black/10 ``` 10퍼센트 명도의 검은색으로 삼각형 내부를 칠합니다. 컬러 교재를 편집할 때는 `fill=#blue/15`처럼 옅은 색조를 부여합니다. ## 선형 빗금 패턴 특정 각도로 기울어진 평행선들을 일정한 간격으로 채워 넣습니다. ```mathit shade: poly(A--B--C), hatch=(45deg, step=2mm), stroke=0.8pt ``` `hatch` 속성에 빗금의 각도와 간격을 순서대로 묶어 전달합니다. `45deg`는 빗선이 기울어질 각도이며, `step=2mm`는 선과 선 사이의 물리적 거리입니다. `stroke=0.8pt`는 빗금을 이루는 선들의 굵기를 뜻합니다. 수학 시험지의 기본 빗금은 45도 각도에 간격 1.5mm에서 2mm 사이가 시각적으로 가장 안정적입니다. ## 격자 교차 빗금 두 방향의 빗선이 서로 교차하는 그물망 형태의 패턴을 만듭니다. ```mathit shade: poly(A--B--C--D), pattern=crosshatch(step=3mm), stroke=0.5pt, color=#gray ``` `pattern=crosshatch` 속성을 사용하면 45도와 135도로 교차하는 미세 선망이 생성됩니다. 두 개 이상의 조건 영역이 중첩되는 부분을 명확히 구분할 때 활용합니다. ## 두 곡선 사이의 영역 빗금 채우기 해석학 문항에서 두 곡선으로 둘러싸인 영역의 넓이를 시각화할 때 사용합니다. 다각형 객체를 수동으로 따낼 필요 없이 곡선 식과 적분 구간을 넘기면 영역을 자동으로 계산해 빗금을 칩니다. ```mathit f = -x^2 + 4 g = x + 2 shade: between(f..g, x in -2..1), hatch=(60deg, 1.5mm), stroke=0.6pt ``` 이 코드는 위쪽 곡선 `f`와 아래쪽 곡선 `g` 사이의 영역 중 $x$ 좌표가 $-2$부터 $1$까지인 구간을 정확히 오려내어 60도 기울기의 빗금으로 채웁니다. 경계선이 직선이 아닌 복잡한 3차 곡선이나 초월함수 곡선이어도 정확한 수치 적분 경계를 찾아내어 빗금을 채워 넣습니다. --- ## 예제 배운 모든 주석 요소를 결합하여 직각삼각형과 그 내부 수선의 발, 각도, 변의 길이를 나타내는 완벽한 문제지 도판을 구성합니다. ```mathit @canvas: width=90mm, height=70mm, dpi=300 @view: [-1, 6], [-1, 5] // 꼭짓점 정의 A = (0, 0) B = (5, 0) C = (0, 3.75) H = proj(A, B--C) // 삼각형 본체 및 수선 poly: A--B--C, stroke=1.5pt line: A--H, stroke=1pt, dash=(3pt, 2pt) // 수학 기호 주석 right_ang: B--A--C, size=8pt right_ang: A--H--B, size=7pt ang: C--B--A, "$\theta$", r=18pt // 치수선 dim: A--B, "5", off=-14pt, arrow=both dim: C--A, "$h$", off=-14pt, arrow=both // 밑변 부분 빗금 영역 강조 shade: poly(A--B--H), hatch=(45deg, 1.8mm), stroke=0.5pt // 꼭짓점 라벨 dot: A"A"(sw), B"B"(se), C"C"(nw), H"H"(ne) ``` 이 코드는 실제 인쇄물에 바로 들어갈 수 있도록 외곽선, 점선 보조선, 직각 마크 두 개, 각도 라벨, 두 개의 치수선, 내부 빗금, 8방위 꼭짓점 라벨이 한 치의 오차나 겹침 없이 렌더링됩니다. --- # Document: 양함수 그래프 (Category: 해석학) URL: https://mathit-docs.pages.dev/4 해석학/4.1 양함수 그래프.html # 4.1 양함수 그래프 독립변수 $x$에 대하여 종속변수 $y$의 값이 하나로 결정되는 일반적인 함수 $y = f(x)$를 다룹니다. ## 함수의 정의와 그리기 지시어 함수는 소문자 식별자를 사용하여 수식 형태로 선언합니다. ```mathit f(x) = x^3 - 3*x draw: f, x in -2.5..2.5, thick=1.5pt ``` 첫 줄에서 삼차함수를 정의하고, 둘째 줄에서 `draw:` 지시어로 곡선을 그립니다. `x in -2.5..2.5` 구문은 가로축 $-2.5$부터 $2.5$ 사이의 구간에서만 함수를 렌더링하도록 정의역을 한정합니다. 정의역을 적지 않으면 전역 설정 `@view`에서 지정된 가로축 전체 범위에 맞춰 자동으로 그려집니다. `f = x^3 - 3*x`처럼 괄호 없이 식별자만 적어도 동일한 일변수 함수 객체로 인식됩니다. ## 기본 내장 수학 함수 목록 다항함수 외에도 교재에 수록되는 모든 표준 초월함수를 수식에 직접 대입할 수 있습니다. 제곱근은 `sqrt(x)`, 절댓값은 `abs(x)`를 사용합니다. 삼각함수는 `sin(x)`, `cos(x)`, `tan(x)`를 지원합니다. 이때 $x$는 기본적으로 호도법인 라디안 수치로 계산됩니다. 지수함수와 로그함수는 `exp(x)` 또는 `e^x`, 자연로그 `ln(x)`, 밑이 10인 상용로그 `log10(x)`를 사용합니다. 임의의 밑 $a$를 가지는 로그는 밑변환 공식이나 `log(a, x)` 문법을 통해 정의합니다. ## 유리함수와 점근선 처리 분모가 0이 되는 불연속 지점을 가진 유리함수는 점근선과 함께 표현하는 경우가 많습니다. ```mathit f(x) = (2*x + 1) / (x - 1) // 점근선 정의 및 렌더링 L_vert = line((1, -6)--(1, 10)) L_horiz = line((-6, 2)--(8, 2)) line: L_vert, stroke=0.8pt, dash=(3pt, 2pt), color=#gray line: L_horiz, stroke=0.8pt, dash=(3pt, 2pt), color=#gray // 두 분기 곡선 렌더링 draw: f, x in -6..0.8, thick=1.2pt draw: f, x in 1.2..8, thick=1.2pt ``` 불연속점 $x=1$을 가로지르는 긴 수직선이 캔버스에 그어지는 오류를 방지하기 위해, 정의역을 점근선 왼쪽과 오른쪽으로 분할하여 두 번 `draw:`를 호출하는 것이 정석입니다. --- # Document: 미분과 기하학적 접선 (Category: 해석학) URL: https://mathit-docs.pages.dev/4 해석학/4.2 미분과 기하학적 접선.html # 4.2 미분과 기하학적 접선 수학교육 현장에서 가장 손이 많이 가는 작업은 특정 곡선 위의 점에서의 접선을 작도하는 일입니다. 손으로 미분 계수를 구하고 접선의 방정식을 유도하여 두 점을 계산할 필요 없이, Mathit의 미분 계산 엔진을 사용해 한 줄로 접선을 얻을 수 있습니다. ## 접선 자동 생성 `tangent_line()` 함수는 대상 함수와 접점의 가로 좌표 $x$를 인자로 받아 해당 지점의 접선 직선 객체를 반환합니다. ```mathit f(x) = -x^2 + 4 L_tan = tangent_line(f, x=1) draw: f, x in -1..3, thick=1.5pt draw: L_tan, stroke=1pt, dash=(4pt, 2pt), color=#red ``` Mathit은 내부 수치 해석 미분 엔진을 통해 $x=1$에서의 미분계수 $f'(1) = -2$를 계산하고, 접점 $(1, 3)$을 통과하는 일차함수 직선을 생성합니다. 이 직선은 일반 선분이나 직선처럼 점선(`dash`) 스타일이나 색상을 자유롭게 부여할 수 있습니다. ## 접점 좌표 추출과 라벨링 접선만 그리는 것보다 접점을 명시하고 좌표값을 표기해야 문제지 그림이 완성됩니다. 접점의 위치는 함수에 직접 값을 대입하여 점 객체로 만듭니다. ```mathit x0 = 1 P = (x0, f(x0)) dot: P"P(1, 3)"(ne) ``` 수치 변수 `x0`를 선언하고 이를 점의 가로 좌표와 함수의 입력값으로 넘겨 점 P를 정의했습니다. 접선과 접점이 완전히 일치하므로 도판의 수학적 정합성이 어긋나지 않습니다. ## 법선(수직선) 작도 접선에 수직인 법선을 그려야 할 때는 기하 엔진의 회전 변환 함수인 `rot()`를 결합합니다. ```mathit L_norm = rot(L_tan, 90deg, center=P) draw: L_norm, stroke=0.8pt, color=#blue ``` 접점 P를 중심으로 접선 `L_tan`을 90도 회전시켜 수직 법선을 즉시 추출할 수 있습니다. --- # Document: 정적분과 두 곡선 사이의 넓이 (Category: 해석학) URL: https://mathit-docs.pages.dev/4 해석학/4.3 정적분과 두 곡선 사이의 넓이.html # 4.3 정적분과 두 곡선 사이의 넓이 정적분 단원에서 요구되는 곡선과 축 사이의 음영, 두 곡선으로 둘러싸인 면적의 빗금, 그리고 구분구적법을 설명하는 리만 직사각형들을 다룹니다. ## 두 곡선 사이의 영역 채우기 두 함수 곡선 사이의 면적을 시각화할 때는 `between()` 함수를 `shade:` 지시어와 함께 호출합니다. ```mathit f(x) = -x^2 + 3 g(x) = x + 1 shade: between(f..g, x in -2..1), fill=#blue/15 ``` `f..g` 형태로 위쪽 곡선과 아래쪽 곡선을 지정하고, `x in -2..1`로 적분 구간을 명시합니다. Mathit은 주어진 구간 안에서 두 곡선의 상하 관계를 추적하여 해당 폐구간의 면적 전체에 색이나 빗금을 칠합니다. 단색 채우기 대신 시험지용 빗금을 칠할 때는 3장에서 다룬 `hatch` 옵션을 그대로 적용합니다. ```mathit shade: between(f..g, x in -2..1), hatch=(45deg, 1.8mm), stroke=0.6pt ``` 곡선과 $x$축 사이의 면적을 칠할 때는 기준선으로 0을 넘기면 됩니다. ```mathit shade: between(f..0, x in 0..sqrt(3)), hatch=(60deg, 2mm) ``` ## 교점과의 자동 연동 적분 구간의 경계가 두 곡선의 교점일 때, 교점의 좌표를 직접 계산하여 손으로 적을 필요가 없습니다. ```mathit f(x) = 4 - x^2 g(x) = x^2 - 4 [P1, P2] = isect(f, g) shade: between(f..g, x in P1.x..P2.x), hatch=(45deg, 2mm) ``` `isect`로 구한 교점 객체에서 `.x` 접근자를 사용하여 가로 좌표값을 추출한 뒤, 이를 적분 구간 범위 `P1.x..P2.x`에 대입합니다. 함수의 계수가 바뀌더라도 빗금 구간이 교점의 이동에 맞춰 자동으로 재계산됩니다. ## 리만 합(구분구적법) 시각화 정적분의 엄밀한 정의나 급수와의 관계를 설명할 때 구간을 잘게 쪼갠 직사각형 기둥들을 그리는 문법입니다. ```mathit f(x) = 0.5*x^2 + 1 draw: riemann(f, x in 0..3, n=6, type=left), fill=#gray/20, stroke=0.8pt, color=#black ``` `n=6`은 구간을 6등분한다는 의미입니다. `type` 속성은 직사각형의 높이를 결정하는 기준점을 설정합니다. 1. `type=left`는 각 소구간의 왼쪽 끝점 함숫값을 높이로 삼는 좌측 리만 합입니다. 2. `type=right`는 각 소구간의 오른쪽 끝점 함숫값을 높이로 삼는 우측 리만 합입니다. 3. `type=mid`는 각 소구간의 정중앙 중점 함숫값을 높이로 삼는 중점 리만 합입니다. 이 지시어를 사용하면 수많은 직사각형 다각형을 일일이 `poly:`로 짜 맞출 필요 없이 한 줄로 구분구적법 도판을 완성할 수 있습니다. --- # Document: 고급 곡선 표현 (Category: 해석학) URL: https://mathit-docs.pages.dev/4 해석학/4.4 고급 곡선 표현.html # 4.4 고급 곡선 표현 함수식 $y = f(x)$의 꼴로 정리되지 않는 복잡한 기하 궤적과 음함수 곡선을 그리는 문법입니다. ## 매개변수 곡선 가로 좌표 $x$와 세로 좌표 $y$가 매개변수 $t$에 의해 각각 정의되는 곡선은 `param()` 함수를 사용합니다. ```mathit draw: param(x = 2*cos(t), y = 3*sin(t)), t in 0..2pi, thick=1.5pt ``` 타원, 사이클로이드, 하이포사이클로이드처럼 시간에 따른 위치 변화를 다루는 기하학 곡선을 그릴 때 필수적입니다. 매개변수 구간은 `t in 시작값..끝값` 형태로 부여합니다. 사이클로이드 곡선 예제는 다음과 같이 간결하게 작성됩니다. ```mathit r = 1 draw: param(x = r*(t - sin(t)), y = r*(1 - cos(t))), t in 0..4*pi, thick=1.2pt ``` ### 극방정식 곡선 원점으로부터의 거리 $r$이 회전각 `theta`에 의해 주어지는 곡선은 `polar()` 함수를 사용합니다. ```mathit draw: polar(r = 2*(1 - cos(theta))), theta in 0..2pi, color=#blue, thick=1.5pt ``` 위 코드는 대표적인 극곡선인 심장형(Cardioid) 곡선을 그립니다. `theta`의 범위를 `0..2pi`로 지정하여 각도가 한 바퀴 도는 동안 변화하는 거리 $r$의 자취를 부드러운 곡선으로 연결합니다. 장미 곡선이나 아르키메데스 나선 역시 동일한 문법으로 $r$에 관한 관계식만 대입하여 표현할 수 있습니다. ## 음함수 곡선 원, 쌍곡선, 잎사귀형 곡선처럼 $x$와 $y$가 뒤섞인 방정식 $F(x, y) = 0$ 꼴의 곡선은 동등 비교 연산자 `==`를 사용하여 작성합니다. ```mathit draw: x^2 + y^2 - x*y == 3, x in -3..3, y in -3..3, thick=1.5pt, color=#purple ``` 음함수를 그릴 때는 단일 등호 `=`가 아닌 이중 등호 `==`를 적어야 파서가 이를 대입문이 아닌 방정식 조건식으로 인식합니다. 또한 음함수는 평면 전체를 격자 탐색하여 0이 되는 등위선을 추적하므로, 반드시 `x in ...`과 `y in ...` 두 축의 탐색 범위를 모두 지정해 주어야 합니다. 회전된 타원이나 데카르트의 엽선처럼 양함수로 쉽게 쪼개지지 않는 대학 수준의 해석학 곡선도 오차 없이 시각화할 수 있습니다. --- ## 예제 배운 내용을 결합하여 삼차함수 그래프 위의 변곡점 근처에서 접선을 긋고, 두 곡선으로 둘러싸인 영역을 빗금으로 채우는 고난도 수능형 도판을 제작합니다. ```mathit @canvas: width=100mm, height=80mm, dpi=300 @view: [-2.5, 3], [-3, 5] // 좌표축 axis: x, y, O // 삼차함수 정의 및 접선 추출 f(x) = 0.5*x^3 - x^2 - x + 2 L_tan = tangent_line(f, x=-0.5) // 교점 탐색 [P1, P2] = isect(f, L_tan) // 둘러싸인 면적 빗금 채우기 shade: between(f..L_tan, x in P1.x..P2.x), hatch=(45deg, 1.8mm), stroke=0.5pt // 곡선 및 접선 그리기 draw: f, x in -2..2.6, thick=1.5pt draw: L_tan, stroke=1pt, color=#red, dash=(4pt, 2pt) // 접점 및 교점 강조 dot: P1"접점"(nw), P2"교점"(se) // 함수 이름 라벨 label: (2.2, f(2.2))"$y=f(x)$"(e) ``` 이 코드는 삼차곡선과 직선의 교점을 정확히 추적하여 둘러싸인 적분 영역을 오차 없이 빗금으로 채워내며, 고등 수학 시험지 인쇄 규격에 부합하는 도판을 산출합니다. --- # Document: 벡터와 선형대수 (Category: 확통, 이산수학, 벡터) URL: https://mathit-docs.pages.dev/5 확통, 이산수학, 벡터/5.1 벡터와 선형대수.html # 5.1 벡터와 선형대수 벡터는 평면 위의 고정된 위치를 갖는 점과 달리, 크기와 방향성만을 가지는 대수적 대상입니다. Mathit은 벡터를 시각화할 때 시점(출발점)을 자유롭게 지정할 수 있는 렌더링 체계를 갖추고 있습니다. ## 벡터 객체 생성 순수 2차원 벡터는 `vec()` 함수로 정의합니다. ```mathit u = vec(3, 1) v = vec(-1, 2) ``` 이 벡터들은 특정 좌표에 묶여 있지 않으므로, 캔버스의 어느 점에든 시점을 두고 화살표로 그려낼 수 있습니다. ## 벡터 그리기 지시어 벡터를 화면에 출력할 때는 `draw:` 지시어를 사용하며, 반드시 시점 위치를 나타내는 `origin` 속성을 함께 넘겨야 합니다. ```mathit draw: u, origin=(0, 0), color=#blue, label="$\vec{u}$"(e) draw: v, origin=(0, 0), color=#red, label="$\vec{v}$"(nw) ``` 원점 `(0, 0)`에서 출발하여 각각 `(3, 1)`과 `(-1, 2)`를 가리키는 화살표가 그려집니다. 벡터의 덧셈 법칙인 평행사변형 법칙을 시각화할 때는 벡터의 시점을 다른 벡터의 종점으로 옮겨 연쇄 배치합니다. ```mathit w = u + v // 합성 벡터 렌더링 draw: w, origin=(0, 0), thick=2pt, color=#purple, label="$\vec{u}+\vec{v}$"(ne) // 평행사변형 보조선 draw: v, origin=(3, 1), stroke=0.8pt, dash=(3pt, 2pt), color=#gray draw: u, origin=(-1, 2), stroke=0.8pt, dash=(3pt, 2pt), color=#gray ``` `origin=(3, 1)`을 지정함으로써 벡터 `v`가 벡터 `u`의 끝점에서 시작하도록 만들 수 있습니다. ## 방향장 및 기울기장 미분방정식 $\frac{dy}{dx} = f(x, y)$에서 평면의 격자점마다 형성되는 접선의 기울기를 한눈에 보여주는 방향장은 `field:` 지시어로 생성합니다. ```mathit field: (x, y) => (1, x - y), range=[-3..3, -3..3], step=0.5, type=slope_line ``` 첫 번째 인자에는 격자 좌표 $(x, y)$를 받아 해당 위치의 미소 벡터 $(dx, dy)$를 반환하는 화살표 익명 함수를 적습니다. `range`는 방향장을 생성할 가로축과 세로축의 탐색 범위입니다. `step=0.5`는 격자선 간격으로, 수치가 작을수록 더 조밀하게 기울기 선이 배치됩니다. `type` 속성은 출력 형태를 결정합니다. 고등학교 교재 스타일의 단위 기울기 토막선을 그릴 때는 `type=slope_line`을 사용하고, 물리학의 유체 흐름이나 전기장처럼 화살표로 나타낼 때는 `type=arrow`를 사용합니다. --- # Document: 확률과 통계 시각화 (Category: 확통, 이산수학, 벡터) URL: https://mathit-docs.pages.dev/5 확통, 이산수학, 벡터/5.2 확률과 통계 시각화.html # 5.2 확률과 통계 시각화 통계 단원의 핵심 도판은 정규분포 곡선과 그 아래의 확률 면적, 그리고 가설검정의 유의수준을 나타내는 기각역 표현입니다. ## 정규분포 함수 생성 평균 $\mu$와 표준편차 $\sigma$를 갖는 정규분포 확률밀도함수는 `dist_normal()` 함수로 한 번에 정의합니다. ```mathit norm = dist_normal(mu=0, sigma=1) draw: norm, x in -3.5..3.5, thick=1.5pt ``` 복잡한 가우스 적분 수식을 코딩할 필요 없이 모수값만 넘기면 정확한 종형 곡선(Bell Curve) 함수가 생성됩니다. `x in -3.5..3.5`로 렌더링할 표준화 점수 구간을 지정합니다. ## 기각역 및 신뢰구간 빗금 채우기 정규분포 곡선 아래의 특정 구간 확률을 강조할 때는 곡선 하부 면적 전용 함수인 `under()`를 `shade:` 지시어와 함께 호출합니다. ```mathit shade: under(norm, x in 1.96..3.5), fill=#red/30 shade: under(norm, x in -3.5..-1.96), fill=#red/30 ``` 표준정규분포에서 양측검정 기준인 $|Z| \ge 1.96$ 구간에 해당하는 꼬리 영역 전체가 30퍼센트 투명도의 붉은색으로 오차 없이 채워집니다. 시험지 인쇄용 흑백 도판을 제작할 때는 단색 채우기 대신 빗금 속성을 적용합니다. ```mathit shade: under(norm, x in 1.96..3.5), hatch=(45deg, 1.5mm), stroke=0.6pt ``` ## 평균선과 경계선 수직 점선 작도 확률 영역의 경계에 해당하는 위치에는 세로 점선을 긋고 축 눈금 라벨을 달아주어야 합니다. ```mathit y_peak = norm(0) line: (0, 0)--(0, y_peak), stroke=0.8pt, dash=(3pt, 2pt) label: (0, 0)"$\mu$"(s) y_bound = norm(1.96) line: (1.96, 0)--(1.96, y_bound), stroke=0.8pt, dash=(3pt, 2pt) label: (1.96, 0)"$1.96$"(s) ``` 정규분포 객체 `norm`에 $x$ 좌표를 직접 함수처럼 전달하면 해당 위치의 곡선 높이 $y$값이 반환되므로, 바닥축부터 곡선 표면까지 정확히 닿는 수직 점선을 손쉽게 그릴 수 있습니다. --- # Document: 수형도 (Category: 확통, 이산수학, 벡터) URL: https://mathit-docs.pages.dev/5 확통, 이산수학, 벡터/5.3 수형도.html # 5.3 수형도 조건부 확률, 베이즈 정리, 경우의 수 단원에서 사건의 단계적 발생을 트리 구조로 표현할 때 `tree:` 지시어를 사용합니다. ## 수형도의 기본 구조 `tree:` 지시어 내부에는 출발 노드에서 도착 노드로 이어지는 경로를 화살표 연산자 `->`로 나열합니다. ```text tree: { root -> "비가 온다 (0.4)" -> "우산을 쓴다 (0.8)", "우산을 안 쓴다 (0.2)"; root -> "비가 안 온다 (0.6)" -> "우산을 쓴다 (0.1)", "우산을 안 쓴다 (0.9)"; }, layout=right, level_dist=35mm ``` 한 부모 노드에서 갈라져 나오는 자식 노드들은 쉼표(`,`)로 구분하여 나열합니다. 세미콜론(`;`)은 하나의 분기 경로가 끝났음을 선언합니다. ## 수형도 옵션 제어 레이아웃의 방향과 간격은 지시어 블록 바깥의 속성으로 통제합니다. 첫째, 전개 방향을 지정하는 `layout`입니다. 국내 수학 교과서의 조건부 확률 문제에 주로 쓰이는 좌우 전개 방식은 `layout=right`를 줍니다. 조직도나 일반 계통도처럼 위에서 아래로 내려가는 전개는 `layout=down`을 사용합니다. 둘째, 단계 간의 간격을 정하는 `level_dist`입니다. `level_dist=35mm`는 각 사건 단계 사이의 가로 거리를 35밀리미터로 넓혀, 노드 안의 텍스트가 서로 겹치지 않도록 물리적 안전 여백을 확보합니다. 셋째, 형제 노드 간의 간격을 정하는 `sibling_dist`입니다. 자식 노드가 세 개 이상으로 많아질 때 `sibling_dist=15mm`처럼 세로 간격을 넓혀 줄 간 겹침을 방지합니다. --- # Document: 네트워크 그래프 (Category: 확통, 이산수학, 벡터) URL: https://mathit-docs.pages.dev/5 확통, 이산수학, 벡터/5.4 네트워크 그래프.html # 5.4 네트워크 그래프 점(노드)들과 이들을 잇는 선(간선)으로 구성되는 이산수학의 네트워크 그래프를 다룹니다. ## 무향 그래프 연결 연산자 평면기하의 선분 연산자는 하이픈이 두 개인 `--`이지만, 이산수학의 네트워크 간선 연산자는 반드시 하이픈이 세 개인 `---`를 사용합니다. 이 연산자는 기하학적 직선이 아니라 두 정점 간의 위상수학적 연결 관계를 선언합니다. ```mathit graph: { A --- B [weight="4"]; B --- C [weight="2"]; A --- C [weight="5"]; C --- D [weight="1"]; }, layout=spring ``` 대괄호 안에 `weight=` 속성을 적으면 간선의 정중앙에 가중치 숫자가 렌더링됩니다. ## 그래프 배치 알고리즘 네트워크 그래프는 사용자가 정점의 좌표를 일일이 지정하지 않고, 그래프 이론의 배치 알고리즘에 따라 자동으로 형태를 잡습니다. 첫째, 탄성 물리 모델인 `layout=spring`입니다. 연결된 간선을 스프링으로 간주하여 정점들이 서로 밀어내고 당기면서 가장 균형 잡힌 자연스러운 형태로 정점을 자동 분산 배치합니다. 복잡한 네트워크나 최단 경로 문제 도판에 적합합니다. 둘째, 원형 배치 모델인 `layout=circular`입니다. 모든 정점을 원 둘레 위에 일정한 간격으로 배치합니다. 완전 그래프나 해밀턴 경로 문제를 다룰 때 교차선이 대칭적으로 드러나도록 만들 때 유용합니다. ## 유향 그래프(방향 그래프) 표현 한쪽 방향으로만 진행하는 간선은 화살표가 포함된 `-->` 연산자를 사용합니다. ```mathit graph: { S --> A [weight="3"]; S --> B [weight="2"]; A --> T [weight="4"]; B --> T [weight="1"]; }, layout=right ``` 출발점 `S`에서 도착점 `T`로 흐르는 네트워크 유량(Flow) 문제나 마르코프 연쇄의 상태 전이도를 작성할 때 방향성 화살표가 간선 중앙에 정확히 삽입됩니다. --- ### 예제 수능 및 모의고사 확률 단원에 단골로 출제되는 질병 진단 검사의 양성 판정 조건부 확률 문제를 수형도로 완벽하게 구현합니다. ```mathit @canvas: width=120mm, height=70mm, dpi=300 tree: { root"전체 집단" -> "유병자 $D$ (0.01)" -> "양성 반응 $T^+$ (0.95)", "음성 반응 $T^-$ (0.05)"; root -> "정상인 $D^c$ (0.99)" -> "양성 반응 $T^+$ (0.02)", "음성 반응 $T^-$ (0.98)"; }, layout=right, level_dist=40mm, sibling_dist=12mm ``` 이 코드는 복잡한 좌표 지정 없이 단 8줄로 각 사건의 포함 관계와 조건부 확률 수치를 교재 출판 규격의 정갈한 수형도로 렌더링해 냅니다. --- # Document: 3D 카메라 뷰포트 (Category: 입체기하와 공간도형) URL: https://mathit-docs.pages.dev/6 입체기하와 공간도형/6.1 3D 카메라 뷰포트.html # 6.1 3D 카메라 뷰포트 3차원 그래픽을 2차원 종이에 출력하려면 먼저 카메라의 위치와 시선 방향, 그리고 투영 방식을 정해야 합니다. Mathit은 문서 최상단의 `@3d` 전역 지시어로 관측 시점을 통제합니다. ### 3D 카메라 설정 문법 문서 최상단에 다음과 같이 카메라 파라미터를 선언합니다. ```mathit @3d: cam(elev=30deg, azim=45deg, dist=10, proj=oblique) ``` 각 파라미터가 입체도형을 바라보는 시선에 미치는 물리적 영향은 다음과 같습니다. 첫째, 앙각을 결정하는 `elev`입니다. 바닥면인 $xy$ 평면을 기준으로 카메라가 위로 얼마나 올라가 내려다보는지를 결정합니다. $0\text{deg}$는 정면에서 수평으로 바라보는 시점이고, $90\text{deg}$는 위에서 수직으로 내려다보는 평면 시점입니다. 중고등 교재의 겨냥도는 대개 $25\text{deg}$에서 $35\text{deg}$ 사이의 앙각을 사용합니다. 둘째, 방위각을 결정하는 `azim`입니다. 수직축인 $z$축을 중심으로 카메라를 좌우로 회전시키는 각도입니다. 대다수 시험지 도판은 입체도형의 앞면과 옆면이 균형 있게 드러나도록 $30\text{deg}$에서 $45\text{deg}$ 사이를 지정합니다. 셋째, 관측 거리를 결정하는 `dist`입니다. 물체의 중심점으로부터 카메라 렌즈까지의 거리입니다. ### 투영 방식의 선택 수학교육과 공학 도면에서는 투영 방식의 선택이 매우 중요합니다. 첫째, 사선 투영인 `proj=oblique`입니다. 국내 중고등 교과서 입체도형 단원의 겨냥도에 가장 많이 사용되는 방식입니다. 입체도형의 앞면 직사각형이나 앞쪽 모서리의 형태가 왜곡되지 않고 원래의 수평·수직 비율을 유지하며, 깊이 방향의 모서리들만 일정한 각도로 기울어져 평행하게 뻗어나갑니다. 자를 대고 길이를 비교하는 기하 문항에 필수적입니다. 둘째, 등각 투영인 `proj=iso`입니다. 가로, 세로, 높이의 세 축이 서로 120도의 균일한 각도를 이루며 투영되는 방식입니다. 축 방향의 척도가 일정하므로 대칭성이 중요한 정다면체나 공간좌표계 도판을 제작할 때 사용합니다. 셋째, 원근 투영인 `proj=persp`입니다. 카메라에 가까운 모서리는 크게 보이고 멀리 있는 모서리는 소실점을 향해 좁아지는 사실적 3D 투영입니다. 대학 수준의 다변수 미적분학 곡면이나 물리적 공간 모델을 시각화할 때 적합합니다. --- # Document: 기본 입체도형 (Category: 입체기하와 공간도형) URL: https://mathit-docs.pages.dev/6 입체기하와 공간도형/6.2 기본 입체도형.html # 6.2 기본 입체도형 Mathit은 공간도형 문제에 단골로 등장하는 주요 입체들을 내장 생성자 함수로 제공합니다. ### 정육면체와 직육면체 정육면체는 중심 좌표와 한 변의 길이를 부여하여 정의합니다. ```mathit K = cube(size=4, center=(0, 0, 0)) draw: K, thick=1.2pt ``` 가로, 세로, 높이가 서로 다른 직육면체를 만들 때는 세 변의 길이를 각각 분리하여 전달합니다. ```mathit Box = cube(w=5, h=3, d=4, center=(0, 0, 0)) ``` 생성된 육면체 객체는 8개의 꼭짓점과 12개의 모서리, 6개의 면 데이터를 자동으로 포함하므로, 특정 꼭짓점의 이름을 붙이거나 단면을 자를 때 기준 도형으로 곧바로 사용할 수 있습니다. ### 구 중심점과 반지름을 전달하여 구 객체를 생성합니다. ```mathit S = sphere(r=3, center=(0, 0, 0)) draw: S, stroke=1.2pt ``` Mathit은 구를 그릴 때 외부 윤곽 실루엣 원뿐만 아니라, 입체감을 살리기 위해 적도면의 타원 가이드라인을 적절한 점선과 실선 조합으로 자동 렌더링합니다. ### 원기둥과 각뿔 원기둥은 밑면 반지름과 높이를 지정합니다. ```mathit Cyl = cylinder(r=2, h=6, center=(0, 0, 0)) draw: Cyl, stroke=1.2pt ``` 위아래 두 밑면의 타원과 양쪽 측면 윤곽선 모서리가 카메라 시점에 맞춰 계산되어 출력됩니다. 사각뿔이나 정사면체 같은 각뿔형 도형은 `pyramid()` 함수를 사용합니다. ```mathit // 밑면 다각형과 꼭대기 꼭짓점 좌표로 정의 Base = poly((-2, -2, 0)--(2, -2, 0)--(2, 2, 0)--(-2, 2, 0)) Pyr = pyramid(base=Base, apex=(0, 0, 4)) draw: Pyr, stroke=1.2pt ``` --- # Document: 숨은선 자동 점선 처리 (Category: 입체기하와 공간도형) URL: https://mathit-docs.pages.dev/6 입체기하와 공간도형/6.4 숨은선 자동 점선 처리.html # 6.4 숨은선 자동 점선 처리 일반적인 2D 벡터 툴로 겨냥도를 그릴 때는 앞쪽 모서리와 뒤쪽 모서리를 사용자가 직접 분리해서 뒤쪽 선에만 점선 스타일을 지정해야 했습니다. 시점이 조금만 바뀌어도 어느 선이 숨겨지는지 완전히 달라지므로 수정 작업이 매우 고통스럽습니다. Mathit은 3차원 깊이 버퍼와 면 가림 판별 엔진을 통해 숨은선을 알아서 찾아 점선으로 바꾸어 줍니다. ## hide=dash 속성의 멘탈 모델 입체도형을 그릴 때 `draw:` 지시어에 `hide=dash` 속성 하나만 부여하면 시스템이 모든 모서리의 가시성을 계산합니다. ```mathit draw: K, hide=dash, thick=1.5pt ``` 카메라의 각도(`elev`, `azim`)를 수정하더라도, 변경된 시점에 맞춰 어느 모서리가 실선이 되고 어느 모서리가 점선이 되는지가 실시간으로 다시 계산됩니다. ## 숨은선의 세부 스타일 제어 숨은선의 두께나 색상을 앞쪽 실선과 다르게 지정하여 인쇄 품질을 높일 수 있습니다. ```mathit draw: K, hide=dash, thick=1.5pt, hide_stroke=0.8pt, hide_dash=(3pt, 2pt), hide_color=#gray ``` 앞면 모서리는 1.5포인트 검은색 실선으로 힘을 주고, 가려진 뒷면 모서리는 0.8포인트의 얇은 회색 점선으로 섬세하게 표현할 때 사용합니다. 만약 완전히 불투명한 실물 입체처럼 뒤쪽 선을 아예 지워버리고 싶다면 `hide=remove`를 지정합니다. --- # Document: 3D 매개변수 곡면 (Category: 입체기하와 공간도형) URL: https://mathit-docs.pages.dev/6 입체기하와 공간도형/6.5 3D 매개변수 곡면.html # 6.5 3D 매개변수 곡면 다면체를 넘어 두 개의 매개변수 $(u, v)$로 정의되는 공간 곡면을 그릴 때는 `surface:` 지시어를 사용합니다. ## 곡면 함수의 정의와 표면 렌더링 매개변수 함수는 $u$와 $v$를 입력받아 공간 좌표 $(x, y, z)$ 튜플을 반환하는 익명 함수로 정의합니다. 도넛 모양의 토러스 곡면을 만드는 코드는 다음과 같습니다. ```mathit torus = (u, v) => ((3 + cos(v))*cos(u), (3 + cos(v))*sin(u), sin(v)) surface: torus, u in 0..2pi, v in 0..2pi, mesh=(32, 16), fill=#purple/30, stroke=0.4pt ``` `u in 0..2pi`와 `v in 0..2pi`는 두 매개변수의 회전 범위를 지정합니다. `mesh=(32, 16)`은 곡면을 분할하는 와이어프레임 격자의 조밀도입니다. 앞의 숫자는 $u$ 방향 분할 수, 뒤의 숫자는 $v$ 방향 분할 수입니다. 수치가 클수록 곡면이 매끄러워집니다. `fill=#purple/30`은 곡면 조각들의 표면 색상이며, `stroke=0.4pt`는 곡면 위에 그어지는 미세한 위선과 경선 와이어프레임의 선 굵기입니다. ## 안장 곡면(쌍곡포물면) 예제 다변수 미적분학에서 함수의 극값을 설명할 때 쓰이는 말안장 형태의 곡선입니다. ```mathit saddle = (u, v) => (u, v, u^2 - v^2) surface: saddle, u in -1.5..1.5, v in -1.5..1.5, mesh=(20, 20), fill=#blue/20 ``` 복잡한 공간 3D 곡면도 매개변수 식만 세우면 숨은 면의 음영 처리가 반영된 깔끔한 도판으로 출력됩니다. --- ## 예제 수능 기하 과목에 단골 출제되는 문항으로, 정육면체의 인접한 세 면의 대각선을 연결하여 생기는 정삼각형 단면과 내부 보조선을 완벽한 겨냥도로 구현합니다. ```mathit @canvas: width=100mm, height=90mm, dpi=300 @3d: cam(elev=28deg, azim=35deg, dist=12, proj=oblique) // 정육면체 생성 K = cube(size=4, center=(0, 0, 0)) // 단면을 형성할 세 꼭짓점을 지나는 평면 정의 // 육면체의 상단, 우측, 전면 모서리 삼분점을 지나는 절단 평면 P = plane(norm=(1, 1, 1), pt=(0.8, 0.8, 0.8)) // 단면 추출 sec = isect(K, P) // 정육면체 렌더링 (숨은 모서리 자동 점선 처리) draw: K, hide=dash, thick=1.2pt // 단면 채우기 및 빗금 처리 fill: sec, fill=#red/15 shade: sec, hatch=(60deg, 1.8mm), stroke=0.6pt poly: sec, stroke=1.5pt, color=#red // 단면의 무게중심에 수선의 발 내리기 G = centroid(sec) dot: G"G"(ne) ``` 이 코드는 카메라의 각도에 맞춰 정육면체의 보이지 않는 3개 뒷모서리를 스스로 점선으로 전환하고, 공간상에서 기울어진 정삼각형 단면을 수학적으로 정확하게 절단하여 붉은색 빗금으로 마감합니다. 복잡한 삼수선의 정리와 정사영 문제를 한눈에 설명할 수 있는 교재용 도판이 완성됩니다. --- # Document: 역기하 제약 해결사 (Category: 고급 엔진) URL: https://mathit-docs.pages.dev/7 고급 엔진/7.1 역기하 제약 해결사.html # 7.1 역기하 제약 해결사 일반적인 작도는 점의 좌표를 먼저 정하고 그로부터 길이와 각도를 도출하는 순방향 방식으로 이루어집니다. 그러나 실제 기출문항은 "두 변의 길이가 각각 5와 7이고 사이 각이 30도이며, 한 꼭짓점이 특정 포물선 위에 있는 삼각형"처럼 결과적인 기하 조건만 주어지는 경우가 많습니다. 이러한 문제를 손으로 연립방정식을 세워 좌표를 구하는 대신, 수치 해석 엔진에 조건을 그대로 넘겨 미지수를 역으로 찾아내게 하는 문법이 `solve` 블록입니다. ## 미지수 리터럴 Mathit에서는 값을 알 수 없는 수치나 좌표 성분에 물음표 기호 `?`를 부여합니다. 점의 가로 좌표와 세로 좌표를 모두 모른다면 `C = (?, ?)` 형태로 선언합니다. 만약 점이 가로축 위에 있다는 사실을 알고 있다면 세로 좌표를 0으로 고정하여 `B = (?, 0)`과 같이 부분 미지수로 선언합니다. 스칼라 길이 값 자체를 모를 때도 `len = ?` 형태로 미지수를 선언할 수 있습니다. ## 제약 조건 기술 문법 `solve` 블록 내부에는 대상이 되는 점들을 미지수로 배치하고, 그 아래에 만족해야 하는 기하학적 등식들을 나열합니다. 모든 조건식에는 반드시 동등 비교 연산자인 이중 등호 `==`를 사용해야 합니다. ```mathit solve { A = (0, 0) B = (?, 0) C = (?, ?) dist(A, B) == 5 dist(B, C) == 7 ang(C, A, B) == 30deg C.y == C.x^2 - 2 } poly: A--B--C, stroke=1.5pt ``` 위 코드에서 점 A는 원점에 고정되어 있고, 점 B는 가로축 위의 미지점, 점 C는 평면 위의 미지점입니다. 부여된 제약 조건은 네 가지입니다. 1. 점 A와 B 사이의 거리가 5입니다. 2. 점 B와 C 사이의 거리가 7입니다. 3. 세 점이 이루는 각 CAB의 크기가 30도입니다. 4. 점 C의 세로 좌표(`C.y`)가 점 C의 가로 좌표(`C.x`)로 표현되는 이차곡선 $y = x^2 - 2$ 위에 존재합니다. `solve` 블록이 실행된 직후부터 점 B와 C는 일반 좌표점과 완전히 동일하게 `poly:`, `line:`, `ang:` 등의 지시어에서 활용됩니다. ## 수렴 실패와 디버깅 요령 제약 해결사가 올바른 해를 찾지 못하고 에러를 출력할 때는 대수학적 자유도를 점검해야 합니다. 첫째, 조건 부족 상태입니다. 찾아야 하는 미지수의 개수보다 부여된 독립 방정식의 개수가 적으면 해가 무수히 많이 존재하므로 점의 위치를 특정할 수 없습니다. 미지 성분이 총 세 개라면 서로 독립적인 기하 조건식도 최소 세 개 이상 주어져야 합니다. 둘째, 모순된 제약 상태입니다. 삼각형의 세 변의 길이를 각각 2, 3, 10으로 부여하는 것처럼 기하학적으로 불가능한 조건을 주면 해가 존재하지 않아 수렴에 실패합니다. 셋째, 다중 해 문제와 초기 추정값 지정입니다. 원과 직선의 교점 조건처럼 해가 두 개 이상 존재하는 경우, 사용자가 의도하지 않은 반대편 사분면의 해로 수렴할 수 있습니다. 이때는 미지수에 근사 힌트를 부여하여 원하는 방향의 해를 선택하도록 유도합니다. ```mathit C = (? near 2, ? near 3) ``` 위와 같이 `near` 키워드를 함께 적어주면 원하는 위치의 해를 잡아냅니다. --- # Document: CSG 연산 (Category: 고급 엔진) URL: https://mathit-docs.pages.dev/7 고급 엔진/7.2 CSG 연산.html # 7.2 CSG 불리언 영역 연산 단순한 삼각형이나 사각형은 `poly:` 지시어로 쉽게 채울 수 있지만, 원에서 사각형을 오려낸 형태나 부채꼴과 삼각형이 겹치는 복합 형태는 단일 다각형으로 따내기 어렵습니다. Mathit은 2차원 폐곡선 영역 간의 집합 연산을 수행하는 3대 CSG 불리언 연산자를 지원합니다. ## 3대 불리언 연산자 영역 객체 사이에 연산 기호를 사용하여 새로운 합성 영역을 만듭니다. 첫째, 교집합 연산자 `&`입니다. 두 도형이 공통으로 겹치는 영역만을 남깁니다. 둘째, 합집합 연산자 `|`입니다. 두 도형의 영역을 하나로 합치며, 겹치는 경계선은 자동으로 지워집니다. 셋째, 차집합 연산자 `-`입니다. 기준 도형에서 빼고자 하는 도형과 겹치는 영역을 칼로 파내듯 제거합니다. ## 복합 영역 합성 문법 도형 생성 함수인 `circle()`, `poly()`, `rect()` 등을 결합하여 복잡한 음영 구역을 생성합니다. ```mathit A = (-2, -1) B = (2, -1) C = (0, 3) O = (0, 1) // 원과 삼각형의 교집합에서 중앙 사각형 영역을 도려냄 R = (circle(center=O, r=2.5) & poly(A--B--C)) - rect((-1, 0), (1, 2)) // 합성된 영역에 빗금 렌더링 shade: R, fill=#blue/15, hatch=(45deg, 1.8mm), stroke=0.8pt ``` 이 코드는 먼저 반지름 2.5인 원과 삼각형 ABC의 겹치는 부분만을 취한 뒤, 그 결과물에서 가로세로 범위가 $(-1, 0)$부터 $(1, 2)$까지인 직사각형 구멍을 뚫어 단일 영역 객체 `R`을 만듭니다. 완성된 영역 `R`은 `shade:` 지시어에 그대로 전달되어 단색 음영이나 시험지용 45도 빗금 패턴으로 깔끔하게 마감됩니다. ## 히포크라테스의 초승달 응용 기하학 교재의 대표적 난제인 직각삼각형의 두 변을 지름으로 하는 반원에서 빗변을 지름으로 하는 반원을 제외한 초승달 영역을 불리언 연산으로 구현합니다. ```mathit A = (0, 0) B = (4, 0) C = (0, 3) // 각 변을 지름으로 하는 세 반원 정의 Semi_AB = half_circle(diam=A--B, #top) Semi_AC = half_circle(diam=A--C, #right) Semi_BC = half_circle(diam=B--C, #top) 7.2 // 두 소반원의 합집합에서 빗변의 대반원을 차감 Moon = (Semi_AB | Semi_AC) - Semi_BC shade: Moon, fill=#gray/30, stroke=1pt poly: A--B--C, stroke=1.2pt ``` 코드 작성을 통해 두 초승달 구역의 넓이를 시각화할 수 있습니다. --- # Document: 재사용 컴포넌트 제작 (Category: 고급 엔진) URL: https://mathit-docs.pages.dev/7 고급 엔진/7.3 재사용 컴포넌트 제작.html # 7.3 재사용 컴포넌트 제작 교재나 시험지를 집필하다 보면 용수철, 도르래, 전기 저항, 접지 기호, 빗금 친 바닥면 벽체와 같이 여러 개의 선과 호로 이루어진 동일한 그래픽 요소를 반복해서 그려야 합니다. Mathit의 `component` 선언문은 매개변수를 받아 작동하는 커스텀 그래픽 모듈을 만드는 도구입니다. ## 컴포넌트 선언 구조 컴포넌트는 `component` 키워드 뒤에 대문자로 시작하는 컴포넌트 이름을 붙이고, 소괄호 안에 입력받을 파라미터들을 나열하여 정의합니다. ```mathit component Spring(from: Point, to: Point, coils=8, width=8pt) { axis_vec = to - from normal_vec = rot(norm(axis_vec), 90deg) * width pts = [ on(from--to, t) + normal_vec * sin(t * coils * 2pi) for t in 0..1, step=0.01 ] line: pts, stroke=1.2pt } ``` 구조는 다음과 같습니다. `from: Point`와 `to: Point`는 용수철의 양 끝점이 될 필수 위치 파라미터입니다. `coils=8`과 `width=8pt`는 기본값이 지정된 선택적 파라미터로, 각각 용수철이 감기는 횟수와 진폭 폭을 결정합니다. `pts = [ ... for t in 0..1, step=0.01 ]` 구문은 리스트 내포 표현식입니다. 마지막 줄의 `line: pts`는 계산된 파동 점들을 연결하여 용수철 외형을 완성합니다. ## 컴포넌트 호출 문법 선언된 컴포넌트는 Mathit의 내장 지시어처럼 콜론(`:`)을 붙여 간단히 호출합니다. ```mathit Spring: from=(0, 5), to=(0, 0), coils=10, width=10pt Spring: from=(2, 5), to=(6, 2) ``` 첫 번째 호출은 기본값보다 더 조밀하고 굵은 용수철을 수직으로 세우며, 두 번째 호출은 기본 설정을 유지한 채 기울어진 각도로 용수철을 배치합니다. 한 번 정의해 둔 컴포넌트는 문서 전체에서 무제한으로 재사용할 수 있습니다. ## 물리 시험용 바닥면(빗금 벽체) 컴포넌트 물리학 도판에서 물체가 놓이는 지면이나 고정 벽면을 표현하는 빗금 벽체 컴포넌트 예제입니다. ```mathit component Ground(from: Point, to: Point, tick_len=6pt, tick_step=4mm) { // 바닥 기준선 line: from--to, stroke=1.5pt // 바닥 기준선 아래로 45도 기울어진 잔빗금 자동 생성 base_len = dist(from, to) n_ticks = floor(base_len / tick_step) for i in 0..n_ticks { P = on(from--to, i / n_ticks) tick_vec = rot(norm(to - from), -135deg) * tick_len line: P--(P + tick_vec), stroke=0.8pt, color=#gray } } ``` 이 컴포넌트를 사용하면 임의의 두 점만 넘겨도 바닥면이 즉시 생성됩니다. ```mathit Ground: from=(-3, 0), to=(5, 0) ``` --- ### 예제 배운 내용을 종합하여, 미지의 각도로 매달려 평형을 이루고 있는 빗면 위의 물체와 용수철 역학 도판을 구현합니다. ```mathit @canvas: width=100mm, height=80mm, dpi=300 @view: [-2, 7], [-1, 6] // 1. 역기하 해결사로 빗면 꼭짓점 위치 탐색 solve { A = (0, 0) B = (5, 0) C = (?, ?) dist(A, C) == 4 ang(C, A, B) == 30deg } // 2. 빗면 다각형 및 바닥 렌더링 poly: A--B--C, stroke=1.5pt, fill=#gray/10 Ground: from=(-1, 0), to=(6, 0) // 3. 빗면 위의 물체 위치 잡기 P_block = on(C--A, 0.5) // 4. 용수철 컴포넌트로 꼭대기 C와 물체 P_block 연결 Spring: from=C, to=P_block, coils=6, width=6pt // 5. 물체 상자 렌더링 rect: center=P_block, w=15pt, h=10pt, rot=30deg, fill=#white, stroke=1.2pt // 6. 각도 주석 ang: B--A--C, "\(30^\circ\)", r=20pt dot: C"고정단"(n) ``` 이 코드는 `solve` 엔진으로 꼭짓점 C를 찾아낸 뒤, 앞서 작성한 `Ground`와 `Spring` 모듈을 조합하여 역학 삽화를 완성합니다.