@mint-ui/map 1.2.0-test.35 → 1.2.0-test.36
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 +9 -71
- package/dist/components/mint-map/core/advanced/shared/context.js +43 -137
- package/dist/components/mint-map/core/advanced/shared/helpers.d.ts +5 -13
- package/dist/components/mint-map/core/advanced/shared/helpers.js +8 -20
- package/dist/components/mint-map/core/advanced/shared/hooks.d.ts +6 -76
- package/dist/components/mint-map/core/advanced/shared/hooks.js +18 -112
- package/dist/components/mint-map/core/advanced/shared/performance.d.ts +9 -188
- package/dist/components/mint-map/core/advanced/shared/performance.js +53 -229
- package/dist/components/mint-map/core/advanced/shared/types.d.ts +18 -153
- package/dist/components/mint-map/core/advanced/shared/types.js +0 -1
- package/dist/components/mint-map/core/advanced/shared/utils.d.ts +21 -126
- package/dist/components/mint-map/core/advanced/shared/utils.js +43 -151
- package/dist/components/mint-map/core/advanced/shared/viewport.d.ts +4 -34
- package/dist/components/mint-map/core/advanced/shared/viewport.js +4 -34
- package/dist/components/mint-map/core/advanced/woongCanvasMarker/WoongCanvasMarker.d.ts +22 -74
- package/dist/components/mint-map/core/advanced/woongCanvasMarker/WoongCanvasMarker.js +122 -516
- package/dist/components/mint-map/core/advanced/woongCanvasPolygon/WoongCanvasPolygon.d.ts +26 -76
- package/dist/components/mint-map/core/advanced/woongCanvasPolygon/WoongCanvasPolygon.js +118 -432
- package/dist/components/mint-map/core/advanced/woongCanvasPolygon/renderer.d.ts +3 -3
- package/dist/index.es.js +409 -1632
- package/dist/index.umd.js +409 -1632
- package/package.json +1 -1
|
@@ -7,33 +7,9 @@ var tslib = require('tslib');
|
|
|
7
7
|
/**
|
|
8
8
|
* 지도 이벤트 핸들러 생성 함수
|
|
9
9
|
*
|
|
10
|
-
* 지도 이동, 줌, 드래그 등의 이벤트를 처리하는 핸들러들을 생성합니다.
|
|
11
|
-
*
|
|
12
10
|
* @template T 마커/폴리곤 데이터의 추가 속성 타입
|
|
13
11
|
* @param deps 이벤트 핸들러 생성에 필요한 의존성
|
|
14
12
|
* @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
13
|
*/
|
|
38
14
|
|
|
39
15
|
var createMapEventHandlers = function (deps) {
|
|
@@ -45,14 +21,7 @@ var createMapEventHandlers = function (deps) {
|
|
|
45
21
|
accumTranslateRef = deps.accumTranslateRef,
|
|
46
22
|
offsetCacheRef = deps.offsetCacheRef,
|
|
47
23
|
boundingBoxCacheRef = deps.boundingBoxCacheRef,
|
|
48
|
-
renderAllImmediate = deps.renderAllImmediate;
|
|
49
|
-
/**
|
|
50
|
-
* 지도 이동/줌 완료 시 처리
|
|
51
|
-
*
|
|
52
|
-
* - 캐시 초기화: 좌표 변환 결과가 변경되었으므로 캐시 무효화
|
|
53
|
-
* - 마커 위치 업데이트: 새로운 지도 위치에 맞게 마커 재배치
|
|
54
|
-
* - 렌더링: 새 위치에서 전체 렌더링 수행
|
|
55
|
-
*/
|
|
24
|
+
renderAllImmediate = deps.renderAllImmediate; // 지도 이동/줌 완료 시 처리 (캐시 초기화 및 렌더링)
|
|
56
25
|
|
|
57
26
|
var handleIdle = function () {
|
|
58
27
|
prevCenterOffsetRef.current = null;
|
|
@@ -70,45 +39,34 @@ var createMapEventHandlers = function (deps) {
|
|
|
70
39
|
position: bounds.nw
|
|
71
40
|
}, options);
|
|
72
41
|
|
|
73
|
-
markerRef.current && controller.updateMarker(markerRef.current, markerOptions); // transform 제거 전에 새 데이터로 즉시 렌더링 (
|
|
42
|
+
markerRef.current && controller.updateMarker(markerRef.current, markerOptions); // transform 제거 전에 새 데이터로 즉시 렌더링 (transform 제거 시 잠깐 빈 화면이 보이는 것 방지)
|
|
74
43
|
|
|
75
44
|
if (containerRef.current) {
|
|
76
45
|
containerRef.current.style.transform = '';
|
|
77
46
|
containerRef.current.style.visibility = '';
|
|
78
|
-
} // 새 위치에서 렌더링
|
|
47
|
+
} // 새 위치에서 렌더링 (캐시는 이미 초기화됨)
|
|
79
48
|
|
|
80
49
|
|
|
81
50
|
renderAllImmediate();
|
|
82
|
-
};
|
|
83
|
-
/**
|
|
84
|
-
* 줌 시작 시 처리 (일시적으로 숨김)
|
|
85
|
-
*/
|
|
51
|
+
}; // 줌 시작 시 처리 (일시적으로 숨김)
|
|
86
52
|
|
|
87
53
|
|
|
88
54
|
var handleZoomStart = function () {
|
|
89
|
-
if (containerRef.current)
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
};
|
|
93
|
-
/**
|
|
94
|
-
* 줌 종료 시 처리 (다시 표시)
|
|
95
|
-
*/
|
|
55
|
+
if (!containerRef.current) return;
|
|
56
|
+
containerRef.current.style.visibility = 'hidden';
|
|
57
|
+
}; // 줌 종료 시 처리 (다시 표시)
|
|
96
58
|
|
|
97
59
|
|
|
98
60
|
var handleZoomEnd = function () {
|
|
99
|
-
if (containerRef.current)
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
};
|
|
103
|
-
/**
|
|
104
|
-
* 지도 중심 변경 시 처리 (transform으로 이동 추적)
|
|
105
|
-
*/
|
|
61
|
+
if (!containerRef.current) return;
|
|
62
|
+
containerRef.current.style.visibility = '';
|
|
63
|
+
}; // 지도 중심 변경 시 처리 (transform으로 이동 추적, 캐시 유지)
|
|
106
64
|
|
|
107
65
|
|
|
108
66
|
var handleCenterChanged = function () {
|
|
109
67
|
var center = controller.getCurrBounds().getCenter();
|
|
110
68
|
var curr = controller.positionToOffset(center);
|
|
111
|
-
var prev = prevCenterOffsetRef.current;
|
|
69
|
+
var prev = prevCenterOffsetRef.current; // 첫 번째 호출 시 이전 위치 저장만 하고 종료
|
|
112
70
|
|
|
113
71
|
if (!prev) {
|
|
114
72
|
prevCenterOffsetRef.current = {
|
|
@@ -116,10 +74,12 @@ var createMapEventHandlers = function (deps) {
|
|
|
116
74
|
y: curr.y
|
|
117
75
|
};
|
|
118
76
|
return;
|
|
119
|
-
}
|
|
77
|
+
} // 이전 위치와 현재 위치의 차이 계산 (이동 거리)
|
|
78
|
+
|
|
120
79
|
|
|
121
80
|
var dx = prev.x - curr.x;
|
|
122
|
-
var dy = prev.y - curr.y;
|
|
81
|
+
var dy = prev.y - curr.y; // 누적 이동 거리 저장 (transform으로 화면만 이동, 캐시는 유지하여 성능 최적화)
|
|
82
|
+
|
|
123
83
|
accumTranslateRef.current = {
|
|
124
84
|
x: accumTranslateRef.current.x + dx,
|
|
125
85
|
y: accumTranslateRef.current.y + dy
|
|
@@ -127,23 +87,15 @@ var createMapEventHandlers = function (deps) {
|
|
|
127
87
|
prevCenterOffsetRef.current = {
|
|
128
88
|
x: curr.x,
|
|
129
89
|
y: curr.y
|
|
130
|
-
};
|
|
90
|
+
}; // CSS transform으로 컨테이너 이동 (캐시된 좌표는 그대로 유지)
|
|
131
91
|
|
|
132
92
|
if (containerRef.current) {
|
|
133
93
|
containerRef.current.style.transform = "translate(".concat(accumTranslateRef.current.x, "px, ").concat(accumTranslateRef.current.y, "px)");
|
|
134
94
|
}
|
|
135
95
|
};
|
|
136
|
-
/**
|
|
137
|
-
* 드래그 시작 처리
|
|
138
|
-
*/
|
|
139
|
-
|
|
140
96
|
|
|
141
97
|
var handleDragStart = function () {// 커서는 각 컴포넌트에서 처리
|
|
142
98
|
};
|
|
143
|
-
/**
|
|
144
|
-
* 드래그 종료 처리
|
|
145
|
-
*/
|
|
146
|
-
|
|
147
99
|
|
|
148
100
|
var handleDragEnd = function () {// 커서는 각 컴포넌트에서 처리
|
|
149
101
|
};
|
|
@@ -160,26 +112,10 @@ var createMapEventHandlers = function (deps) {
|
|
|
160
112
|
/**
|
|
161
113
|
* 공간 인덱스 빌드 (빠른 Hit Test를 위한 자료구조)
|
|
162
114
|
*
|
|
163
|
-
* Spatial Hash Grid에 모든 데이터의 바운딩 박스를 삽입합니다.
|
|
164
|
-
* 이를 통해 클릭/호버 시 O(1) 수준의 빠른 Hit Test가 가능합니다.
|
|
165
|
-
*
|
|
166
115
|
* @template T 마커/폴리곤 데이터의 추가 속성 타입
|
|
167
116
|
* @param data 공간 인덱스에 삽입할 데이터 배열
|
|
168
117
|
* @param spatialIndex Spatial Hash Grid 인스턴스
|
|
169
118
|
* @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
119
|
*/
|
|
184
120
|
|
|
185
121
|
var buildSpatialIndex = function (data, spatialIndex, computeBoundingBox) {
|
|
@@ -195,29 +131,13 @@ var buildSpatialIndex = function (data, spatialIndex, computeBoundingBox) {
|
|
|
195
131
|
}
|
|
196
132
|
};
|
|
197
133
|
/**
|
|
198
|
-
* 선택 상태 동기화
|
|
199
|
-
*
|
|
200
|
-
* 데이터 변경 시 선택된 항목의 참조를 최신 데이터로 업데이트합니다.
|
|
201
|
-
* 화면 밖에 있는 선택된 항목도 선택 상태를 유지합니다.
|
|
134
|
+
* 선택 상태 동기화 (화면 밖 데이터도 선택 상태 유지)
|
|
202
135
|
*
|
|
203
136
|
* @template T 마커/폴리곤 데이터의 추가 속성 타입
|
|
204
137
|
* @param data 최신 데이터 배열
|
|
205
138
|
* @param selectedIds 선택된 항목 ID Set
|
|
206
139
|
* @param selectedItemsMap 현재 선택된 항목 Map
|
|
207
140
|
* @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
141
|
*/
|
|
222
142
|
|
|
223
143
|
var syncSelectedItems = function (data, selectedIds, selectedItemsMap) {
|
|
@@ -245,24 +165,10 @@ var syncSelectedItems = function (data, selectedIds, selectedItemsMap) {
|
|
|
245
165
|
/**
|
|
246
166
|
* 외부 selectedItems를 내부 상태로 동기화
|
|
247
167
|
*
|
|
248
|
-
* 외부에서 전달된 selectedItems prop을 내부 ref 상태로 동기화합니다.
|
|
249
|
-
*
|
|
250
168
|
* @template T 마커/폴리곤 데이터의 추가 속성 타입
|
|
251
|
-
* @param externalSelectedItems 외부에서 전달된 선택된 항목 배열
|
|
169
|
+
* @param externalSelectedItems 외부에서 전달된 선택된 항목 배열
|
|
252
170
|
* @param selectedIdsRef 선택된 ID Set ref
|
|
253
171
|
* @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
172
|
*/
|
|
267
173
|
|
|
268
174
|
var syncExternalSelectedItems = function (externalSelectedItems, selectedIdsRef, selectedItemsMapRef) {
|
|
@@ -1,98 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 공간 인덱스 그리드 셀 크기 (
|
|
2
|
+
* 공간 인덱스 그리드 셀 크기 (픽셀 단위)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* - 목표: 클릭 시 셀당 10~30개 항목만 체크 (빠른 Hit Test)
|
|
6
|
-
* - 화면 크기: 1920×1080 기준
|
|
7
|
-
* - 30,000개 항목 → 50px 셀 크기 = 약 800개 셀 = 셀당 ~37개
|
|
8
|
-
*
|
|
9
|
-
* 성능 비교 (30,000개 기준):
|
|
10
|
-
* - 200px: 셀당 ~577개 → Hit Test O(577) ❌ 느림
|
|
11
|
-
* - 50px: 셀당 ~37개 → Hit Test O(37) ✅ 15배 빠름!
|
|
12
|
-
*
|
|
13
|
-
* 트레이드오프:
|
|
14
|
-
* - 작을수록: Hit Test 빠름, 메모리 사용량 증가
|
|
15
|
-
* - 클수록: 메모리 효율적, Hit Test 느림
|
|
4
|
+
* @default 50
|
|
16
5
|
*/
|
|
17
6
|
export declare const SPATIAL_GRID_CELL_SIZE = 50;
|
|
18
7
|
/**
|
|
19
|
-
* 뷰포트 컬링 여유 공간 (
|
|
8
|
+
* 뷰포트 컬링 여유 공간 (픽셀 단위)
|
|
20
9
|
*
|
|
21
|
-
*
|
|
22
|
-
* 30,000개 중 실제 렌더링: 화면에 보이는 1,000~3,000개만
|
|
10
|
+
* @default 100
|
|
23
11
|
*/
|
|
24
12
|
export declare const DEFAULT_CULLING_MARGIN = 100;
|
|
25
13
|
/**
|
|
26
14
|
* LRU 캐시 최대 항목 수
|
|
27
15
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* 최적값 계산:
|
|
31
|
-
* - 전체 항목: 30,000개
|
|
32
|
-
* - 캐시 크기: 30,000개 → 100% 히트율 (메모리: ~2.4MB)
|
|
33
|
-
*
|
|
34
|
-
* 메모리 사용량 (항목당 ~80 bytes):
|
|
35
|
-
* - 10,000개: ~800KB → 캐시 히트율 33% ❌
|
|
36
|
-
* - 30,000개: ~2.4MB → 캐시 히트율 100% ✅
|
|
37
|
-
*
|
|
38
|
-
* zoom/pan 시 어차피 clear() 호출되므로 메모리 누적 없음
|
|
16
|
+
* @default 30000
|
|
39
17
|
*/
|
|
40
18
|
export declare const DEFAULT_MAX_CACHE_SIZE = 30000;
|
|
41
19
|
/**
|
|
42
|
-
* LRU (Least Recently Used)
|
|
20
|
+
* LRU Cache (Least Recently Used)
|
|
43
21
|
*
|
|
44
|
-
*
|
|
22
|
+
* 좌표 변환 결과를 캐싱하기 위한 캐시 구현
|
|
45
23
|
*
|
|
46
24
|
* @template K 캐시 키 타입
|
|
47
25
|
* @template V 캐시 값 타입
|
|
48
|
-
*
|
|
49
|
-
* @remarks
|
|
50
|
-
* **개선 사항**:
|
|
51
|
-
* 1. get() 성능 향상: 접근 빈도 추적 없이 단순 조회만 수행 (delete+set 제거)
|
|
52
|
-
* 2. set() 버그 수정: 기존 키 업데이트 시 maxSize 체크 로직 개선
|
|
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
|
-
* ```
|
|
69
26
|
*/
|
|
70
27
|
export declare class LRUCache<K, V> {
|
|
71
28
|
private cache;
|
|
72
29
|
private maxSize;
|
|
73
30
|
constructor(maxSize?: number);
|
|
74
|
-
/**
|
|
75
|
-
* 캐시에서 값 조회
|
|
76
|
-
*
|
|
77
|
-
* @param key 조회할 키
|
|
78
|
-
* @returns 캐시된 값 또는 undefined (캐시 미스 시)
|
|
79
|
-
*
|
|
80
|
-
* @remarks
|
|
81
|
-
* - 성능: O(1) 해시 조회
|
|
82
|
-
* - 최적화: delete+set 제거로 읽기 성능 대폭 향상
|
|
83
|
-
*/
|
|
84
31
|
get(key: K): V | undefined;
|
|
85
|
-
/**
|
|
86
|
-
* 캐시에 값 저장
|
|
87
|
-
*
|
|
88
|
-
* @param key 저장할 키
|
|
89
|
-
* @param value 저장할 값
|
|
90
|
-
*
|
|
91
|
-
* @remarks
|
|
92
|
-
* - 기존 키 업데이트: 단순 덮어쓰기 (크기 변화 없음)
|
|
93
|
-
* - 신규 키 추가: 크기 체크 후 필요시 가장 오래된 항목 제거 (FIFO)
|
|
94
|
-
* - 성능: O(1) 평균 시간복잡도
|
|
95
|
-
*/
|
|
96
32
|
set(key: K, value: V): void;
|
|
97
33
|
clear(): void;
|
|
98
34
|
size(): number;
|
|
@@ -100,140 +36,25 @@ export declare class LRUCache<K, V> {
|
|
|
100
36
|
}
|
|
101
37
|
/**
|
|
102
38
|
* Spatial Hash Grid (공간 해시 그리드)
|
|
103
|
-
* 공간 인덱싱을 위한 그리드 기반 자료구조 (개선 버전)
|
|
104
39
|
*
|
|
105
|
-
*
|
|
106
|
-
* 1. 중복 삽입 방지: 같은 항목을 여러 번 insert 해도 안전
|
|
107
|
-
* 2. 메모리 누수 방지: 기존 항목 자동 제거
|
|
108
|
-
* 3. 성능 최적화: 불필요한 배열 생성 최소화
|
|
40
|
+
* 빠른 Hit Test를 위한 그리드 기반 공간 인덱싱 자료구조
|
|
109
41
|
*
|
|
110
|
-
*
|
|
111
|
-
* - 빠른 Hit Test (마우스 클릭 시 어떤 마커/폴리곤인지 찾기)
|
|
112
|
-
* - 30,000개 항목 → 클릭 위치 주변 ~10개만 체크 (3,000배 빠름)
|
|
42
|
+
* @template T 인덱싱할 항목 타입
|
|
113
43
|
*/
|
|
114
44
|
export declare class SpatialHashGrid<T> {
|
|
115
45
|
private cellSize;
|
|
116
46
|
private grid;
|
|
117
47
|
private itemToCells;
|
|
118
48
|
constructor(cellSize?: number);
|
|
119
|
-
/**
|
|
120
|
-
* 셀 키 생성 (x, y 좌표 → 그리드 셀 ID)
|
|
121
|
-
*/
|
|
122
49
|
private getCellKey;
|
|
123
|
-
/**
|
|
124
|
-
* 바운딩 박스가 걸치는 모든 셀 키 배열 반환
|
|
125
|
-
*/
|
|
126
50
|
private getCellsForBounds;
|
|
127
|
-
/**
|
|
128
|
-
* 항목 추가 (바운딩 박스 기반)
|
|
129
|
-
*
|
|
130
|
-
* 항목을 공간 인덱스에 추가합니다. 바운딩 박스가 걸치는 모든 셀에 삽입됩니다.
|
|
131
|
-
*
|
|
132
|
-
* @param item 추가할 항목
|
|
133
|
-
* @param minX 바운딩 박스 최소 X 좌표
|
|
134
|
-
* @param minY 바운딩 박스 최소 Y 좌표
|
|
135
|
-
* @param maxX 바운딩 박스 최대 X 좌표
|
|
136
|
-
* @param maxY 바운딩 박스 최대 Y 좌표
|
|
137
|
-
*
|
|
138
|
-
* @remarks
|
|
139
|
-
* - 중복 삽입 방지: 기존 항목이 있으면 먼저 제거 후 재삽입
|
|
140
|
-
* - 메모리 누수 방지: 이전 셀 참조 완전 제거
|
|
141
|
-
* - 성능: O(1) 평균 시간복잡도
|
|
142
|
-
*/
|
|
143
51
|
insert(item: T, minX: number, minY: number, maxX: number, maxY: number): void;
|
|
144
|
-
/**
|
|
145
|
-
* 항목 제거
|
|
146
|
-
*
|
|
147
|
-
* 공간 인덱스에서 항목을 제거합니다.
|
|
148
|
-
*
|
|
149
|
-
* @param item 제거할 항목
|
|
150
|
-
*
|
|
151
|
-
* @remarks
|
|
152
|
-
* - 메모리 누수 방지: 모든 셀에서 참조 완전 제거
|
|
153
|
-
* - 빈 셀 정리: 항목이 없어진 셀은 자동으로 정리됨
|
|
154
|
-
* - 성능: O(셀 개수), 보통 O(1)
|
|
155
|
-
*/
|
|
156
52
|
remove(item: T): void;
|
|
157
|
-
/**
|
|
158
|
-
* 항목 위치 업데이트
|
|
159
|
-
*
|
|
160
|
-
* 항목의 위치를 업데이트합니다. remove + insert의 편의 함수입니다.
|
|
161
|
-
*
|
|
162
|
-
* @param item 업데이트할 항목
|
|
163
|
-
* @param minX 새로운 바운딩 박스 최소 X 좌표
|
|
164
|
-
* @param minY 새로운 바운딩 박스 최소 Y 좌표
|
|
165
|
-
* @param maxX 새로운 바운딩 박스 최대 X 좌표
|
|
166
|
-
* @param maxY 새로운 바운딩 박스 최대 Y 좌표
|
|
167
|
-
*/
|
|
168
53
|
update(item: T, minX: number, minY: number, maxX: number, maxY: number): void;
|
|
169
|
-
/**
|
|
170
|
-
* 점 주변의 항목 조회 (1개 셀만)
|
|
171
|
-
*
|
|
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
|
-
* ```
|
|
192
|
-
*/
|
|
193
54
|
queryPoint(x: number, y: number): T[];
|
|
194
|
-
/**
|
|
195
|
-
* 영역 내 항목 조회
|
|
196
|
-
*
|
|
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에 유용
|
|
209
|
-
*/
|
|
210
55
|
queryBounds(minX: number, minY: number, maxX: number, maxY: number): T[];
|
|
211
|
-
/**
|
|
212
|
-
* 항목 존재 여부 확인
|
|
213
|
-
*
|
|
214
|
-
* @param item 확인할 항목
|
|
215
|
-
* @returns 항목이 인덱스에 있으면 true, 아니면 false
|
|
216
|
-
*
|
|
217
|
-
* @remarks
|
|
218
|
-
* - 성능: O(1) 해시 조회
|
|
219
|
-
*/
|
|
220
56
|
has(item: T): boolean;
|
|
221
|
-
/**
|
|
222
|
-
* 전체 초기화
|
|
223
|
-
*/
|
|
224
57
|
clear(): void;
|
|
225
|
-
/**
|
|
226
|
-
* 통계 정보
|
|
227
|
-
*
|
|
228
|
-
* 공간 인덱스의 현재 상태를 반환합니다. 디버깅 및 성능 분석에 유용합니다.
|
|
229
|
-
*
|
|
230
|
-
* @returns 통계 정보 객체
|
|
231
|
-
*
|
|
232
|
-
* @remarks
|
|
233
|
-
* - totalCells: 현재 사용 중인 셀 개수
|
|
234
|
-
* - totalItems: 인덱스에 등록된 고유 항목 수 (정확)
|
|
235
|
-
* - avgItemsPerCell: 셀당 평균 항목 수
|
|
236
|
-
*/
|
|
237
58
|
stats(): {
|
|
238
59
|
totalCells: number;
|
|
239
60
|
totalItems: number;
|