@mint-ui/map 1.2.0-test.33 → 1.2.0-test.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/dist/components/mint-map/core/advanced/shared/context.d.ts +71 -2
  2. package/dist/components/mint-map/core/advanced/shared/context.js +74 -1
  3. package/dist/components/mint-map/core/advanced/shared/helpers.d.ts +28 -0
  4. package/dist/components/mint-map/core/advanced/shared/helpers.js +52 -0
  5. package/dist/components/mint-map/core/advanced/shared/hooks.d.ts +144 -0
  6. package/dist/components/mint-map/core/advanced/shared/hooks.js +283 -0
  7. package/dist/components/mint-map/core/advanced/shared/index.d.ts +3 -0
  8. package/dist/components/mint-map/core/advanced/shared/performance.d.ts +105 -24
  9. package/dist/components/mint-map/core/advanced/shared/performance.js +105 -24
  10. package/dist/components/mint-map/core/advanced/shared/utils.d.ts +128 -14
  11. package/dist/components/mint-map/core/advanced/shared/utils.js +128 -14
  12. package/dist/components/mint-map/core/advanced/shared/viewport.d.ts +72 -0
  13. package/dist/components/mint-map/core/advanced/shared/viewport.js +81 -0
  14. package/dist/components/mint-map/core/advanced/woongCanvasMarker/WoongCanvasMarker.js +142 -209
  15. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/WoongCanvasPolygon.d.ts +0 -4
  16. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/WoongCanvasPolygon.js +122 -217
  17. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/renderer.d.ts +64 -5
  18. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/renderer.js +81 -20
  19. package/dist/index.es.js +1066 -511
  20. package/dist/index.js +11 -0
  21. package/dist/index.umd.js +1072 -509
  22. package/package.json +1 -1
