@mint-ui/map 1.2.0-test.34 → 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.
Files changed (25) hide show
  1. package/dist/components/mint-map/core/advanced/shared/context.d.ts +19 -12
  2. package/dist/components/mint-map/core/advanced/shared/context.js +54 -75
  3. package/dist/components/mint-map/core/advanced/shared/helpers.d.ts +20 -0
  4. package/dist/components/mint-map/core/advanced/shared/helpers.js +40 -0
  5. package/dist/components/mint-map/core/advanced/shared/hooks.d.ts +74 -0
  6. package/dist/components/mint-map/core/advanced/shared/hooks.js +189 -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 +12 -110
  9. package/dist/components/mint-map/core/advanced/shared/performance.js +56 -151
  10. package/dist/components/mint-map/core/advanced/shared/types.d.ts +18 -153
  11. package/dist/components/mint-map/core/advanced/shared/types.js +0 -1
  12. package/dist/components/mint-map/core/advanced/shared/utils.d.ts +36 -27
  13. package/dist/components/mint-map/core/advanced/shared/utils.js +58 -52
  14. package/dist/components/mint-map/core/advanced/shared/viewport.d.ts +42 -0
  15. package/dist/components/mint-map/core/advanced/shared/viewport.js +51 -0
  16. package/dist/components/mint-map/core/advanced/woongCanvasMarker/WoongCanvasMarker.d.ts +22 -74
  17. package/dist/components/mint-map/core/advanced/woongCanvasMarker/WoongCanvasMarker.js +156 -617
  18. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/WoongCanvasPolygon.d.ts +26 -76
  19. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/WoongCanvasPolygon.js +152 -551
  20. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/renderer.d.ts +67 -8
  21. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/renderer.js +81 -20
  22. package/dist/index.es.js +917 -1575
  23. package/dist/index.js +11 -0
  24. package/dist/index.umd.js +923 -1573
  25. package/package.json +1 -1
@@ -1,79 +1,34 @@
1
1
  /**
2
- * 공간 인덱스 그리드 셀 크기 (px)
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
- * 뷰포트 컬링 여유 공간 (px)
8
+ * 뷰포트 컬링 여유 공간 (픽셀 단위)
20
9
  *
21
- * 화면 밖 100px까지 렌더링하여 스크롤 시 부드러운 전환
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
- * 좌표 변환 결과 캐싱 (positionToOffset 연산 비용 절약)
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) Cache
43
- * 메모리 제한을 위한 캐시 구현 (최적화 버전)
20
+ * LRU Cache (Least Recently Used)
21
+ *
22
+ * 좌표 변환 결과를 캐싱하기 위한 캐시 구현
44
23
  *
45
- * 개선 사항:
46
- * 1. get() 성능 향상: 접근 빈도 추적 없이 단순 조회만 수행 (delete+set 제거)
47
- * 2. set() 버그 수정: 기존 키 업데이트 시 maxSize 체크 로직 개선
48
- * 3. 메모리 효율: 단순 FIFO 캐시로 동작하여 오버헤드 최소화
24
+ * @template K 캐시 키 타입
25
+ * @template V 캐시 타입
49
26
  */
