eomsangdon and Claude Opus 5
f1bcee7857
feat(B04): 세부유역 경계를 링 목록(외곽+구멍)으로 넓혀 중첩·빈공간 해소
...
단일 링 자료형이 곧 중첩·빈공간이었다. 아래 유역이 위 유역을 감싸면 구멍이 사라져 위
유역을 통째로 덮고(합성 실측 256㎡ 전량), 한 관의 유역이 두 조각이면 작은 쪽이 사라져
빈공간이 됐다(144㎡).
- `polygon_parts()` 신설 — 조각마다 [외곽 링, 구멍 링...], 넓은 조각부터.
- `WatershedBasin.boundary_parts` 로 교체. `boundary_xy`(가장 넓은 조각의 외곽)와
`boundary_rings`(편 링 목록)는 파생 속성이라 옛 소비처는 그대로 동작한다.
- API 에 `polygon_rings_lonlat` 추가. 저장 GeoJSON 은 구멍을 가진 Polygon, 조각이
여럿이면 MultiPolygon.
- 캔버스 4곳(B04 유역화면 채움·선택, B05 배수유역도 채움·선택)은 even-odd 로 한 번에
채우고 `pointInRings()` 로 판정 — 구멍 안을 눌러도 바깥 유역이 잡히지 않는다.
중복이던 지역 `pointInRing` 은 삭제하고 공용 것으로 통일.
검증: 단위 5건 신규(도넛 구멍 보존·조각 2개 보존·파생 속성·빈 경계·조립 경로 전체에서
링 2개), 전체 168 passed, typecheck 통과. 브라우저 — API 가 유역 22개에 링 목록을 실어
보내고, 캔버스 even-odd 실측(가운데 알파 0 / 고리 255)으로 구멍이 실제로 뚫린다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-03 12:40:21 +09:00
..
2026-09-02 18:03:18 +09:00
2026-08-29 11:15:29 +09:00
2026-08-08 10:03:11 +09:00
2026-08-08 10:03:11 +09:00
2026-09-02 19:30:16 +09:00
2026-09-02 19:30:16 +09:00
2026-08-08 10:03:11 +09:00
2026-09-02 19:30:16 +09:00
2026-09-02 16:15:25 +09:00
2026-09-02 16:15:25 +09:00
2026-08-28 08:38:58 +09:00
2026-09-02 19:30:16 +09:00
2026-08-08 10:03:11 +09:00
2026-08-30 19:38:24 +09:00
2026-08-08 10:03:11 +09:00
2026-08-08 10:03:11 +09:00
2026-08-30 12:54:29 +09:00
2026-08-28 15:41:24 +09:00
2026-09-02 18:03:18 +09:00
2026-09-02 16:20:17 +09:00
2026-09-02 19:30:16 +09:00
2026-08-28 19:09:28 +09:00
2026-09-01 20:18:33 +09:00
2026-08-24 19:56:40 +09:00
2026-09-01 20:18:33 +09:00
2026-08-28 12:54:45 +09:00
2026-09-02 16:52:38 +09:00
2026-09-02 16:52:38 +09:00
2026-09-02 10:50:10 +09:00
2026-09-02 11:27:25 +09:00
2026-08-27 22:32:01 +09:00
2026-09-02 12:06:54 +09:00
2026-08-25 20:03:42 +09:00
2026-09-02 11:41:41 +09:00
2026-08-27 22:13:26 +09:00
2026-08-27 22:13:26 +09:00
2026-08-27 18:42:15 +09:00
2026-08-27 18:42:15 +09:00
2026-08-23 13:58:00 +09:00
2026-08-27 22:13:26 +09:00
2026-08-28 12:54:45 +09:00
2026-08-27 22:13:26 +09:00
2026-09-02 16:52:38 +09:00
2026-08-29 12:01:22 +09:00
2026-08-26 18:38:30 +09:00
2026-09-02 16:52:38 +09:00
2026-08-23 13:11:49 +09:00
2026-08-26 17:18:47 +09:00
2026-09-02 12:06:54 +09:00
2026-08-19 19:46:03 +09:00
2026-08-30 12:05:22 +09:00
2026-08-30 12:23:38 +09:00
2026-09-03 12:40:21 +09:00
2026-09-02 16:52:38 +09:00
2026-09-02 16:52:38 +09:00
2026-08-18 19:38:52 +09:00
2026-08-19 18:32:55 +09:00
2026-09-03 12:40:21 +09:00
2026-08-17 17:09:05 +09:00
2026-08-19 18:33:03 +09:00
2026-09-02 16:48:01 +09:00
2026-08-28 19:09:28 +09:00
2026-08-29 11:15:29 +09:00
2026-09-02 16:48:01 +09:00
2026-09-02 19:30:16 +09:00
2026-09-02 19:30:16 +09:00
2026-09-02 19:30:16 +09:00
2026-08-17 14:05:32 +09:00
2026-09-02 19:30:16 +09:00
2026-08-17 18:51:21 +09:00
2026-09-02 19:30:16 +09:00
2026-08-17 18:51:21 +09:00
2026-08-08 10:03:11 +09:00
2026-09-02 20:34:18 +09:00
2026-09-02 20:34:18 +09:00
2026-09-02 20:34:18 +09:00
2026-09-02 19:30:16 +09:00
2026-09-02 20:34:18 +09:00
2026-09-02 19:30:16 +09:00
2026-09-02 19:30:16 +09:00
2026-08-08 10:03:11 +09:00
2026-08-08 10:03:11 +09:00
2026-09-02 19:30:16 +09:00
2026-08-18 19:14:05 +09:00
2026-08-18 19:51:08 +09:00
2026-08-19 18:17:22 +09:00
2026-08-19 18:56:06 +09:00
2026-08-29 18:37:16 +09:00
2026-08-28 12:16:38 +09:00
2026-08-08 10:03:11 +09:00
2026-08-30 12:05:22 +09:00
2026-09-02 19:30:16 +09:00
2026-08-25 20:03:42 +09:00
2026-09-02 16:30:59 +09:00
2026-08-19 18:32:55 +09:00
2026-09-02 16:30:59 +09:00
2026-08-17 09:06:19 +09:00