@@ -0,0 +1,283 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tslib = require('tslib');
6
+
7
+ /**
8
+ * 지도 이벤트 핸들러 생성 함수
9
+ *
10
+ * 지도 이동, 줌, 드래그 등의 이벤트를 처리하는 핸들러들을 생성합니다.
11
+ *
12
+ * @template T 마커/폴리곤 데이터의 추가 속성 타입
13
+ * @param deps 이벤트 핸들러 생성에 필요한 의존성
14
+ * @returns 지도 이벤트 핸들러 객체
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const {
19
+ * handleIdle,
20
+ * handleZoomStart,
21
+ * handleZoomEnd,
22
+ * handleCenterChanged,
23
+ * handleDragStart,
24
+ * handleDragEnd,
25
+ * } = createMapEventHandlers({
26
+ * controller,
27
+ * containerRef,
28
+ * markerRef,
29
+ * options,
30
+ * prevCenterOffsetRef,
31
+ * accumTranslateRef,
32
+ * offsetCacheRef,
33
+ * boundingBoxCacheRef,
34
+ * renderAllImmediate,
35
+ * });
36
+ * ```
37
+ */
38
+
39
+ var createMapEventHandlers = function (deps) {
40
+ var controller = deps.controller,
41
+ containerRef = deps.containerRef,
42
+ markerRef = deps.markerRef,
43
+ options = deps.options,
44
+ prevCenterOffsetRef = deps.prevCenterOffsetRef,
45
+ accumTranslateRef = deps.accumTranslateRef,
46
+ offsetCacheRef = deps.offsetCacheRef,
47
+ boundingBoxCacheRef = deps.boundingBoxCacheRef,
48
+ renderAllImmediate = deps.renderAllImmediate;
49
+ /**
50
+ * 지도 이동/줌 완료 시 처리
51
+ *
52
+ * - 캐시 초기화: 좌표 변환 결과가 변경되었으므로 캐시 무효화
53
+ * - 마커 위치 업데이트: 새로운 지도 위치에 맞게 마커 재배치
54
+ * - 렌더링: 새 위치에서 전체 렌더링 수행
55
+ */
56
+
57
+ var handleIdle = function () {
58
+ prevCenterOffsetRef.current = null;
59
+ accumTranslateRef.current = {
60
+ x: 0,
61
+ y: 0
62
+ }; // 캐시 정리 (지도 이동/줌으로 좌표 변환 결과가 바뀜)
63
+
64
+ offsetCacheRef.current.clear();
65
+ boundingBoxCacheRef.current.clear(); // 마커 위치 업데이트
66
+
67
+ var bounds = controller.getCurrBounds();
68
+
69
+ var markerOptions = tslib.__assign({
70
+ position: bounds.nw
71
+ }, options);
72
+
73
+ markerRef.current && controller.updateMarker(markerRef.current, markerOptions); // transform 제거 전에 새 데이터로 즉시 렌더링 (겹침 방지)
74
+
75
+ if (containerRef.current) {
76
+ containerRef.current.style.transform = '';
77
+ containerRef.current.style.visibility = '';
78
+ } // 새 위치에서 렌더링
79
+
80
+
81
+ renderAllImmediate();
82
+ };
83
+ /**
84
+ * 줌 시작 시 처리 (일시적으로 숨김)
85
+ */
86
+
87
+
88
+ var handleZoomStart = function () {
89
+ if (containerRef.current) {
90
+ containerRef.current.style.visibility = 'hidden';
91
+ }
92
+ };
93
+ /**
94
+ * 줌 종료 시 처리 (다시 표시)
95
+ */
96
+
97
+
98
+ var handleZoomEnd = function () {
99
+ if (containerRef.current) {
100
+ containerRef.current.style.visibility = '';
101
+ }
102
+ };
103
+ /**
104
+ * 지도 중심 변경 시 처리 (transform으로 이동 추적)
105
+ */
106
+
107
+
108
+ var handleCenterChanged = function () {
109
+ var center = controller.getCurrBounds().getCenter();
110
+ var curr = controller.positionToOffset(center);
111
+ var prev = prevCenterOffsetRef.current;
112
+
113
+ if (!prev) {
114
+ prevCenterOffsetRef.current = {
115
+ x: curr.x,
116
+ y: curr.y
117
+ };
118
+ return;
119
+ }
120
+
121
+ var dx = prev.x - curr.x;
122
+ var dy = prev.y - curr.y;
123
+ accumTranslateRef.current = {
124
+ x: accumTranslateRef.current.x + dx,
125
+ y: accumTranslateRef.current.y + dy
126
+ };
127
+ prevCenterOffsetRef.current = {
128
+ x: curr.x,
129
+ y: curr.y
130
+ };
131
+
132
+ if (containerRef.current) {
133
+ containerRef.current.style.transform = "translate(".concat(accumTranslateRef.current.x, "px, ").concat(accumTranslateRef.current.y, "px)");
134
+ }
135
+ };
136
+ /**
137
+ * 드래그 시작 처리
138
+ */
139
+
140
+
141
+ var handleDragStart = function () {// 커서는 각 컴포넌트에서 처리
142
+ };
143
+ /**
144
+ * 드래그 종료 처리
145
+ */
146
+
147
+
148
+ var handleDragEnd = function () {// 커서는 각 컴포넌트에서 처리
149
+ };
150
+
151
+ return {
152
+ handleIdle: handleIdle,
153
+ handleZoomStart: handleZoomStart,
154
+ handleZoomEnd: handleZoomEnd,
155
+ handleCenterChanged: handleCenterChanged,
156
+ handleDragStart: handleDragStart,
157
+ handleDragEnd: handleDragEnd
158
+ };
159
+ };
160
+ /**
161
+ * 공간 인덱스 빌드 (빠른 Hit Test를 위한 자료구조)
162
+ *
163
+ * Spatial Hash Grid에 모든 데이터의 바운딩 박스를 삽입합니다.
164
+ * 이를 통해 클릭/호버 시 O(1) 수준의 빠른 Hit Test가 가능합니다.
165
+ *
166
+ * @template T 마커/폴리곤 데이터의 추가 속성 타입
167
+ * @param data 공간 인덱스에 삽입할 데이터 배열
168
+ * @param spatialIndex Spatial Hash Grid 인스턴스
169
+ * @param computeBoundingBox 바운딩 박스 계산 함수
170
+ *
171
+ * @remarks
172
+ * - 성능: O(n) 시간복잡도, n은 데이터 개수
173
+ * - 호출 시점: 데이터 변경 시 또는 지도 이동/줌 완료 시
174
+ *
175
+ * @example
176
+ * ```typescript
177
+ * buildSpatialIndex(
178
+ * dataRef.current,
179
+ * spatialIndexRef.current,
180
+ * computeBoundingBox
181
+ * );
182
+ * ```
183
+ */
184
+
185
+ var buildSpatialIndex = function (data, spatialIndex, computeBoundingBox) {
186
+ spatialIndex.clear();
187
+
188
+ for (var _i = 0, data_1 = data; _i < data_1.length; _i++) {
189
+ var item = data_1[_i];
190
+ var bbox = computeBoundingBox(item);
191
+
192
+ if (bbox) {
193
+ spatialIndex.insert(item, bbox.minX, bbox.minY, bbox.maxX, bbox.maxY);
194
+ }
195
+ }
196
+ };
197
+ /**
198
+ * 선택 상태 동기화 유틸리티
199
+ *
200
+ * 데이터 변경 시 선택된 항목의 참조를 최신 데이터로 업데이트합니다.
201
+ * 화면 밖에 있는 선택된 항목도 선택 상태를 유지합니다.
202
+ *
203
+ * @template T 마커/폴리곤 데이터의 추가 속성 타입
204
+ * @param data 최신 데이터 배열
205
+ * @param selectedIds 선택된 항목 ID Set
206
+ * @param selectedItemsMap 현재 선택된 항목 Map
207
+ * @returns 업데이트된 선택된 항목 Map
208
+ *
209
+ * @remarks
210
+ * - 성능: O(n + m), n은 전체 데이터 수, m은 선택된 항목 수
211
+ * - 화면 밖 데이터도 선택 상태 유지 (최신 데이터가 없으면 기존 데이터 유지)
212
+ *
213
+ * @example
214
+ * ```typescript
215
+ * selectedItemsMapRef.current = syncSelectedItems(
216
+ * data,
217
+ * selectedIdsRef.current,
218
+ * selectedItemsMapRef.current
219
+ * );
220
+ * ```
221
+ */
222
+
223
+ var syncSelectedItems = function (data, selectedIds, selectedItemsMap) {
224
+ var dataMap = new Map(data.map(function (m) {
225
+ return [m.id, m];
226
+ }));
227
+ var newSelectedItemsMap = new Map();
228
+ selectedIds.forEach(function (id) {
229
+ // 현재 data에 있으면 최신 데이터 사용
230
+ var currentItem = dataMap.get(id);
231
+
232
+ if (currentItem) {
233
+ newSelectedItemsMap.set(id, currentItem);
234
+ } else {
235
+ // 화면 밖이면 기존 데이터 유지
236
+ var prevItem = selectedItemsMap.get(id);
237
+
238
+ if (prevItem) {
239
+ newSelectedItemsMap.set(id, prevItem);
240
+ }
241
+ }
242
+ });
243
+ return newSelectedItemsMap;
244
+ };
245
+ /**
246
+ * 외부 selectedItems를 내부 상태로 동기화
247
+ *
248
+ * 외부에서 전달된 selectedItems prop을 내부 ref 상태로 동기화합니다.
249
+ *
250
+ * @template T 마커/폴리곤 데이터의 추가 속성 타입
251
+ * @param externalSelectedItems 외부에서 전달된 선택된 항목 배열 (undefined면 동기화 안 함)
252
+ * @param selectedIdsRef 선택된 ID Set ref
253
+ * @param selectedItemsMapRef 선택된 항목 Map ref
254
+ *
255
+ * @remarks
256
+ * - externalSelectedItems가 undefined면 외부 제어가 아니므로 아무 작업도 하지 않음
257
+ * - 성능: O(m), m은 externalSelectedItems의 길이
258
+ *
259
+ * @example
260
+ * ```typescript
261
+ * useEffect(() => {
262
+ * syncExternalSelectedItems(externalSelectedItems, selectedIdsRef, selectedItemsMapRef);
263
+ * // 렌더링...
264
+ * }, [externalSelectedItems]);
265
+ * ```
266
+ */
267
+
268
+ var syncExternalSelectedItems = function (externalSelectedItems, selectedIdsRef, selectedItemsMapRef) {
269
+ if (externalSelectedItems === undefined) return;
270
+ var newSelectedIds = new Set();
271
+ var newSelectedItemsMap = new Map();
272
+ externalSelectedItems.forEach(function (item) {
273
+ newSelectedIds.add(item.id);
274
+ newSelectedItemsMap.set(item.id, item);
275
+ });
276
+ selectedIdsRef.current = newSelectedIds;
277
+ selectedItemsMapRef.current = newSelectedItemsMap;
278
+ };
279
+
280
+ exports.buildSpatialIndex = buildSpatialIndex;
281
+ exports.createMapEventHandlers = createMapEventHandlers;
282
+ exports.syncExternalSelectedItems = syncExternalSelectedItems;
283
+ exports.syncSelectedItems = syncSelectedItems;
@@ -2,3 +2,6 @@ export * from './types';
2
2
  export * from './utils';