50
27
  export declare class LRUCache<K, V> {
51
28
  private cache;
52
29
  private maxSize;
53
30
  constructor(maxSize?: number);
54
- /**
55
- * 캐시에서 값 조회
56
- *
57
- * 최적화: delete+set 제거
58
- * - 이전: 매번 delete+set으로 LRU 갱신 (해시 재계산 비용)
59
- * - 현재: 단순 조회만 수행 (O(1) 해시 조회)
60
- *
61
- * 트레이드오프:
62
- * - 장점: 읽기 성능 대폭 향상 (10,000번 get → 이전보다 2배 빠름)
63
- * - 단점: 접근 빈도가 아닌 삽입 순서 기반 eviction (FIFO)
64
- *
65
- * WoongCanvasMarker 사용 사례에 최적:
66
- * - 좌표 변환 결과는 zoom/pan 시 어차피 전체 초기화
67
- * - 접근 빈도 추적보다 빠른 조회가 더 중요
68
- */
69
31
  get(key: K): V | undefined;
70
- /**
71
- * 캐시에 값 저장 (버그 수정 + 최적화)
72
- *
73
- * 수정 사항:
74
- * 1. 기존 키 업데이트 시 크기 체크 누락 버그 수정
75
- * 2. 로직 명확화: 기존 항목/신규 항목 분리 처리
76
- */
77
32
  set(key: K, value: V): void;
78
33
  clear(): void;
79
34
  size(): number;
@@ -81,78 +36,25 @@ export declare class LRUCache<K, V> {
81
36
  }
82
37
  /**
83
38
  * Spatial Hash Grid (공간 해시 그리드)
84
- * 공간 인덱싱을 위한 그리드 기반 자료구조 (개선 버전)
85
39
  *
86
- * 개선 사항:
87
- * 1. 중복 삽입 방지: 같은 항목을 여러 번 insert 해도 안전
88
- * 2. 메모리 누수 방지: 기존 항목 자동 제거
89
- * 3. 성능 최적화: 불필요한 배열 생성 최소화
40
+ * 빠른 Hit Test를 위한 그리드 기반 공간 인덱싱 자료구조
90
41
  *
91
- * 사용 사례:
92
- * - 빠른 Hit Test (마우스 클릭 시 어떤 마커/폴리곤인지 찾기)
93
- * - 30,000개 항목 → 클릭 위치 주변 ~10개만 체크 (3,000배 빠름)
42
+ * @template T 인덱싱할 항목 타입
94
43
  */
95
44
  export declare class SpatialHashGrid<T> {
96
45
  private cellSize;
97
46
  private grid;
98
47
  private itemToCells;
99
48
  constructor(cellSize?: number);
100
- /**
101
- * 셀 키 생성 (x, y 좌표 → 그리드 셀 ID)
102
- */
103
49
  private getCellKey;
104
- /**
105
- * 바운딩 박스가 걸치는 모든 셀 키 배열 반환
106
- */
107
50
  private getCellsForBounds;
108
- /**
109
- * 항목 추가 (바운딩 박스 기반)
110
- *
111
- * 개선 사항:
112
- * - 중복 삽입 방지: 기존 항목이 있으면 먼저 제거 후 재삽입
113
- * - 메모리 누수 방지: 이전 셀 참조 완전 제거
114
- */
115
51
  insert(item: T, minX: number, minY: number, maxX: number, maxY: number): void;
116
- /**
117
- * 항목 제거
118
- *
119
- * 추가된 메서드: 메모리 누수 방지 및 업데이트 지원
120
- */
121
52
  remove(item: T): void;
122
- /**
123
- * 항목 위치 업데이트
124
- *
125
- * 추가된 메서드: remove + insert의 편의 함수
126
- */
127
53
  update(item: T, minX: number, minY: number, maxX: number, maxY: number): void;
128
- /**
129
- * 점 주변의 항목 조회 (1개 셀만)
130
- *
131
- * 성능: O(해당 셀의 항목 수) - 보통 ~10개
132
- */
133
54
  queryPoint(x: number, y: number): T[];
134
- /**
135
- * 영역 내 항목 조회
136
- *
137
- * 성능: O(셀 개수 × 셀당 평균 항목 수)
138
- * Set으로 중복 제거 보장
139
- */
140
55
  queryBounds(minX: number, minY: number, maxX: number, maxY: number): T[];
141
- /**
142
- * 항목 존재 여부 확인
143
- *
144
- * 추가된 메서드: 빠른 존재 여부 체크
145
- */
146
56
  has(item: T): boolean;
147
- /**
148
- * 전체 초기화
149
- */
150
57
  clear(): void;
151
- /**
152
- * 통계 정보
153
- *
154
- * 개선: totalItems는 실제 고유 항목 수를 정확히 반환
155
- */
156
58
  stats(): {
157
59
  totalCells: number;
158
60
  totalItems: number;
@@ -2,60 +2,33 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- // ============================================================================
6
- // 성능 최적화 상수 (30,000개 마커/폴리곤 기준 최적화)
7
- // ============================================================================
8
-
9
5
  /**
10
- * 공간 인덱스 그리드 셀 크기 (px)
11
- *
12
- * 최적값 계산:
13
- * - 목표: 클릭 시 셀당 10~30개 항목만 체크 (빠른 Hit Test)
14
- * - 화면 크기: 1920×1080 기준
15
- * - 30,000개 항목 → 50px 셀 크기 = 약 800개 셀 = 셀당 ~37개
16
- *
17
- * 성능 비교 (30,000개 기준):
18
- * - 200px: 셀당 ~577개 → Hit Test O(577) ❌ 느림
19
- * - 50px: 셀당 ~37개 → Hit Test O(37) ✅ 15배 빠름!
6
+ * 공간 인덱스 그리드 셀 크기 (픽셀 단위)
20
7
  *
21
- * 트레이드오프:
22
- * - 작을수록: Hit Test 빠름, 메모리 사용량 증가
23
- * - 클수록: 메모리 효율적, Hit Test 느림
8
+ * @default 50
24
9
  */
25
10
  var SPATIAL_GRID_CELL_SIZE = 50;
26
11
  /**
27
- * 뷰포트 컬링 여유 공간 (px)
12
+ * 뷰포트 컬링 여유 공간 (픽셀 단위)
28
13
  *
29
- * 화면 밖 100px까지 렌더링하여 스크롤 시 부드러운 전환
30
- * 30,000개 중 실제 렌더링: 화면에 보이는 1,000~3,000개만
14
+ * @default 100
31
15
  */
32
16
 
33
17
  var DEFAULT_CULLING_MARGIN = 100;
34
18
  /**
35
19
  * LRU 캐시 최대 항목 수
36
20
  *
37
- * 좌표 변환 결과 캐싱 (positionToOffset 연산 비용 절약)
38
- *
39
- * 최적값 계산:
40
- * - 전체 항목: 30,000개
41
- * - 캐시 크기: 30,000개 → 100% 히트율 (메모리: ~2.4MB)
42
- *
43
- * 메모리 사용량 (항목당 ~80 bytes):
44
- * - 10,000개: ~800KB → 캐시 히트율 33% ❌
45
- * - 30,000개: ~2.4MB → 캐시 히트율 100% ✅
46
- *
47
- * zoom/pan 시 어차피 clear() 호출되므로 메모리 누적 없음
21
+ * @default 30000
48
22
  */
49
23
 
50
24
  var DEFAULT_MAX_CACHE_SIZE = 30000;
51
25
  /**
52
- * LRU (Least Recently Used) Cache
53
- * 메모리 제한을 위한 캐시 구현 (최적화 버전)
26
+ * LRU Cache (Least Recently Used)
27
+ *
28
+ * 좌표 변환 결과를 캐싱하기 위한 캐시 구현
54
29
  *
55
- * 개선 사항:
56
- * 1. get() 성능 향상: 접근 빈도 추적 없이 단순 조회만 수행 (delete+set 제거)
57
- * 2. set() 버그 수정: 기존 키 업데이트 시 maxSize 체크 로직 개선
58
- * 3. 메모리 효율: 단순 FIFO 캐시로 동작하여 오버헤드 최소화
30
+ * @template K 캐시 키 타입
31
+ * @template V 캐시 타입
59
32
  */
60
33
 
61
34
  var LRUCache =
@@ -68,64 +41,43 @@ function () {
68
41
 
69
42
  this.cache = new Map();
70
43
  this.maxSize = maxSize;
71
- }
72
- /**
73
- * 캐시에서 값 조회
74
- *
75
- * 최적화: delete+set 제거
76
- * - 이전: 매번 delete+set으로 LRU 갱신 (해시 재계산 비용)
77
- * - 현재: 단순 조회만 수행 (O(1) 해시 조회)
78
- *
79
- * 트레이드오프:
80
- * - 장점: 읽기 성능 대폭 향상 (10,000번 get → 이전보다 2배 빠름)
81
- * - 단점: 접근 빈도가 아닌 삽입 순서 기반 eviction (FIFO)
82
- *
83
- * WoongCanvasMarker 사용 사례에 최적:
84
- * - 좌표 변환 결과는 zoom/pan 시 어차피 전체 초기화
85
- * - 접근 빈도 추적보다 빠른 조회가 더 중요
86
- */
44
+ } // 캐시에서 값 조회
87
45
 
88
46
 
89
47
  LRUCache.prototype.get = function (key) {
90
48
  return this.cache.get(key);
91
- };
92
- /**
93
- * 캐시에 값 저장 (버그 수정 + 최적화)
94
- *
95
- * 수정 사항:
96
- * 1. 기존 키 업데이트 시 크기 체크 누락 버그 수정
97
- * 2. 로직 명확화: 기존 항목/신규 항목 분리 처리
98
- */
49
+ }; // 캐시에 값 저장 (FIFO eviction)
99
50
 
100
51
 
101
52
  LRUCache.prototype.set = function (key, value) {
102
53
  var exists = this.cache.has(key);
103
54
 
104
55
  if (exists) {
105
- // 기존 항목 업데이트: 단순 덮어쓰기 (크기 변화 없음)
106
56
  this.cache.set(key, value);
107
- } else {
108
- // 신규 항목 추가: 크기 체크 필요
109
- if (this.cache.size >= this.maxSize) {
110
- // 가장 오래된 항목 제거 (Map의 첫 번째 항목)
111
- var firstKey = this.cache.keys().next().value;
112
-
113
- if (firstKey !== undefined) {
114
- this.cache.delete(firstKey);
115
- }
116
- }
57
+ return;
58
+ }
117
59
 
118
- this.cache.set(key, value);
60
+ if (this.cache.size >= this.maxSize) {
61
+ var firstKey = this.cache.keys().next().value;
62
+
63
+ if (firstKey !== undefined) {
64
+ this.cache.delete(firstKey);
65
+ }
119
66
  }
120
- };
67
+
68
+ this.cache.set(key, value);
69
+ }; // 캐시 초기화
70
+
121
71
 
