평면기하 문제를 텍스트로 입력받아 조건을 구조화하고, GeoGebra 작도로 재구성하는 도구.
평면 기하 도형 파싱(이미지 → 구조)은 학계에서도 미해결에 가까운 문제입니다. 이 프로젝트는 그림을 직접 파싱하는 대신, 문제 텍스트를 1차 소스로 삼습니다. 교과서/시험 도형은 "그림은 실제와 다를 수 있음"이 전제라 픽셀 단위로 정밀하지 않고, 필요한 조건 대부분이 텍스트에 이미 서술되어 있기 때문입니다. 자세한 설계 배경은 CLAUDE.md를 참고하세요.
브라우저에서 geometry-extractor.html을 열면 됩니다. 서버가 필요 없는 단일 HTML 파일입니다.
open geometry-extractor.html- console.anthropic.com에서 발급받은 Anthropic API 키를 입력 (브라우저 로컬 저장소에만 저장되고 외부로 전송되지 않습니다.)
- 문제 텍스트를 붙여넣고 구조화 추출 클릭 → points/shapes/constraints/underdetermined 스키마의 JSON 생성
- GeoGebra로 작도 클릭 → JSON을 규칙 기반으로 GeoGebra 명령으로 변환해 그 자리에서 작도
- (선택) 원본 문제 이미지를 업로드하고 비교 실행 → 작도 결과와 원본을 비전 모델로 비교해 수치 차이인지 구조 차이인지 판별
| 단계 | 내용 | 상태 |
|---|---|---|
| 1. 텍스트 → JSON | Claude API로 문제 텍스트를 구조화된 조건으로 추출 | 동작 |
| 2. JSON → GeoGebra 작도 | 규칙 기반 변환(LLM 불필요), GeoGebra 공식 앱(Apps API) 재사용 | 동작 |
| 3. 렌더링 후 비교 | 작도 결과와 원본 이미지를 비전 모델로 diff | 동작 |
| 4. 수정 루프 | diff 결과로 JSON 재수정 또는 underdetermined 질문 추가 | 수동 (자동화 전) |
점을 하나씩 순서대로 배치하는 규칙(아래)을 먼저 시도하고, 그래도 못 놓는 점이 남으면 3단계 솔버(그 아래)로 넘어갑니다.
순차 배치 규칙:
- 두 점 사이 길이, 각도(꼭짓점 기준)
- 중점(midpoint), 선분 위의 점(on_segment, 비율 포함)
- 두 거리로 원-원 교점 배치
- 평행사변형 폐합(대각선이 서로 이등분: A+C=B+D)
- 수선의 발(perpendicular foot):
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)로 배치하고, 이 변환기가 처리하지 못하는 제약은 "수동 확인 필요" 목록에 표시됩니다 — 조용히 무시하지 않습니다.
- 각도 constraint의
targets순서(꼭짓점 위치)는 LLM 추출마다 일관되지 않을 수 있어, description 텍스트로 교차 검증합니다. - 평행사변형 외의 도형(원, 임의 다각형)에서 변 길이가 여러 개 동시에 미지수인 복잡한 케이스는 아직 일반화된 해법이 없습니다.
- 연립 솔버는
square도형 타입만 강체로 취급합니다 — 직사각형/마름모 등 다른 강체 도형은 아직 지원하지 않습니다. - 이름 붙은 변수 사이의 관계는 일차식(예: x+y=15, 2x-y=3)만 파싱합니다. 이차식 이상의 관계는 지원하지 않습니다.
- 원-원 교점이 필요한 점이 연립 솔버가 다루는 하위 시스템의 기준점 역할을 겸하는 경우, 내부적으로 고른 교점이 GeoGebra의
Intersect(...,1)이 실제로 고르는 교점과 다를 수 있어 회전 방향이 거울상으로 잘못 나올 가능성이 있습니다 — 3단계(원본과 비교)로 반드시 확인하세요. - 4단계(자동 수정 루프)는 아직 사람이 수동으로 반복합니다.
- Haiku로 여러번 실험한 결과, Sonnet과 JSON추출 품질이 확연히 다르며 문제 이해도가 꽤나 떨어지는것을 확인했습니다.
범용 기하 도형 이미지 파싱(임의의 도형 사진 → 완전한 구조 추출)은 시도하지 않습니다. 텍스트가 조건 대부분을 결정한다는 전제가 깨지는 문제는 이 프로젝트 스코프 밖입니다.