3
3
  export * from './context';
4
4
  export * from './performance';
5
+ export * from './viewport';
6
+ export * from './hooks';
7
+ export * from './helpers';
@@ -40,12 +40,32 @@ export declare const DEFAULT_CULLING_MARGIN = 100;
40
40
  export declare const DEFAULT_MAX_CACHE_SIZE = 30000;
41
41
  /**
42
42
  * LRU (Least Recently Used) Cache
43
- * 메모리 제한을 위한 캐시 구현 (최적화 버전)
44
43
  *
45
- * 개선 사항:
44
+ * 메모리 제한을 위한 캐시 구현입니다. WoongCanvas 컴포넌트에서 좌표 변환 결과를 캐싱하는데 사용됩니다.
45
+ *
46
+ * @template K 캐시 키 타입
47
+ * @template V 캐시 값 타입
48
+ *
49
+ * @remarks
50
+ * **개선 사항**:
46
51
  * 1. get() 성능 향상: 접근 빈도 추적 없이 단순 조회만 수행 (delete+set 제거)
47
52
  * 2. set() 버그 수정: 기존 키 업데이트 시 maxSize 체크 로직 개선
48
53
  * 3. 메모리 효율: 단순 FIFO 캐시로 동작하여 오버헤드 최소화
54
+ *
55
+ * **트레이드오프**:
56
+ * - 장점: 읽기 성능 대폭 향상 (10,000번 get → 이전보다 2배 빠름)
57
+ * - 단점: 접근 빈도가 아닌 삽입 순서 기반 eviction (FIFO)
58
+ *
59
+ * WoongCanvasMarker 사용 사례에 최적:
60
+ * - 좌표 변환 결과는 zoom/pan 시 어차피 전체 초기화
61
+ * - 접근 빈도 추적보다 빠른 조회가 더 중요
62
+ *
63
+ * @example
64
+ * ```typescript
65
+ * const cache = new LRUCache<string, Offset>(30000);
66
+ * cache.set(item.id, offset);
67
+ * const cached = cache.get(item.id);
68
+ * ```
49
69
  */