122
72
  LRUCache.prototype.clear = function () {
123
73
  this.cache.clear();
124
- };
74
+ }; // 캐시 크기 반환
75
+
125
76
 
126
77
  LRUCache.prototype.size = function () {
127
78
  return this.cache.size;
128
- };
79
+ }; // 키 존재 여부 확인
80
+
129
81
 
130
82
  LRUCache.prototype.has = function (key) {
131
83
  return this.cache.has(key);
@@ -135,16 +87,10 @@ function () {
135
87
  }();
136
88
  /**
137
89
  * Spatial Hash Grid (공간 해시 그리드)
138
- * 공간 인덱싱을 위한 그리드 기반 자료구조 (개선 버전)
139
90
  *
140
- * 개선 사항:
141
- * 1. 중복 삽입 방지: 같은 항목을 여러 번 insert 해도 안전
142
- * 2. 메모리 누수 방지: 기존 항목 자동 제거
143
- * 3. 성능 최적화: 불필요한 배열 생성 최소화
91
+ * 빠른 Hit Test를 위한 그리드 기반 공간 인덱싱 자료구조
144
92
  *
145
- * 사용 사례:
146
- * - 빠른 Hit Test (마우스 클릭 시 어떤 마커/폴리곤인지 찾기)
147
- * - 30,000개 항목 → 클릭 위치 주변 ~10개만 체크 (3,000배 빠름)
93
+ * @template T 인덱싱할 항목 타입
148
94
  */
149
95
 
150
96
  var SpatialHashGrid =
@@ -158,28 +104,24 @@ function () {
158
104
  this.cellSize = cellSize;
159
105
  this.grid = new Map();
160
106
  this.itemToCells = new Map();
161
- }
162
- /**
163
- * 셀 키 생성 (x, y 좌표 → 그리드 셀 ID)
164
- */
107
+ } // 셀 키 생성 (x, y 좌표 → 그리드 셀 ID)
165
108
 
