평면기하 문제를 텍스트로 입력받아 조건을 구조화하고, GeoGebra 작도로 재구성하는 도구.
평면 기하 도형 파싱(이미지 → 구조)은 학계에서도 미해결에 가까운 문제입니다. 이 프로젝트는 그림을 직접 파싱하는 대신, 문제 텍스트를 1차 소스로 삼습니다. 교과서/시험 도형은 “그림은 실제와 다를 수 있음”이 전제라 픽셀 단위로 정밀하지 않고, 필요한 조건 대부분이 텍스트에 이미 서술되어 있기 때문입니다. 자세한 설계 배경은 CLAUDE.md를 참고하세요.
브라우저에서 geometry-extractor.html을 열면 됩니다. 서버가 필요 없는 단일 HTML 파일입니다.
open geometry-extractor.html
| 단계 | 내용 | 상태 |
|---|---|---|
| 1. 텍스트 → JSON | Claude API로 문제 텍스트를 구조화된 조건으로 추출 | 동작 |
| 2. JSON → GeoGebra 작도 | 규칙 기반 변환(LLM 불필요), GeoGebra 공식 앱(Apps API) 재사용 | 동작 |
| 3. 렌더링 후 비교 | 작도 결과와 원본 이미지를 비전 모델로 diff | 동작 |
| 4. 수정 루프 | diff 결과로 JSON 재수정 또는 underdetermined 질문 추가 | 수동 (자동화 전) |
점을 하나씩 순서대로 배치하는 규칙(아래)을 먼저 시도하고, 그래도 못 놓는 점이 남으면 3단계 솔버(그 아래)로 넘어갑니다.
순차 배치 규칙:
ClosestPoint(Line, Point)연립 솔버(점 여러 개를 동시에 풀어야 하는 경우): 정사각형처럼 강체인 도형의 두 변(예: DE)이 이미 결정 가능하면 나머지 꼭짓점(F, G)은 ±90° 회전으로 자동 유도됩니다. 여기에 “DB의 길이를 x라 함” 같은 이름 붙은 변수와 “x+y=15” 같은 일차식 관계, 그리고 파생된 꼭짓점이 특정 직선 위에 있어야 한다는 조건(F가 AC 위)을 모아 작은 최소제곱 솔버(Levenberg-Marquardt, 수치 야코비안)로 동시에 풉니다. 회전 방향이 두 가지(±90°)로 갈리는 경우 둘 다 풀어보고, 변수 값이 실제 변의 범위 안에 있는지·”내부의 점”으로 서술된 점이 실제로 해당 다각형 안에 들어오는지로 올바른 쪽을 고릅니다. 성공하면 결과 좌표를 하드코딩하지 않고 D=B+(6/Distance(B,A))*(A-B)처럼 이미 배치된 점을 참조하는 동적 수식으로 내보내, GeoGebra에서 기준점을 움직여도 따라가도록 합니다.
길이 조건이 아예 없는 문제(각도만 묻는 문제 등)는 임의의 기준 길이(5)로 배치하고, 이 변환기가 처리하지 못하는 제약은 “수동 확인 필요” 목록에 표시됩니다 — 조용히 무시하지 않습니다.
targets 순서(꼭짓점 위치)는 LLM 추출마다 일관되지 않을 수 있어, description 텍스트로 교차 검증합니다.square 도형 타입만 강체로 취급합니다 — 직사각형/마름모 등 다른 강체 도형은 아직 지원하지 않습니다.Intersect(...,1)이 실제로 고르는 교점과 다를 수 있어 회전 방향이 거울상으로 잘못 나올 가능성이 있습니다 — 3단계(원본과 비교)로 반드시 확인하세요.범용 기하 도형 이미지 파싱(임의의 도형 사진 → 완전한 구조 추출)은 시도하지 않습니다. 텍스트가 조건 대부분을 결정한다는 전제가 깨지는 문제는 이 프로젝트 스코프 밖입니다.