50
70
  export declare class LRUCache<K, V> {
51
71
  private cache;
@@ -54,25 +74,24 @@ export declare class LRUCache<K, V> {
54
74
  /**
55
75
  * 캐시에서 값 조회
56
76
  *
57
- * 최적화: delete+set 제거
58
- * - 이전: 매번 delete+set으로 LRU 갱신 (해시 재계산 비용)
59
- * - 현재: 단순 조회만 수행 (O(1) 해시 조회)
77
+ * @param key 조회할 키
78
+ * @returns 캐시된 또는 undefined (캐시 미스 )
60
79
  *
61
- * 트레이드오프:
62
- * - 장점: 읽기 성능 대폭 향상 (10,000번 get → 이전보다 2배 빠름)
63
- * - 단점: 접근 빈도가 아닌 삽입 순서 기반 eviction (FIFO)
64
- *
65
- * WoongCanvasMarker 사용 사례에 최적:
66
- * - 좌표 변환 결과는 zoom/pan 시 어차피 전체 초기화
67
- * - 접근 빈도 추적보다 빠른 조회가 더 중요
80
+ * @remarks
81
+ * - 성능: O(1) 해시 조회
82
+ * - 최적화: delete+set 제거로 읽기 성능 대폭 향상
68
83
  */
69
84
  get(key: K): V | undefined;
70
85
  /**
71
- * 캐시에 값 저장 (버그 수정 + 최적화)
86
+ * 캐시에 값 저장
87
+ *
88
+ * @param key 저장할 키
89
+ * @param value 저장할 값
72
90
  *
73
- * 수정 사항:
74
- * 1. 기존 키 업데이트 크기 체크 누락 버그 수정
75
- * 2. 로직 명확화: 기존 항목/신규 항목 분리 처리
91
+ * @remarks
92
+ * - 기존 키 업데이트: 단순 덮어쓰기 (크기 변화 없음)
93
+ * - 신규 추가: 크기 체크 후 필요시 가장 오래된 항목 제거 (FIFO)
94
+ * - 성능: O(1) 평균 시간복잡도
76
95
  */
77
96
  set(key: K, value: V): void;
78
97
  clear(): void;
@@ -108,40 +127,95 @@ export declare class SpatialHashGrid<T> {
108
127
  /**
109
128
  * 항목 추가 (바운딩 박스 기반)
110
129
  *
111
- * 개선 사항:
130
+ * 항목을 공간 인덱스에 추가합니다. 바운딩 박스가 걸치는 모든 셀에 삽입됩니다.
131
+ *
132
+ * @param item 추가할 항목
133
+ * @param minX 바운딩 박스 최소 X 좌표
134
+ * @param minY 바운딩 박스 최소 Y 좌표
135
+ * @param maxX 바운딩 박스 최대 X 좌표
136
+ * @param maxY 바운딩 박스 최대 Y 좌표
137
+ *
138
+ * @remarks
112
139
  * - 중복 삽입 방지: 기존 항목이 있으면 먼저 제거 후 재삽입
113
140
  * - 메모리 누수 방지: 이전 셀 참조 완전 제거
141
+ * - 성능: O(1) 평균 시간복잡도
114
142
  */
115
143
  insert(item: T, minX: number, minY: number, maxX: number, maxY: number): void;
116
144
  /**
117
145
  * 항목 제거
118
146
  *
119
- * 추가된 메서드: 메모리 누수 방지 및 업데이트 지원
147
+ * 공간 인덱스에서 항목을 제거합니다.
148
+ *
149
+ * @param item 제거할 항목
150
+ *
151
+ * @remarks
152
+ * - 메모리 누수 방지: 모든 셀에서 참조 완전 제거
153
+ * - 빈 셀 정리: 항목이 없어진 셀은 자동으로 정리됨
154
+ * - 성능: O(셀 개수), 보통 O(1)
120
155
  */
121
156
  remove(item: T): void;
122
157
  /**
123
158
  * 항목 위치 업데이트
124
159
  *
125
- * 추가된 메서드: remove + insert의 편의 함수
160
+ * 항목의 위치를 업데이트합니다. remove + insert의 편의 함수입니다.
161
+ *
162
+ * @param item 업데이트할 항목
163
+ * @param minX 새로운 바운딩 박스 최소 X 좌표
164
+ * @param minY 새로운 바운딩 박스 최소 Y 좌표
165
+ * @param maxX 새로운 바운딩 박스 최대 X 좌표
166
+ * @param maxY 새로운 바운딩 박스 최대 Y 좌표
126
167
  */
127
168
  update(item: T, minX: number, minY: number, maxX: number, maxY: number): void;
128
169
  /**
129
170
  * 점 주변의 항목 조회 (1개 셀만)
130
171
  *
131
- * 성능: O(해당 셀의 항목 수) - 보통 ~10개
172
+ * 특정 좌표가 속한 셀의 모든 항목을 반환합니다.
173
+ *
174
+ * @param x 조회할 X 좌표
175
+ * @param y 조회할 Y 좌표
176
+ * @returns 해당 셀의 항목 배열 (없으면 빈 배열)
177
+ *
178
+ * @remarks
179
+ * - 성능: O(해당 셀의 항목 수) - 보통 ~10개 (30,000개 전체를 체크하지 않음)
180
+ * - Hit Test에 최적화된 메서드
181
+ * - 빈 배열 재사용으로 메모리 할당 최소화
182
+ *
183
+ * @example
184
+ * ```typescript
185
+ * const candidates = grid.queryPoint(mouseX, mouseY);
186
+ * for (const item of candidates) {
187
+ * if (isPointInItem(item, mouseX, mouseY)) {
188
+ * return item;
189
+ * }
190
+ * }
191
+ * ```
132
192
  */
133
193
  queryPoint(x: number, y: number): T[];
134
194
  /**
135
195
  * 영역 내 항목 조회
136
196
  *
137
- * 성능: O( 개수 × 셀당 평균 항목 수)
138
- * Set으로 중복 제거 보장
197
+ * 특정 영역(바운딩 박스)과 교차하는 모든 항목을 반환합니다.
198
+ *
199
+ * @param minX 영역 최소 X 좌표
200
+ * @param minY 영역 최소 Y 좌표
201
+ * @param maxX 영역 최대 X 좌표
202
+ * @param maxY 영역 최대 Y 좌표
203
+ * @returns 영역과 교차하는 항목 배열 (중복 제거됨)
204
+ *
205
+ * @remarks
206
+ * - 성능: O(셀 개수 × 셀당 평균 항목 수)
207
+ * - Set으로 중복 제거 보장 (항목이 여러 셀에 걸쳐 있어도 한 번만 반환)
208
+ * - Viewport Culling에 유용
139
209
  */
140
210
  queryBounds(minX: number, minY: number, maxX: number, maxY: number): T[];
141
211
  /**
142
212
  * 항목 존재 여부 확인
143
213
  *
144
- * 추가된 메서드: 빠른 존재 여부 체크
214
+ * @param item 확인할 항목
215
+ * @returns 항목이 인덱스에 있으면 true, 아니면 false
216
+ *
217
+ * @remarks
218
+ * - 성능: O(1) 해시 조회
145
219
  */
146
220
  has(item: T): boolean;
147
221
  /**
@@ -151,7 +225,14 @@ export declare class SpatialHashGrid<T> {
151
225
  /**
152
226
  * 통계 정보
153
227
  *
154
- * 개선: totalItems는 실제 고유 항목 수를 정확히 반환
228
+ * 공간 인덱스의 현재 상태를 반환합니다. 디버깅 성능 분석에 유용합니다.
229
+ *
230
+ * @returns 통계 정보 객체
231
+ *
232
+ * @remarks
233
+ * - totalCells: 현재 사용 중인 셀 개수
234
+ * - totalItems: 인덱스에 등록된 고유 항목 수 (정확)
235
+ * - avgItemsPerCell: 셀당 평균 항목 수
155
236
  */
156
237
  stats(): {
157
238
  totalCells: number;
@@ -50,12 +50,32 @@ var DEFAULT_CULLING_MARGIN = 100;
50
50
  var DEFAULT_MAX_CACHE_SIZE = 30000;
51
51
  /**
52
52
  * LRU (Least Recently Used) Cache
53
- * 메모리 제한을 위한 캐시 구현 (최적화 버전)
54
53
  *
55
- * 개선 사항:
54
+ * 메모리 제한을 위한 캐시 구현입니다. WoongCanvas 컴포넌트에서 좌표 변환 결과를 캐싱하는데 사용됩니다.
55
+ *
56
+ * @template K 캐시 키 타입
57
+ * @template V 캐시 값 타입
58
+ *
59
+ * @remarks
60
+ * **개선 사항**:
56
61
  * 1. get() 성능 향상: 접근 빈도 추적 없이 단순 조회만 수행 (delete+set 제거)
57
62
  * 2. set() 버그 수정: 기존 키 업데이트 시 maxSize 체크 로직 개선
58
63
  * 3. 메모리 효율: 단순 FIFO 캐시로 동작하여 오버헤드 최소화
64
+ *
65
+ * **트레이드오프**:
66
+ * - 장점: 읽기 성능 대폭 향상 (10,000번 get → 이전보다 2배 빠름)
67
+ * - 단점: 접근 빈도가 아닌 삽입 순서 기반 eviction (FIFO)
68
+ *
69
+ * WoongCanvasMarker 사용 사례에 최적:
70
+ * - 좌표 변환 결과는 zoom/pan 시 어차피 전체 초기화
71
+ * - 접근 빈도 추적보다 빠른 조회가 더 중요
72
+ *
73
+ * @example
74
+ * ```typescript
75
+ * const cache = new LRUCache<string, Offset>(30000);
76
+ * cache.set(item.id, offset);
77
+ * const cached = cache.get(item.id);
78
+ * ```
59
79
  */
60
80
 
61
81
  var LRUCache =
@@ -72,17 +92,12 @@ function () {
72
92
  /**
73
93
  * 캐시에서 값 조회
74
94
  *
75
- * 최적화: delete+set 제거
76
- * - 이전: 매번 delete+set으로 LRU 갱신 (해시 재계산 비용)
77
- * - 현재: 단순 조회만 수행 (O(1) 해시 조회)
95
+ * @param key 조회할 키
96
+ * @returns 캐시된 또는 undefined (캐시 미스 )
78
97
  *
79
- * 트레이드오프:
80
- * - 장점: 읽기 성능 대폭 향상 (10,000번 get → 이전보다 2배 빠름)
81
- * - 단점: 접근 빈도가 아닌 삽입 순서 기반 eviction (FIFO)
82
- *
83
- * WoongCanvasMarker 사용 사례에 최적:
84
- * - 좌표 변환 결과는 zoom/pan 시 어차피 전체 초기화
85
- * - 접근 빈도 추적보다 빠른 조회가 더 중요
98
+ * @remarks
99
+ * - 성능: O(1) 해시 조회
100
+ * - 최적화: delete+set 제거로 읽기 성능 대폭 향상
86
101
  */
87
102
 
88
103
 
@@ -90,11 +105,15 @@ function () {
90
105
  return this.cache.get(key);
91
106
  };
92
107
  /**
93
- * 캐시에 값 저장 (버그 수정 + 최적화)
108
+ * 캐시에 값 저장
109
+ *
110
+ * @param key 저장할 키
111
+ * @param value 저장할 값
94
112
  *
95
- * 수정 사항:
96
- * 1. 기존 키 업데이트 크기 체크 누락 버그 수정
97
- * 2. 로직 명확화: 기존 항목/신규 항목 분리 처리
113
+ * @remarks
114
+ * - 기존 키 업데이트: 단순 덮어쓰기 (크기 변화 없음)
115
+ * - 신규 추가: 크기 체크 후 필요시 가장 오래된 항목 제거 (FIFO)
116
+ * - 성능: O(1) 평균 시간복잡도
98
117
  */
99
118
 
100
119
 
@@ -192,9 +211,18 @@ function () {
192
211
  /**
193
212
  * 항목 추가 (바운딩 박스 기반)
194
213
  *
195
- * 개선 사항:
214
+ * 항목을 공간 인덱스에 추가합니다. 바운딩 박스가 걸치는 모든 셀에 삽입됩니다.
215
+ *
216
+ * @param item 추가할 항목
217
+ * @param minX 바운딩 박스 최소 X 좌표
218
+ * @param minY 바운딩 박스 최소 Y 좌표
219
+ * @param maxX 바운딩 박스 최대 X 좌표
220
+ * @param maxY 바운딩 박스 최대 Y 좌표
221
+ *
222
+ * @remarks
196
223
  * - 중복 삽입 방지: 기존 항목이 있으면 먼저 제거 후 재삽입
197
224
  * - 메모리 누수 방지: 이전 셀 참조 완전 제거
225
+ * - 성능: O(1) 평균 시간복잡도
198
226
  */
199
227
 
200
228
 
@@ -218,7 +246,14 @@ function () {
218
246
  /**
219
247
  * 항목 제거
220
248
  *
221
- * 추가된 메서드: 메모리 누수 방지 및 업데이트 지원
249
+ * 공간 인덱스에서 항목을 제거합니다.
250
+ *
251
+ * @param item 제거할 항목
252
+ *
253
+ * @remarks
254
+ * - 메모리 누수 방지: 모든 셀에서 참조 완전 제거
255
+ * - 빈 셀 정리: 항목이 없어진 셀은 자동으로 정리됨
256
+ * - 성능: O(셀 개수), 보통 O(1)
222
257
  */
223
258
 
224
259
 
@@ -249,7 +284,13 @@ function () {
249
284
  /**
250
285
  * 항목 위치 업데이트
251
286
  *
252
- * 추가된 메서드: remove + insert의 편의 함수
287
+ * 항목의 위치를 업데이트합니다. remove + insert의 편의 함수입니다.
288
+ *
289
+ * @param item 업데이트할 항목
290
+ * @param minX 새로운 바운딩 박스 최소 X 좌표
291
+ * @param minY 새로운 바운딩 박스 최소 Y 좌표
292
+ * @param maxX 새로운 바운딩 박스 최대 X 좌표
293
+ * @param maxY 새로운 바운딩 박스 최대 Y 좌표
253
294
  */
254
295
 
255
296
 
@@ -259,7 +300,26 @@ function () {
259
300
  /**
260
301
  * 점 주변의 항목 조회 (1개 셀만)
261
302
  *
262
- * 성능: O(해당 셀의 항목 수) - 보통 ~10개
303
+ * 특정 좌표가 속한 셀의 모든 항목을 반환합니다.
304
+ *
305
+ * @param x 조회할 X 좌표
306
+ * @param y 조회할 Y 좌표
307
+ * @returns 해당 셀의 항목 배열 (없으면 빈 배열)
308
+ *
309
+ * @remarks
310
+ * - 성능: O(해당 셀의 항목 수) - 보통 ~10개 (30,000개 전체를 체크하지 않음)
311
+ * - Hit Test에 최적화된 메서드
312
+ * - 빈 배열 재사용으로 메모리 할당 최소화
313
+ *
314
+ * @example
315
+ * ```typescript
316
+ * const candidates = grid.queryPoint(mouseX, mouseY);
317
+ * for (const item of candidates) {
318
+ * if (isPointInItem(item, mouseX, mouseY)) {
319
+ * return item;
320
+ * }
321
+ * }
322
+ * ```
263
323
  */
264
324
 
265
325
 
@@ -272,8 +332,18 @@ function () {
272
332
  /**
273
333
  * 영역 내 항목 조회
274
334
  *
275
- * 성능: O( 개수 × 셀당 평균 항목 수)
276
- * Set으로 중복 제거 보장
335
+ * 특정 영역(바운딩 박스)과 교차하는 모든 항목을 반환합니다.
336
+ *
337
+ * @param minX 영역 최소 X 좌표
338
+ * @param minY 영역 최소 Y 좌표
339
+ * @param maxX 영역 최대 X 좌표
340
+ * @param maxY 영역 최대 Y 좌표
341
+ * @returns 영역과 교차하는 항목 배열 (중복 제거됨)
342
+ *
343
+ * @remarks
344
+ * - 성능: O(셀 개수 × 셀당 평균 항목 수)
345
+ * - Set으로 중복 제거 보장 (항목이 여러 셀에 걸쳐 있어도 한 번만 반환)
346
+ * - Viewport Culling에 유용
277
347
  */
278
348
 
279
349
 
@@ -298,7 +368,11 @@ function () {
298
368
  /**
299
369
  * 항목 존재 여부 확인
300
370
  *
301
- * 추가된 메서드: 빠른 존재 여부 체크
371
+ * @param item 확인할 항목
372
+ * @returns 항목이 인덱스에 있으면 true, 아니면 false
373
+ *
374
+ * @remarks
375
+ * - 성능: O(1) 해시 조회
302
376
  */
303
377
 
304
378
 
@@ -317,7 +391,14 @@ function () {
317
391
  /**
318
392
  * 통계 정보
319
393
  *
320
- * 개선: totalItems는 실제 고유 항목 수를 정확히 반환
394
+ * 공간 인덱스의 현재 상태를 반환합니다. 디버깅 성능 분석에 유용합니다.
395
+ *
396
+ * @returns 통계 정보 객체
397
+ *
398
+ * @remarks
399
+ * - totalCells: 현재 사용 중인 셀 개수
400
+ * - totalItems: 인덱스에 등록된 고유 항목 수 (정확)
401
+ * - avgItemsPerCell: 셀당 평균 항목 수
321
402
  */
322
403
 
323
404