# Mathit Complete Documentation (Single Context Dump) Author: Feynerin | Version: v0.9.4 Architecture: Programmatic Document Graphics & Diagram Typesetting Generated for LLMs, AI Agents, and Context Retrieval Engines. ] (-1,0,0) -- (5,0,0) node[right] {$x$}; \draw[->] (0,-1,0) -- (0,5,0) node[above] {$y$}; \draw[->] (0,0,-1) -- (0,0,5) node[above] {$z$}; \coordinate (A) at (0,0,0); \coordinate (B) at (4,0,0); \coordinate (C) at (4,4,0); \coordinate (D) at (0,4,0); \coordinate (E) at (0,0,4); \coordinate (F) at (4,0,4); \coordinate (G) at (4,4,4); \coordinate (H) at (0,4,4); \draw[dashed] (A) -- (B); \draw[dashed] (A) -- (D); \draw[dashed] (A) -- (E); \draw (B) -- (C) -- (G) -- (F) -- cycle; \draw (D) -- (C); \draw (E) -- (F); \draw (E) -- (H) -- (G); \draw (D) -- (H); \coordinate (P1) at (0,0,0); \coordinate (P2) at (4.33,0,0); \coordinate (P3) at (2.414,3.828,0); \draw[red, ultra thick] (P1) -- (P2) -- (P3) -- cycle; \node[left, xshift=-2pt] at (P1) {$A$}; \node[right, xshift=2pt] at (P2) {$B$}; \node[above, yshift=3pt] at (P3) {$C$}; \fill[red] (P1) circle (2pt) (P2) circle (2pt) (P3) circle (2pt); \end{tikzpicture} ``` ## Mathit은? ``` @3d: cam(elev=35deg, azim=45deg, proj=oblique) K = cube(size=4) draw: K, hide=dash, thick=1.5pt solve { A = (0, 0, 0) B = (?, 0, 0) C = (?, ?, 0) dist(A, B) == 5 dist(B, C) == 7 ang(C, A, B) == 30deg C.y == C.x^2 - 2 } poly: A--B--C, stroke=2pt, color=#red dot: A"A"(sw), B"B"(se), C"C"(nw) ``` ]]> ]]> `@view` 설정을 통해 화면에 보여줄 2D 좌표 범위를 지정할 수 있습니다. > > > ``` > @view: [-5, 5], [-3, 7] // x축 -5~5, y축 -3~7 범위를 화면에 맞춤 > ``` > ## 2. 3D 공간을 알아보자 입체 기하와 곡면을 표현하기 위한 3차원 공간입니다. 순수한 3D 수학적 실수 단위를 사용하고 정육면체, 구, 원기둥, 3D 매개변수 곡면, 입체 단면 절단 등에 쓰입니다. 설정한 카메라 시점(`@3d`)에 따라 3차원 공간의 도형들이 2D 평면 공간으로 자동 투영되어 그려집니다. ``` // 카메라 시점 설정 (고도 30도, 방위각 45도, 사선 투영) @3d: cam(elev=30deg, azim=45deg, proj=oblique) // 중심이 (0,0,0)이고 한 변의 길이가 4인 정육면체 그리기 K = cube(size=4, center=(0,0,0)) draw: K ``` **투영 방식 (`proj`)을 알아보자면** `oblique`은 사선 투영, `iso`는 등메트릭 투영, `persp`은 원근감이 적용되는 원근 투영을 사용합니다. ## 3. 스크린 오버레이 공간을 알아보자 그림의 확대/축소나 3D 카메라 각도와 상관없이 항상 일정해야 하는 화면 치수 공간입니다. 기본 단위는 `pt`, `mm`, `px`를 사용합니다. 텍스트 라벨, 각도 표시 호의 반지름, 직각 표시 크기, 선 두께, 점의 크기에 쓰입니다. 2D/3D 좌표 공간이 아무리 확대되거나 기울어져도 스크린 오버레이 공간의 요소들은 **종이 위에 인쇄되는 실제 인쇄물 크기**를 그대로 유지한다는 특징이 있습니다. ``` // 선 두께(1.5pt), 점 크기(4pt), 라벨 여백(10pt) 등은 스크린 오버레이 공간 단위입니다. line: A--B, thick=1.5pt dot: A, size=4pt ang: A--B--C, "$\theta$", r=15pt // 각도 표시 호의 반지름이 15pt로 고정됨 ``` ## 3대 좌표계가 함께 쓰이는 예시 세 좌표계가 실제로 한 코드 안에서 어떻게 어우러 지는지 살펴 보겠습니다. ``` // 3D 공간은 카메라 및 정육면체 설정에 사용됩니다 @3d: cam(elev=35deg, azim=45deg, proj=oblique) K = cube(size=4) // 2D 공간은 정육면체의 꼭짓점 좌표를 평면 상에 위치시키는데 사용됩니다 A = K.v("top-front-left") B = K.v("front-bottom") // 스크린 오버레이 공간은 선 두께(2pt), 점 크기(3pt), 라벨 방위 및 위치 지정에 사용됩니다 draw: K, hide=dash, thick=1.5pt // 은선은 점선 처리, 두께 1.5pt dot: A, size=3pt // 점 크기 3pt label: A"A"(w) // 점 A의 서쪽(w) 방향으로 라벨 배치 ``` 이제 Mathit의 공간 개념이 정리되었을 것입니다. 다음으로는 실제 수식을 그려봅시다. ]]> B로 가는 변위 벡터가 됩니다. A = (1, 1) B = (4, 5) dir_vec = B - A // vec(3, 4)와 동일 ``` ### 2.4. 경로와 다각형 여러 점들을 이어 만든 선분, 베지어 곡선, 닫힌 다각형 객체입니다. **경로 연산자 (`-`)는** 점과 점을 이을 때는 반드시 이중 대시(`-`)를 사용합니다. **베지어 곡선 (`..controls..`)은** 곡선 경로를 생성할 때 사용합니다. ### **2.5. 특수 타입** **미지수 리터럴 (`?`)은** 좌표를 직접 알 수 없고 제약조건을 통해 풀어야 할 때 `solve { ... }` 블록 내부에서 사용합니다. ``` solve { C = (?, ?) // C의 x, y 좌표는 미지수 dist(A, C) == 5 } ``` **순서/방향 태그 (`OrdinalTag`)는** 교점이 여러 개 나올 때 원하는 지점을 고르는 필터 리터럴입니다. ``` P = isect(Circle1, Circle2, #top) // 위쪽 교점 선택 (#1, #2, #top, #bottom 등) ``` ]]> `, `>=` 을 지원합니다. **논리 연산에서는** 그리고 `&` 또는 `&&`, 또는 `|` 를 지원합니다. ``` a = 5 * 2 + 3 is_valid = (a > 10) & (a < 20) ``` ## **2. 범위 표현식과 포함 관계를 알아보자** 수학에서 구간이나 범위를 나타낼 때 범위 연산자 `..`를 사용합니다. `1..4`는 1부터 4까지의 닫힌 구간을 의미하고, in은 값이 특정 범위나 집합에 포함되는지 확인할 때 사용하는 식입니다. ``` // x가 1부터 4 사이의 범위에 포함되는지 확인 x_in_range = x in 1..4 ``` 이것으로 예시를 들 수 있겠습니다. 참고로, `x in 1..4` 같은 표현도 가능합니다. ## 3. 리스트와 리스트 컴프리헨션 여러 개의 값이나 점들을 한 번에 다룰 때는 리스트 `[...]`를 사용합니다. 특히 반복 규칙을 이용해 리스트를 쉽게 만드는 **컴프리헨션** 기능이 매우 유용합니다. ``` // 1. 단순 리스트 선언 points = [A, B, C, D] // 2. 반복문을 이용한 리스트 컴프리헨션 (step 옵션 활용) pts = [ on(A--B, t) for t in 0..1, step=0.02 ] ``` 이처럼 `for ... in ...` 구조를 사용하면 복잡한 점들의 좌표를 일일이 적지 않고도 규칙적으로 생성할 수 있습니다. ## 4. 패턴 **매칭** 조건에 따라 다른 결과를 반환해야 할 때 `match` 문을 사용하면 코드가 매우 간결해집니다. 특히 프랙탈이나 재귀적 구조를 만들 때 매우 유용합니다. ``` // 깊이(depth)에 따라 다른 경로를 반환하는 함수 예시 result = match depth { 0 => [A--B], _ => koch(A, P1, depth - 1) } ``` ]]> 0 // C는 x축 위쪽에 위치 (해의 유일성 보장) } ``` 솔버가 계산을 마치는 즉시 `C` 변수에는 계산된 결과 좌표가 저장되며 이후 코드에서 일반 점처럼 바로 사용할 수 있습니다. ## 2. 주요 제약 조건 함수 `solve { ... }` 블록 내에서 사용할 수 있는 다양한 기하 제약 조건 함수입니다. | **제약 조건 표현식** | **설명** | | --- | --- | | **`dist(A, B) == d`** | 두 점 $A, B$ 사이의 거리가 $d$ | | **`angle(A, B, C) == deg`** | 세 점이 이루는 각도 $\angle ABC$가 지정된 각도 | | **`is_orthogonal(L1, L2)`** | 두 직선 $L1, L2$가 서로 직교함 | | **`is_parallel(L1, L2)`** | 두 직선 $L1, L2$가 서로 평행함 | | **`on_line(P, A--B)`** | 점 $P$가 선분 또는 직선 $AB$ 위에 존재함 | | **`on_circle(P, C)`** | 점 $P$가 원 $C$의 둘레 위에 존재함 | | **`P.x == val`, `P.y > val`** | 좌표의 특정 성분 값 제한 및 부등식 조건 | ## 3. 다중 미지수 그리고 복합 조건 풀이 여러 점의 위치가 서로 얽혀 있는 복잡한 문제도 여러 개의 미지수(`?`)를 사용하여 동시에 제약 조건을 적용할 수 있습니다. ``` A = (0, 0) // 두 점 B와 C의 위치를 동시에 계산 solve { B = (?, 0) // B는 x축 위의 점 C = (?, ?) // C는 평면상의 점 dist(A, B) == 4 angle(C, A, B) == 60deg // angle CAB = 60도 dist(A, C) == 5 C.y > 0 } // 계산된 점들로 마름모/삼각형 완성 poly: A--B--C, stroke=1.5pt ``` ## 4. 예제를 봅시다. 설명만 들으면 이해가 되지 않을 수도 있습니다. 다음은 변의 길이와 각도 조건만으로 세 꼭짓점을 풀어서 그리는 예시입니다. ``` A = (0, 0) solve { B = (?, 0) C = (?, ?) D = (0, ?) dist(A, B) == 5 dist(B, C) == 4 dist(C, D) == 3 angle(A, B, C) == 90deg D.y > 0 C.x > 0 } // 사각형 그리기 poly: A--B--C--D, stroke=1.5pt, fill=#blue/10 // 직각 및 각도 표시 right_ang: A--B--C, size=8pt right_ang: D--A--B, size=8pt // 점 및 라벨 표시 dot: A"A"(sw), B"B"(se), C"C"(ne), D"D"(nw) ``` Mathit은 이 외에도 자동화를 위해 삼각형의 5심(외심, 내심, 무게중심, 수심, 방심)을 구하는 매크로 함수가 있습니다. 다음 문서에서는 이에 대해 알아보겠습니다. ]]> **Tip**: Mathit 내부 해석기는 `sin`, `cos`, `tan`, `exp`, `ln`, `log`, `sqrt`, `abs` 등 주요한 수학 표준 함수를 모두 기본 지원합니다. > ## 2. 음함수 곡선 ($F(x, y) = c$) 원, 타원, 쌍곡선, 또는 $y$에 대해 정리하기 어려운 복잡한 음함수(Implicit Curve) 관계식을 직접 그려냅니다. ``` // 타원 형태의 음함수 식 imp1 = x^2 / 9 + y^2 / 4 == 1 draw: imp1, x in -4..4, y in -3..3, color=#purple // 데카르트의 엽선 (Folium of Descartes) folium = x^3 + y^3 == 3*x*y draw: folium, x in -3..3, y in -3..3, thick=1.5pt ``` `x in ...` 및 `y in ...` 범위를 지정하여 음함수 솔버가 해를 탐색할 영역을 설정합니다. ## 3. 매개변수 곡선 (Parametric Curves) 매개변수 $t$를 사용하여 $(x(t), y(t))$ 형태의 위치 좌표를 곡선으로 시각화합니다. ``` // 매개변수 t에 따른 사이클로이드(Cycloid) 곡선 x_t = 2 * (t - sin(t)) y_t = 2 * (1 - cos(t)) // t 범위 지정하여 매개변수 곡선 그리기 draw: param(x_t, y_t), t in 0..4*pi, color=#orange, thick=1.5pt ``` --- ## 4. 극좌표 곡선 ($r = f(\theta)$) 반지름 $r$과 각도 $\theta$ 사이의 관계식으로 이루어진 극좌표(Polar) 곡선(심장형, 장미선 등)을 그립니다. ``` // 심장형 곡선 (Cardioid): r = 2 * (1 - cos(theta)) r_cardioid = 2 * (1 - cos(theta)) draw: polar(r_cardioid), theta in 0..2*pi, fill=#red/15, stroke=1.5pt // 4엽 장미선 (Rose Curve): r = 3 * sin(2*theta) r_rose = 3 * sin(2 * theta) draw: polar(r_rose), theta in 0..2*pi, color=#blue ``` ## 5. 종합적으로 보자면 양함수와 매개변수 곡선의 교점을 찾고 라벨을 추가하는 예시입니다. ``` // 축 및 전역 설정 @view: [-3, 4], [-2, 5] axis: x, y, O // 두 함수 정의 및 그리기 f = x^2 - 2 g = -x + 2 draw: f, x in -2.5..2.5, thick=1.5pt, color=#blue draw: g, x in -2..4, color=#red // 두 함수의 교점 자동 구하기 P1 = isect(f, g, #left) P2 = isect(f, g, #right) // 교점 표시 및 라벨 지정 dot: P1, P2, color=#black, size=4pt label: P1"$( -2, 2 )$"(nw) label: P2"$( 1, -1 )$"(ne) ``` ]]>