@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.
- package/dist/components/mint-map/core/advanced/shared/context.d.ts +71 -2
- package/dist/components/mint-map/core/advanced/shared/context.js +74 -1
- package/dist/components/mint-map/core/advanced/shared/helpers.d.ts +28 -0
- package/dist/components/mint-map/core/advanced/shared/helpers.js +52 -0
- package/dist/components/mint-map/core/advanced/shared/hooks.d.ts +144 -0
- package/dist/components/mint-map/core/advanced/shared/hooks.js +283 -0
- package/dist/components/mint-map/core/advanced/shared/index.d.ts +3 -0
- package/dist/components/mint-map/core/advanced/shared/performance.d.ts +105 -24
- package/dist/components/mint-map/core/advanced/shared/performance.js +105 -24
- package/dist/components/mint-map/core/advanced/shared/utils.d.ts +128 -14
- package/dist/components/mint-map/core/advanced/shared/utils.js +128 -14
- package/dist/components/mint-map/core/advanced/shared/viewport.d.ts +72 -0
- package/dist/components/mint-map/core/advanced/shared/viewport.js +81 -0
- package/dist/components/mint-map/core/advanced/woongCanvasMarker/WoongCanvasMarker.js +142 -209
- package/dist/components/mint-map/core/advanced/woongCanvasPolygon/WoongCanvasPolygon.d.ts +0 -4
- package/dist/components/mint-map/core/advanced/woongCanvasPolygon/WoongCanvasPolygon.js +122 -217
- package/dist/components/mint-map/core/advanced/woongCanvasPolygon/renderer.d.ts +64 -5
- package/dist/components/mint-map/core/advanced/woongCanvasPolygon/renderer.js +81 -20
- package/dist/index.es.js +1066 -511
- package/dist/index.js +11 -0
- package/dist/index.umd.js +1072 -509
- 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;
|
|
@@ -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
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* - 현재: 단순 조회만 수행 (O(1) 해시 조회)
|
|
77
|
+
* @param key 조회할 키
|
|
78
|
+
* @returns 캐시된 값 또는 undefined (캐시 미스 시)
|
|
60
79
|
*
|
|
61
|
-
*
|
|
62
|
-
* -
|
|
63
|
-
* -
|
|
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
|
-
*
|
|
75
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
138
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* - 현재: 단순 조회만 수행 (O(1) 해시 조회)
|
|
95
|
+
* @param key 조회할 키
|
|
96
|
+
* @returns 캐시된 값 또는 undefined (캐시 미스 시)
|
|
78
97
|
*
|
|
79
|
-
*
|
|
80
|
-
* -
|
|
81
|
-
* -
|
|
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
|
-
*
|
|
97
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
276
|
-
*
|
|
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
|
-
*
|
|
394
|
+
* 공간 인덱스의 현재 상태를 반환합니다. 디버깅 및 성능 분석에 유용합니다.
|
|
395
|
+
*
|
|
396
|
+
* @returns 통계 정보 객체
|
|
397
|
+
*
|
|
398
|
+
* @remarks
|
|
399
|
+
* - totalCells: 현재 사용 중인 셀 개수
|
|
400
|
+
* - totalItems: 인덱스에 등록된 고유 항목 수 (정확)
|
|
401
|
+
* - avgItemsPerCell: 셀당 평균 항목 수
|
|
321
402
|
*/
|
|
322
403
|
|
|
323
404
|
|