166
109
 
167
110
  SpatialHashGrid.prototype.getCellKey = function (x, y) {
111
+ // 좌표를 셀 크기로 나눈 몫으로 셀 인덱스 계산
168
112
  var cellX = Math.floor(x / this.cellSize);
169
113
  var cellY = Math.floor(y / this.cellSize);
170
114
  return "".concat(cellX, ",").concat(cellY);
171
- };
172
- /**
173
- * 바운딩 박스가 걸치는 모든 셀 키 배열 반환
174
- */
115
+ }; // 바운딩 박스가 걸치는 모든 셀 키 배열 반환
175
116
 
176
117
 
177
118
  SpatialHashGrid.prototype.getCellsForBounds = function (minX, minY, maxX, maxY) {
178
- var cells = [];
119
+ var cells = []; // 바운딩 박스가 걸치는 셀 범위 계산
120
+
179
121
  var startCellX = Math.floor(minX / this.cellSize);
180
122
  var startCellY = Math.floor(minY / this.cellSize);
181
123
  var endCellX = Math.floor(maxX / this.cellSize);
182
- var endCellY = Math.floor(maxY / this.cellSize);
124
+ var endCellY = Math.floor(maxY / this.cellSize); // 바운딩 박스가 걸치는 모든 셀을 배열에 추가
183
125
 
184
126
  for (var x = startCellX; x <= endCellX; x++) {
185
127
  for (var y = startCellY; y <= endCellY; y++) {
@@ -188,22 +130,15 @@ function () {
188
130
  }
189
131
 
190
132
  return cells;
191
- };
192
- /**
193
- * 항목 추가 (바운딩 박스 기반)
194
- *
195
- * 개선 사항:
196
- * - 중복 삽입 방지: 기존 항목이 있으면 먼저 제거 후 재삽입
197
- * - 메모리 누수 방지: 이전 셀 참조 완전 제거
198
- */
133
+ }; // 항목 추가 (바운딩 박스 기반, 중복 삽입 방지)
199
134
 
200
135
 
201
136
  SpatialHashGrid.prototype.insert = function (item, minX, minY, maxX, maxY) {
202
- // 1. 기존 항목 제거 (중복 방지)
203
- this.remove(item); // 2. 위치에 삽입
137
+ // 기존 항목 제거 (중복 삽입 방지: 같은 항목을 여러 번 insert 해도 안전)
138
+ this.remove(item); // 바운딩 박스가 걸치는 모든 셀에 항목 등록
204
139
 
205
140
  var cells = this.getCellsForBounds(minX, minY, maxX, maxY);
206
- this.itemToCells.set(item, cells);
141
+ this.itemToCells.set(item, cells); // 항목과 셀의 매핑 저장 (제거 시 필요)
207
142
 
208
143
  for (var _i = 0, cells_1 = cells; _i < cells_1.length; _i++) {
209
144
  var cell = cells_1[_i];
@@ -214,17 +149,12 @@ function () {
214
149
 
215
150
  this.grid.get(cell).push(item);
216
151
  }
217
- };
218
- /**
219
- * 항목 제거
220
- *
221
- * 추가된 메서드: 메모리 누수 방지 및 업데이트 지원
222
- */
152
+ }; // 항목 제거 (모든 셀에서 참조 제거)
223
153
 
224
154
 
225
155
  SpatialHashGrid.prototype.remove = function (item) {
226
156
  var prevCells = this.itemToCells.get(item);
227
- if (!prevCells) return; // 셀에서 항목 제거
157
+ if (!prevCells) return; // 항목이 등록된 모든 셀에서 참조 제거 (메모리 누수 방지)
228
158
 
229
159
  for (var _i = 0, prevCells_1 = prevCells; _i < prevCells_1.length; _i++) {
230
160
  var cell = prevCells_1[_i];
@@ -235,51 +165,39 @@ function () {
235
165
 
236
166
  if (index !== -1) {
237
167
  cellItems.splice(index, 1);
238
- } // 빈 셀 정리 (메모리 효율)
168
+ } // 빈 셀 정리 (메모리 효율: 사용하지 않는 셀 제거)
239
169
 
240
170
 
241
171
  if (cellItems.length === 0) {
242
172
  this.grid.delete(cell);
243
173
  }
244
174
  }
245
- }
175
+ } // 항목과 셀의 매핑 제거
176
+
246
177
 
