Geometry_Extractor

Geometry Extractor

평면기하 문제를 텍스트로 입력받아 조건을 구조화하고, GeoGebra 작도로 재구성하는 도구.

배경

평면 기하 도형 파싱(이미지 → 구조)은 학계에서도 미해결에 가까운 문제입니다. 이 프로젝트는 그림을 직접 파싱하는 대신, 문제 텍스트를 1차 소스로 삼습니다. 교과서/시험 도형은 “그림은 실제와 다를 수 있음”이 전제라 픽셀 단위로 정밀하지 않고, 필요한 조건 대부분이 텍스트에 이미 서술되어 있기 때문입니다. 자세한 설계 배경은 CLAUDE.md를 참고하세요.

사용 방법

브라우저에서 geometry-extractor.html을 열면 됩니다. 서버가 필요 없는 단일 HTML 파일입니다.

open geometry-extractor.html
  1. console.anthropic.com에서 발급받은 Anthropic API 키를 입력 (브라우저 로컬 저장소에만 저장되고 외부로 전송되지 않음)
  2. 문제 텍스트를 붙여넣고 구조화 추출 클릭 → points/shapes/constraints/underdetermined 스키마의 JSON 생성
  3. GeoGebra로 작도 클릭 → JSON을 규칙 기반으로 GeoGebra 명령으로 변환해 그 자리에서 작도
  4. (선택) 원본 문제 이미지를 업로드하고 비교 실행 → 작도 결과와 원본을 비전 모델로 비교해 수치 차이인지 구조 차이인지 판별

파이프라인

단계 내용 상태
1. 텍스트 → JSON Claude API로 문제 텍스트를 구조화된 조건으로 추출 동작
2. JSON → GeoGebra 작도 규칙 기반 변환(LLM 불필요), GeoGebra 공식 앱(Apps API) 재사용 동작
3. 렌더링 후 비교 작도 결과와 원본 이미지를 비전 모델로 diff 동작
4. 수정 루프 diff 결과로 JSON 재수정 또는 underdetermined 질문 추가 수동 (자동화 전)

2단계 변환기가 처리하는 패턴

점을 하나씩 순서대로 배치하는 규칙(아래)을 먼저 시도하고, 그래도 못 놓는 점이 남으면 3단계 솔버(그 아래)로 넘어갑니다.

순차 배치 규칙:

연립 솔버(점 여러 개를 동시에 풀어야 하는 경우): 정사각형처럼 강체인 도형의 두 변(예: DE)이 이미 결정 가능하면 나머지 꼭짓점(F, G)은 ±90° 회전으로 자동 유도됩니다. 여기에 “DB의 길이를 x라 함” 같은 이름 붙은 변수와 “x+y=15” 같은 일차식 관계, 그리고 파생된 꼭짓점이 특정 직선 위에 있어야 한다는 조건(F가 AC 위)을 모아 작은 최소제곱 솔버(Levenberg-Marquardt, 수치 야코비안)로 동시에 풉니다. 회전 방향이 두 가지(±90°)로 갈리는 경우 둘 다 풀어보고, 변수 값이 실제 변의 범위 안에 있는지·”내부의 점”으로 서술된 점이 실제로 해당 다각형 안에 들어오는지로 올바른 쪽을 고릅니다. 성공하면 결과 좌표를 하드코딩하지 않고 D=B+(6/Distance(B,A))*(A-B)처럼 이미 배치된 점을 참조하는 동적 수식으로 내보내, GeoGebra에서 기준점을 움직여도 따라가도록 합니다.

길이 조건이 아예 없는 문제(각도만 묻는 문제 등)는 임의의 기준 길이(5)로 배치하고, 이 변환기가 처리하지 못하는 제약은 “수동 확인 필요” 목록에 표시됩니다 — 조용히 무시하지 않습니다.

알려진 한계

하지 않는 것

범용 기하 도형 이미지 파싱(임의의 도형 사진 → 완전한 구조 추출)은 시도하지 않습니다. 텍스트가 조건 대부분을 결정한다는 전제가 깨지는 문제는 이 프로젝트 스코프 밖입니다.