@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.
- package/dist/components/mint-map/core/advanced/shared/context.d.ts +19 -12
- package/dist/components/mint-map/core/advanced/shared/context.js +54 -75
- package/dist/components/mint-map/core/advanced/shared/helpers.d.ts +20 -0
- package/dist/components/mint-map/core/advanced/shared/helpers.js +40 -0
- package/dist/components/mint-map/core/advanced/shared/hooks.d.ts +74 -0
- package/dist/components/mint-map/core/advanced/shared/hooks.js +189 -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 +12 -110
- package/dist/components/mint-map/core/advanced/shared/performance.js +56 -151
- 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 +36 -27
- package/dist/components/mint-map/core/advanced/shared/utils.js +58 -52
- package/dist/components/mint-map/core/advanced/shared/viewport.d.ts +42 -0
- package/dist/components/mint-map/core/advanced/shared/viewport.js +51 -0
- package/dist/components/mint-map/core/advanced/woongCanvasMarker/WoongCanvasMarker.d.ts +22 -74
- package/dist/components/mint-map/core/advanced/woongCanvasMarker/WoongCanvasMarker.js +156 -617
- package/dist/components/mint-map/core/advanced/woongCanvasPolygon/WoongCanvasPolygon.d.ts +26 -76
- package/dist/components/mint-map/core/advanced/woongCanvasPolygon/WoongCanvasPolygon.js +152 -551
- package/dist/components/mint-map/core/advanced/woongCanvasPolygon/renderer.d.ts +67 -8
- package/dist/components/mint-map/core/advanced/woongCanvasPolygon/renderer.js +81 -20
- package/dist/index.es.js +917 -1575
- package/dist/index.js +11 -0
- package/dist/index.umd.js +923 -1573
- package/package.json +1 -1
|
@@ -1,79 +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)
|
|
43
|
-
*
|
|
20
|
+
* LRU Cache (Least Recently Used)
|
|
21
|
+
*
|
|
22
|
+
* 좌표 변환 결과를 캐싱하기 위한 캐시 구현
|
|
44
23
|
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
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
|
-
* 공간 인덱스 그리드 셀 크기 (
|
|
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
|
-
* 뷰포트 컬링 여유 공간 (
|
|
12
|
+
* 뷰포트 컬링 여유 공간 (픽셀 단위)
|
|
28
13
|
*
|
|
29
|
-
*
|
|
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
|
-
*
|
|
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)
|
|
53
|
-
*
|
|
26
|
+
* LRU Cache (Least Recently Used)
|
|
27
|
+
*
|
|
28
|
+
* 좌표 변환 결과를 캐싱하기 위한 캐시 구현
|
|
54
29
|
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
203
|
-
this.remove(item); //
|
|
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 () {
|