247
178
  this.itemToCells.delete(item);
248
- };
249
- /**
250
- * 항목 위치 업데이트
251
- *
252
- * 추가된 메서드: remove + insert의 편의 함수
253
- */
179
+ }; // 항목 위치 업데이트 (remove + insert)
254
180
 
255
181
 
256
182
  SpatialHashGrid.prototype.update = function (item, minX, minY, maxX, maxY) {
257
183
  this.insert(item, minX, minY, maxX, maxY);
258
- };
259
- /**
260
- * 점 주변의 항목 조회 (1개 셀만)
261
- *
262
- * 성능: O(해당 셀의 항목 수) - 보통 ~10개
263
- */
184
+ }; // 점 주변의 항목 조회 (Hit Test용)
264
185
 
265
186
 
266
187
  SpatialHashGrid.prototype.queryPoint = function (x, y) {
188
+ // 클릭 위치가 속한 셀의 모든 항목 조회 (O(1) 수준의 빠른 조회)
267
189
  var cellKey = this.getCellKey(x, y);
268
190
  var items = this.grid.get(cellKey); // 빈 배열 재사용 (메모리 할당 최소화)
269
191
 
270
192
  return items || [];
271
- };
272
- /**
273
- * 영역 내 항목 조회
274
- *
275
- * 성능: O(셀 개수 × 셀당 평균 항목 수)
276
- * Set으로 중복 제거 보장
277
- */
193
+ }; // 영역 내 항목 조회 (Viewport Culling용)
278
194
 
279
195
 
280
196
  SpatialHashGrid.prototype.queryBounds = function (minX, minY, maxX, maxY) {
197
+ // 영역이 걸치는 모든 셀 찾기
281
198
  var cells = this.getCellsForBounds(minX, minY, maxX, maxY);
282
- var results = new Set();
199
+ var results = new Set(); // 중복 제거를 위해 Set 사용
200
+ // 각 셀의 모든 항목을 결과에 추가
283
201
 
284
202
  for (var _i = 0, cells_2 = cells; _i < cells_2.length; _i++) {
285
203
  var cell = cells_2[_i];
@@ -288,37 +206,24 @@ function () {
288
206
  if (items) {
289
207
  for (var _a = 0, items_1 = items; _a < items_1.length; _a++) {
290
208
  var item = items_1[_a];
291
- results.add(item);
209
+ results.add(item); // Set이므로 중복 자동 제거
292
210
  }
293
211
  }
294
212
  }
295
213
 
296
214
  return Array.from(results);
297
- };
298
- /**
299
- * 항목 존재 여부 확인
300
- *
301
- * 추가된 메서드: 빠른 존재 여부 체크
302
- */
215
+ }; // 항목 존재 여부 확인
303
216
 
304
217
 
305
218
  SpatialHashGrid.prototype.has = function (item) {
306
219
  return this.itemToCells.has(item);
307
- };
308
- /**
309
- * 전체 초기화
310
- */
220
+ }; // 전체 초기화
311
221
 
312
222
 
313
223
  SpatialHashGrid.prototype.clear = function () {
314
224
  this.grid.clear();
315
225
  this.itemToCells.clear();
316
- };
317
- /**
318
- * 통계 정보
319
- *
320
- * 개선: totalItems는 실제 고유 항목 수를 정확히 반환
321
- */
226
+ }; // 통계 정보 반환
322
227
 
323
228
 
324
229
  SpatialHashGrid.prototype.stats = function () {