@mint-ui/map 1.2.0-test.23 → 1.2.0-test.25
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/MintMapController.d.ts +1 -0
- package/dist/components/mint-map/core/advanced/woongCanvas/WoongCanvasLayer.d.ts +8 -73
- package/dist/components/mint-map/core/advanced/woongCanvas/WoongCanvasLayer.js +38 -88
- package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +0 -10
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.d.ts +5 -73
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.js +14 -81
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/index.d.ts +0 -11
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.d.ts +13 -62
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.js +13 -62
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.d.ts +24 -78
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.js +23 -77
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.d.ts +4 -21
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.js +0 -6
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +20 -142
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +23 -146
- package/dist/components/mint-map/core/wrapper/MapMarkerWrapper.js +22 -1
- package/dist/components/mint-map/google/GoogleMintMapController.d.ts +1 -0
- package/dist/components/mint-map/google/GoogleMintMapController.js +4 -0
- package/dist/components/mint-map/kakao/KakaoMintMapController.d.ts +1 -0
- package/dist/components/mint-map/kakao/KakaoMintMapController.js +4 -0
- package/dist/components/mint-map/naver/NaverMintMapController.d.ts +3 -0
- package/dist/components/mint-map/naver/NaverMintMapController.js +37 -3
- package/dist/index.es.js +630 -916
- package/dist/index.js +0 -4
- package/dist/index.umd.js +629 -918
- package/package.json +1 -1
|
@@ -9,50 +9,18 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
|
|
|
9
9
|
|
|
10
10
|
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
11
11
|
|
|
12
|
-
/** 다중 레이어 관리를 위한 React Context */
|
|
13
|
-
|
|
14
12
|
var KonvaMarkerContext = React.createContext(null);
|
|
15
|
-
/**
|
|
16
|
-
* 다중 WoongCanvasLayer 관리를 위한 Context Provider
|
|
17
|
-
*
|
|
18
|
-
* 여러 개의 WoongCanvasLayer가 동시에 사용될 때 이벤트 우선순위를 관리하고
|
|
19
|
-
* 전역 클릭/호버 이벤트를 조정합니다.
|
|
20
|
-
*
|
|
21
|
-
* @param children - Provider로 감쌀 React 컴포넌트들
|
|
22
|
-
* @returns Context Provider 컴포넌트
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```tsx
|
|
26
|
-
* <KonvaMarkerProvider>
|
|
27
|
-
* <WoongCanvasLayer zIndex={1} data={markers1} ... />
|
|
28
|
-
* <WoongCanvasLayer zIndex={2} data={markers2} ... />
|
|
29
|
-
* </KonvaMarkerProvider>
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
13
|
var KonvaMarkerProvider = function (_a) {
|
|
34
14
|
var children = _a.children;
|
|
35
|
-
var controller = MintMapProvider.useMintMapController(); //
|
|
36
|
-
|
|
37
|
-
/** 등록된 모든 컴포넌트 인스턴스들 (zIndex 내림차순 정렬) */
|
|
15
|
+
var controller = MintMapProvider.useMintMapController(); // Refs
|
|
38
16
|
|
|
39
17
|
var componentsRef = React.useRef([]);
|
|
40
|
-
/** 현재 호버된 컴포넌트 인스턴스 */
|
|
41
|
-
|
|
42
18
|
var currentHoveredRef = React.useRef(null);
|
|
43
|
-
/** 현재 호버된 데이터 */
|
|
44
|
-
|
|
45
19
|
var currentHoveredDataRef = React.useRef(null);
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
var draggingRef = React.useRef(false); // === 컴포넌트 관리 함수들 ===
|
|
49
|
-
|
|
20
|
+
var draggingRef = React.useRef(false);
|
|
50
21
|
/**
|
|
51
|
-
* 컴포넌트
|
|
52
|
-
*
|
|
53
|
-
* zIndex 내림차순으로 정렬하여 높은 우선순위의 컴포넌트가 먼저 이벤트를 처리하도록 합니다.
|
|
54
|
-
*
|
|
55
|
-
* @param instance - 등록할 컴포넌트 인스턴스
|
|
22
|
+
* 컴포넌트 등록 (zIndex 내림차순 정렬)
|
|
23
|
+
* 높은 zIndex가 먼저 처리됨
|
|
56
24
|
*/
|
|
57
25
|
|
|
58
26
|
var registerComponent = React.useCallback(function (instance) {
|
|
@@ -62,12 +30,7 @@ var KonvaMarkerProvider = function (_a) {
|
|
|
62
30
|
});
|
|
63
31
|
}, []);
|
|
64
32
|
/**
|
|
65
|
-
* 컴포넌트
|
|
66
|
-
*
|
|
67
|
-
* 컴포넌트가 언마운트될 때 호출되어 Context에서 제거합니다.
|
|
68
|
-
* 현재 호버 중인 컴포넌트라면 호버 상태도 초기화합니다.
|
|
69
|
-
*
|
|
70
|
-
* @param instance - 등록 해제할 컴포넌트 인스턴스
|
|
33
|
+
* 컴포넌트 등록 해제
|
|
71
34
|
*/
|
|
72
35
|
|
|
73
36
|
var unregisterComponent = React.useCallback(function (instance) {
|
|
@@ -80,15 +43,9 @@ var KonvaMarkerProvider = function (_a) {
|
|
|
80
43
|
componentsRef.current = componentsRef.current.filter(function (c) {
|
|
81
44
|
return c !== instance;
|
|
82
45
|
});
|
|
83
|
-
}, []);
|
|
84
|
-
|
|
46
|
+
}, []);
|
|
85
47
|
/**
|
|
86
|
-
* 전역 클릭
|
|
87
|
-
*
|
|
88
|
-
* zIndex 우선순위에 따라 등록된 컴포넌트들을 순회하며 클릭된 데이터를 찾습니다.
|
|
89
|
-
* 첫 번째로 히트된 컴포넌트의 이벤트만 처리합니다.
|
|
90
|
-
*
|
|
91
|
-
* @param event - 지도 클릭 이벤트 파라미터
|
|
48
|
+
* 전역 클릭 핸들러 (zIndex 우선순위)
|
|
92
49
|
*/
|
|
93
50
|
|
|
94
51
|
var handleGlobalClick = React.useCallback(function (event) {
|
|
@@ -98,7 +55,7 @@ var KonvaMarkerProvider = function (_a) {
|
|
|
98
55
|
var clickedOffset = controller.positionToOffset(event.param.position); // zIndex 순서대로 순회 (높은 것부터)
|
|
99
56
|
|
|
100
57
|
for (var _i = 0, _b = componentsRef.current; _i < _b.length; _i++) {
|
|
101
|
-
var component = _b[_i]; // 상호작용이 비활성화된 컴포넌트는 스킵
|
|
58
|
+
var component = _b[_i]; // 🚫 상호작용이 비활성화된 컴포넌트는 스킵
|
|
102
59
|
|
|
103
60
|
if (component.isInteractionDisabled()) continue;
|
|
104
61
|
var data = component.findData(clickedOffset);
|
|
@@ -115,12 +72,7 @@ var KonvaMarkerProvider = function (_a) {
|
|
|
115
72
|
}
|
|
116
73
|
}, [controller]);
|
|
117
74
|
/**
|
|
118
|
-
* 전역 마우스 이동
|
|
119
|
-
*
|
|
120
|
-
* zIndex 우선순위에 따라 호버된 데이터를 찾고, 호버 상태가 변경되면
|
|
121
|
-
* 이전 호버를 해제하고 새로운 호버를 설정합니다.
|
|
122
|
-
*
|
|
123
|
-
* @param event - 지도 마우스 이동 이벤트 파라미터
|
|
75
|
+
* 전역 마우스 이동 핸들러 (zIndex 우선순위)
|
|
124
76
|
*/
|
|
125
77
|
|
|
126
78
|
var handleGlobalMouseMove = React.useCallback(function (event) {
|
|
@@ -133,7 +85,7 @@ var KonvaMarkerProvider = function (_a) {
|
|
|
133
85
|
var newHoveredData = null;
|
|
134
86
|
|
|
135
87
|
for (var _i = 0, _b = componentsRef.current; _i < _b.length; _i++) {
|
|
136
|
-
var component = _b[_i]; // 상호작용이 비활성화된 컴포넌트는 스킵
|
|
88
|
+
var component = _b[_i]; // 🚫 상호작용이 비활성화된 컴포넌트는 스킵
|
|
137
89
|
|
|
138
90
|
if (component.isInteractionDisabled()) continue;
|
|
139
91
|
var data = component.findData(mouseOffset);
|
|
@@ -170,24 +122,19 @@ var KonvaMarkerProvider = function (_a) {
|
|
|
170
122
|
}
|
|
171
123
|
}, [controller]);
|
|
172
124
|
/**
|
|
173
|
-
* 줌/드래그 시작 이벤트
|
|
174
|
-
*
|
|
175
|
-
* 지도가 줌이나 드래그를 시작할 때 마우스 이동 이벤트를 무시하도록 설정합니다.
|
|
176
|
-
* 이는 성능 최적화와 불필요한 호버 이벤트 방지를 위한 것입니다.
|
|
125
|
+
* 줌/드래그 시작 (마우스 이동 이벤트 무시)
|
|
177
126
|
*/
|
|
178
127
|
|
|
179
128
|
var handleZoomStart = React.useCallback(function () {
|
|
180
129
|
draggingRef.current = true;
|
|
181
130
|
}, []);
|
|
182
131
|
/**
|
|
183
|
-
* 지도 idle 이벤트
|
|
184
|
-
*
|
|
185
|
-
* 지도가 idle 상태가 되면 마우스 이동 이벤트를 다시 활성화합니다.
|
|
132
|
+
* 지도 idle (마우스 이동 이벤트 재개)
|
|
186
133
|
*/
|
|
187
134
|
|
|
188
135
|
var handleIdle = React.useCallback(function () {
|
|
189
136
|
draggingRef.current = false;
|
|
190
|
-
}, []); //
|
|
137
|
+
}, []); // 이벤트 리스너 등록
|
|
191
138
|
|
|
192
139
|
React.useEffect(function () {
|
|
193
140
|
controller.addEventListener('CLICK', handleGlobalClick);
|
|
@@ -200,7 +147,7 @@ var KonvaMarkerProvider = function (_a) {
|
|
|
200
147
|
controller.removeEventListener('ZOOMSTART', handleZoomStart);
|
|
201
148
|
controller.removeEventListener('IDLE', handleIdle);
|
|
202
149
|
};
|
|
203
|
-
}, [controller, handleGlobalClick, handleGlobalMouseMove, handleZoomStart, handleIdle]); //
|
|
150
|
+
}, [controller, handleGlobalClick, handleGlobalMouseMove, handleZoomStart, handleIdle]); // Context value 메모이제이션
|
|
204
151
|
|
|
205
152
|
var contextValue = React.useMemo(function () {
|
|
206
153
|
return {
|
|
@@ -212,20 +159,6 @@ var KonvaMarkerProvider = function (_a) {
|
|
|
212
159
|
value: contextValue
|
|
213
160
|
}, children);
|
|
214
161
|
};
|
|
215
|
-
/**
|
|
216
|
-
* KonvaMarkerContext를 사용하기 위한 Hook
|
|
217
|
-
*
|
|
218
|
-
* @returns Context 값 또는 null (Provider 외부에서 사용 시)
|
|
219
|
-
*
|
|
220
|
-
* @example
|
|
221
|
-
* ```tsx
|
|
222
|
-
* const context = useKonvaMarkerContext();
|
|
223
|
-
* if (context) {
|
|
224
|
-
* context.registerComponent(instance);
|
|
225
|
-
* }
|
|
226
|
-
* ```
|
|
227
|
-
*/
|
|
228
|
-
|
|
229
162
|
var useKonvaMarkerContext = function () {
|
|
230
163
|
var context = React.useContext(KonvaMarkerContext);
|
|
231
164
|
return context;
|
|
@@ -1,15 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview WoongCanvasLayer의 공유 유틸리티 모듈
|
|
3
|
-
*
|
|
4
|
-
* 이 파일은 WoongCanvasLayer에서 사용하는 모든 공통 타입, 유틸리티 함수,
|
|
5
|
-
* 성능 최적화 클래스, Context Provider를 외부로 노출합니다.
|
|
6
|
-
*
|
|
7
|
-
* @version 2.2.1
|
|
8
|
-
* @since 2.0.0
|
|
9
|
-
* @author 박건웅
|
|
10
|
-
*/
|
|
11
1
|
export * from './types';
|
|
12
2
|
export * from './utils';
|
|
13
3
|
export * from './context';
|
|
14
4
|
export * from './performance';
|
|
15
|
-
export * from './renderer';
|
|
@@ -1,18 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview WoongCanvasLayer 성능 최적화를 위한 상수 및 클래스
|
|
3
|
-
*
|
|
4
|
-
* 이 파일은 30,000개 이상의 마커/폴리곤을 60fps로 렌더링하기 위한
|
|
5
|
-
* 성능 최적화 상수와 최적화된 자료구조들을 제공합니다.
|
|
6
|
-
*
|
|
7
|
-
* ## 주요 구성 요소
|
|
8
|
-
* - **성능 최적화 상수**: 그리드 셀 크기, 캐시 크기, 컬링 여유 공간
|
|
9
|
-
* - **LRUCache**: 좌표 변환 결과 캐싱을 위한 LRU 캐시 구현
|
|
10
|
-
* - **SpatialHashGrid**: O(1) 수준의 빠른 Hit Test를 위한 공간 해시 그리드
|
|
11
|
-
*
|
|
12
|
-
* @version 2.2.1
|
|
13
|
-
* @since 2.0.0
|
|
14
|
-
* @author 박건웅
|
|
15
|
-
*/
|
|
16
1
|
/**
|
|
17
2
|
* 공간 인덱스 그리드 셀 크기 (px)
|
|
18
3
|
*
|
|
@@ -55,29 +40,12 @@ export declare const DEFAULT_CULLING_MARGIN = 100;
|
|
|
55
40
|
export declare const DEFAULT_MAX_CACHE_SIZE = 30000;
|
|
56
41
|
/**
|
|
57
42
|
* LRU (Least Recently Used) Cache
|
|
43
|
+
* 메모리 제한을 위한 캐시 구현 (최적화 버전)
|
|
58
44
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* - **빠른 조회**: O(1) 해시 조회로 성능 최적화
|
|
64
|
-
* - **메모리 제한**: 최대 크기 초과 시 자동 eviction
|
|
65
|
-
* - **FIFO 방식**: 삽입 순서 기반 eviction (접근 빈도 추적 없음)
|
|
66
|
-
*
|
|
67
|
-
* ## 개선 사항
|
|
68
|
-
* 1. **get() 성능 향상**: 접근 빈도 추적 없이 단순 조회만 수행
|
|
69
|
-
* 2. **set() 버그 수정**: 기존 키 업데이트 시 maxSize 체크 로직 개선
|
|
70
|
-
* 3. **메모리 효율**: 단순 FIFO 캐시로 동작하여 오버헤드 최소화
|
|
71
|
-
*
|
|
72
|
-
* @template K 캐시 키 타입
|
|
73
|
-
* @template V 캐시 값 타입
|
|
74
|
-
*
|
|
75
|
-
* @example
|
|
76
|
-
* ```typescript
|
|
77
|
-
* const cache = new LRUCache<string, Offset>(1000);
|
|
78
|
-
* cache.set('marker-1', { x: 100, y: 200 });
|
|
79
|
-
* const offset = cache.get('marker-1'); // { x: 100, y: 200 }
|
|
80
|
-
* ```
|
|
45
|
+
* 개선 사항:
|
|
46
|
+
* 1. get() 성능 향상: 접근 빈도 추적 없이 단순 조회만 수행 (delete+set 제거)
|
|
47
|
+
* 2. set() 버그 수정: 기존 키 업데이트 시 maxSize 체크 로직 개선
|
|
48
|
+
* 3. 메모리 효율: 단순 FIFO 캐시로 동작하여 오버헤드 최소화
|
|
81
49
|
*/
|
|
82
50
|
export declare class LRUCache<K, V> {
|
|
83
51
|
private cache;
|
|
@@ -113,33 +81,16 @@ export declare class LRUCache<K, V> {
|
|
|
113
81
|
}
|
|
114
82
|
/**
|
|
115
83
|
* Spatial Hash Grid (공간 해시 그리드)
|
|
84
|
+
* 공간 인덱싱을 위한 그리드 기반 자료구조 (개선 버전)
|
|
116
85
|
*
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
* - **O(1) 조회**: 클릭 위치 주변의 객체들만 체크하여 성능 최적화
|
|
122
|
-
* - **메모리 효율**: 격자 기반으로 필요한 영역만 인덱싱
|
|
123
|
-
* - **중복 방지**: 같은 항목을 여러 번 삽입해도 안전
|
|
124
|
-
*
|
|
125
|
-
* ## 성능 비교
|
|
126
|
-
* - **일반 검색**: 30,000개 항목 전체 체크 → O(n)
|
|
127
|
-
* - **Spatial Hash**: 클릭 위치 주변 ~10개만 체크 → O(1) + O(10)
|
|
128
|
-
* - **성능 향상**: 약 3,000배 빠름! 🚀
|
|
129
|
-
*
|
|
130
|
-
* ## 개선 사항
|
|
131
|
-
* 1. **중복 삽입 방지**: 같은 항목을 여러 번 insert 해도 안전
|
|
132
|
-
* 2. **메모리 누수 방지**: 기존 항목 자동 제거
|
|
133
|
-
* 3. **성능 최적화**: 불필요한 배열 생성 최소화
|
|
134
|
-
*
|
|
135
|
-
* @template T 그리드에 저장할 객체 타입
|
|
86
|
+
* 개선 사항:
|
|
87
|
+
* 1. 중복 삽입 방지: 같은 항목을 여러 번 insert 해도 안전
|
|
88
|
+
* 2. 메모리 누수 방지: 기존 항목 자동 제거
|
|
89
|
+
* 3. 성능 최적화: 불필요한 배열 생성 최소화
|
|
136
90
|
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
* grid.insert(marker, { x: 100, y: 200, width: 30, height: 40 });
|
|
141
|
-
* const nearby = grid.query(105, 205, 10); // (105, 205) 주변 10px 반경
|
|
142
|
-
* ```
|
|
91
|
+
* 사용 사례:
|
|
92
|
+
* - 빠른 Hit Test (마우스 클릭 시 어떤 마커/폴리곤인지 찾기)
|
|
93
|
+
* - 30,000개 항목 → 클릭 위치 주변 ~10개만 체크 (3,000배 빠름)
|
|
143
94
|
*/
|
|
144
95
|
export declare class SpatialHashGrid<T> {
|
|
145
96
|
private cellSize;
|
|
@@ -2,21 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
/**
|
|
6
|
-
* @fileoverview WoongCanvasLayer 성능 최적화를 위한 상수 및 클래스
|
|
7
|
-
*
|
|
8
|
-
* 이 파일은 30,000개 이상의 마커/폴리곤을 60fps로 렌더링하기 위한
|
|
9
|
-
* 성능 최적화 상수와 최적화된 자료구조들을 제공합니다.
|
|
10
|
-
*
|
|
11
|
-
* ## 주요 구성 요소
|
|
12
|
-
* - **성능 최적화 상수**: 그리드 셀 크기, 캐시 크기, 컬링 여유 공간
|
|
13
|
-
* - **LRUCache**: 좌표 변환 결과 캐싱을 위한 LRU 캐시 구현
|
|
14
|
-
* - **SpatialHashGrid**: O(1) 수준의 빠른 Hit Test를 위한 공간 해시 그리드
|
|
15
|
-
*
|
|
16
|
-
* @version 2.2.1
|
|
17
|
-
* @since 2.0.0
|
|
18
|
-
* @author 박건웅
|
|
19
|
-
*/
|
|
20
5
|
// ============================================================================
|
|
21
6
|
// 성능 최적화 상수 (30,000개 마커/폴리곤 기준 최적화)
|
|
22
7
|
// ============================================================================
|
|
@@ -65,29 +50,12 @@ var DEFAULT_CULLING_MARGIN = 100;
|
|
|
65
50
|
var DEFAULT_MAX_CACHE_SIZE = 30000;
|
|
66
51
|
/**
|
|
67
52
|
* LRU (Least Recently Used) Cache
|
|
53
|
+
* 메모리 제한을 위한 캐시 구현 (최적화 버전)
|
|
68
54
|
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* - **빠른 조회**: O(1) 해시 조회로 성능 최적화
|
|
74
|
-
* - **메모리 제한**: 최대 크기 초과 시 자동 eviction
|
|
75
|
-
* - **FIFO 방식**: 삽입 순서 기반 eviction (접근 빈도 추적 없음)
|
|
76
|
-
*
|
|
77
|
-
* ## 개선 사항
|
|
78
|
-
* 1. **get() 성능 향상**: 접근 빈도 추적 없이 단순 조회만 수행
|
|
79
|
-
* 2. **set() 버그 수정**: 기존 키 업데이트 시 maxSize 체크 로직 개선
|
|
80
|
-
* 3. **메모리 효율**: 단순 FIFO 캐시로 동작하여 오버헤드 최소화
|
|
81
|
-
*
|
|
82
|
-
* @template K 캐시 키 타입
|
|
83
|
-
* @template V 캐시 값 타입
|
|
84
|
-
*
|
|
85
|
-
* @example
|
|
86
|
-
* ```typescript
|
|
87
|
-
* const cache = new LRUCache<string, Offset>(1000);
|
|
88
|
-
* cache.set('marker-1', { x: 100, y: 200 });
|
|
89
|
-
* const offset = cache.get('marker-1'); // { x: 100, y: 200 }
|
|
90
|
-
* ```
|
|
55
|
+
* 개선 사항:
|
|
56
|
+
* 1. get() 성능 향상: 접근 빈도 추적 없이 단순 조회만 수행 (delete+set 제거)
|
|
57
|
+
* 2. set() 버그 수정: 기존 키 업데이트 시 maxSize 체크 로직 개선
|
|
58
|
+
* 3. 메모리 효율: 단순 FIFO 캐시로 동작하여 오버헤드 최소화
|
|
91
59
|
*/
|
|
92
60
|
|
|
93
61
|
var LRUCache =
|
|
@@ -167,33 +135,16 @@ function () {
|
|
|
167
135
|
}();
|
|
168
136
|
/**
|
|
169
137
|
* Spatial Hash Grid (공간 해시 그리드)
|
|
138
|
+
* 공간 인덱싱을 위한 그리드 기반 자료구조 (개선 버전)
|
|
170
139
|
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
* - **O(1) 조회**: 클릭 위치 주변의 객체들만 체크하여 성능 최적화
|
|
176
|
-
* - **메모리 효율**: 격자 기반으로 필요한 영역만 인덱싱
|
|
177
|
-
* - **중복 방지**: 같은 항목을 여러 번 삽입해도 안전
|
|
178
|
-
*
|
|
179
|
-
* ## 성능 비교
|
|
180
|
-
* - **일반 검색**: 30,000개 항목 전체 체크 → O(n)
|
|
181
|
-
* - **Spatial Hash**: 클릭 위치 주변 ~10개만 체크 → O(1) + O(10)
|
|
182
|
-
* - **성능 향상**: 약 3,000배 빠름! 🚀
|
|
183
|
-
*
|
|
184
|
-
* ## 개선 사항
|
|
185
|
-
* 1. **중복 삽입 방지**: 같은 항목을 여러 번 insert 해도 안전
|
|
186
|
-
* 2. **메모리 누수 방지**: 기존 항목 자동 제거
|
|
187
|
-
* 3. **성능 최적화**: 불필요한 배열 생성 최소화
|
|
188
|
-
*
|
|
189
|
-
* @template T 그리드에 저장할 객체 타입
|
|
140
|
+
* 개선 사항:
|
|
141
|
+
* 1. 중복 삽입 방지: 같은 항목을 여러 번 insert 해도 안전
|
|
142
|
+
* 2. 메모리 누수 방지: 기존 항목 자동 제거
|
|
143
|
+
* 3. 성능 최적화: 불필요한 배열 생성 최소화
|
|
190
144
|
*
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
* grid.insert(marker, { x: 100, y: 200, width: 30, height: 40 });
|
|
195
|
-
* const nearby = grid.query(105, 205, 10); // (105, 205) 주변 10px 반경
|
|
196
|
-
* ```
|
|
145
|
+
* 사용 사례:
|
|
146
|
+
* - 빠른 Hit Test (마우스 클릭 시 어떤 마커/폴리곤인지 찾기)
|
|
147
|
+
* - 30,000개 항목 → 클릭 위치 주변 ~10개만 체크 (3,000배 빠름)
|
|
197
148
|
*/
|
|
198
149
|
|
|
199
150
|
var SpatialHashGrid =
|
|
@@ -1,45 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 폴리곤 렌더링 유틸리티
|
|
3
3
|
*
|
|
4
|
-
* 이 파일은
|
|
5
|
-
* 함수들을 제공합니다. 다양한 상태(기본, 선택, 호버)에 따른 렌더링과
|
|
6
|
-
* 도넛 폴리곤(구멍이 있는 폴리곤) 지원을 포함합니다.
|
|
7
|
-
*
|
|
8
|
-
* ## 주요 기능
|
|
9
|
-
* - **폴리곤 그리기**: Canvas 2D API를 사용한 폴리곤 렌더링
|
|
10
|
-
* - **도넛 폴리곤 지원**: evenodd fill rule을 사용한 구멍 처리
|
|
11
|
-
* - **상태별 렌더링**: 기본/선택/호버 상태에 따른 색상 및 스타일 적용
|
|
12
|
-
* - **팩토리 함수**: 렌더링 함수를 쉽게 생성할 수 있는 헬퍼
|
|
13
|
-
*
|
|
14
|
-
* @version 2.2.1
|
|
15
|
-
* @since 2.0.0
|
|
16
|
-
* @author 박건웅
|
|
4
|
+
* 이 파일은 폴리곤 렌더링을 위한 헬퍼 함수와 팩토리 함수를 제공합니다.
|
|
17
5
|
*/
|
|
18
6
|
import { CustomRenderBase, CustomRenderEvent, KonvaCanvasData } from "./types";
|
|
19
7
|
/**
|
|
20
|
-
* 폴리곤 그리기 헬퍼 함수
|
|
21
|
-
*
|
|
22
|
-
* Canvas 2D API를 사용하여 폴리곤을 그리는 핵심 함수입니다.
|
|
23
|
-
* 도넛 폴리곤(구멍이 있는 폴리곤)도 지원합니다.
|
|
24
|
-
*
|
|
25
|
-
* @param ctx - Canvas 2D 렌더링 컨텍스트
|
|
26
|
-
* @param polygonOffsets - 변환된 폴리곤 좌표 배열
|
|
27
|
-
* @param isDonutPolygon - 도넛 폴리곤 여부
|
|
28
|
-
* @param fillColor - 채우기 색상
|
|
29
|
-
* @param strokeColor - 테두리 색상
|
|
30
|
-
* @param lineWidth - 테두리 두께
|
|
31
|
-
*
|
|
32
|
-
* @example
|
|
33
|
-
* ```typescript
|
|
34
|
-
* drawPolygon({
|
|
35
|
-
* ctx,
|
|
36
|
-
* polygonOffsets: [[[[100, 200], [200, 200], [200, 300], [100, 300]]]],
|
|
37
|
-
* isDonutPolygon: false,
|
|
38
|
-
* fillColor: 'rgba(255, 0, 0, 0.5)',
|
|
39
|
-
* strokeColor: 'rgba(255, 0, 0, 1)',
|
|
40
|
-
* lineWidth: 2
|
|
41
|
-
* });
|
|
42
|
-
* ```
|
|
8
|
+
* 폴리곤 그리기 헬퍼 함수 (도넛 폴리곤 지원)
|
|
43
9
|
*/
|
|
44
10
|
export declare const drawPolygon: ({ ctx, polygonOffsets, isDonutPolygon, fillColor, strokeColor, lineWidth }: {
|
|
45
11
|
ctx: CanvasRenderingContext2D;
|
|
@@ -50,58 +16,39 @@ export declare const drawPolygon: ({ ctx, polygonOffsets, isDonutPolygon, fillCo
|
|
|
50
16
|
lineWidth: number;
|
|
51
17
|
}) => void;
|
|
52
18
|
/**
|
|
53
|
-
* 폴리곤 Base
|
|
19
|
+
* 폴리곤 Base 렌더링 함수
|
|
54
20
|
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* @param baseFillColor - 기본 폴리곤 채우기 색상
|
|
59
|
-
* @param baseStrokeColor - 기본 폴리곤 테두리 색상
|
|
60
|
-
* @param baseLineWidth - 기본 폴리곤 테두리 두께
|
|
21
|
+
* @param baseFillColor 기본 폴리곤 채우기 색상
|
|
22
|
+
* @param baseStrokeColor 기본 폴리곤 테두리 색상
|
|
23
|
+
* @param baseLineWidth 기본 폴리곤 테두리 두께
|
|
61
24
|
* @returns Base Layer 렌더링 함수
|
|
62
25
|
*
|
|
63
|
-
* @template T 마커/폴리곤 데이터의 추가 속성 타입
|
|
64
|
-
*
|
|
65
26
|
* @example
|
|
66
|
-
* ```typescript
|
|
67
27
|
* const renderBase = renderPolygonBase(
|
|
68
|
-
* 'rgba(255, 100, 100, 0.5)',
|
|
69
|
-
* 'rgba(200, 50, 50, 0.8)',
|
|
70
|
-
* 2
|
|
28
|
+
* 'rgba(255, 100, 100, 0.5)',
|
|
29
|
+
* 'rgba(200, 50, 50, 0.8)',
|
|
30
|
+
* 2
|
|
71
31
|
* );
|
|
72
|
-
* ```
|
|
73
32
|
*/
|
|
74
33
|
export declare const renderPolygonBase: <T = any>(baseFillColor: string, baseStrokeColor: string, baseLineWidth: number) => CustomRenderBase<KonvaCanvasData<T>>;
|
|
75
34
|
/**
|
|
76
|
-
* 폴리곤 Event
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
* @param
|
|
88
|
-
* @param
|
|
89
|
-
* @param
|
|
90
|
-
* @param selectedFillColor - 선택된 폴리곤 채우기 색상 (선택, 기본값: baseFillColor)
|
|
91
|
-
* @param selectedStrokeColor - 선택된 폴리곤 테두리 색상 (선택, 기본값: baseStrokeColor)
|
|
92
|
-
* @param selectedLineWidth - 선택된 폴리곤 테두리 두께 (선택, 기본값: baseLineWidth)
|
|
93
|
-
* @param activeFillColor - 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
94
|
-
* @param activeStrokeColor - 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
95
|
-
* @param activeLineWidth - 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
96
|
-
* @param hoveredFillColor - Hover 시 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
97
|
-
* @param hoveredStrokeColor - Hover 시 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
98
|
-
* @param hoveredLineWidth - Hover 시 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
35
|
+
* 폴리곤 Event 렌더링 함수
|
|
36
|
+
*
|
|
37
|
+
* @param baseFillColor 기본 폴리곤 채우기 색상 (필수, fallback용)
|
|
38
|
+
* @param baseStrokeColor 기본 폴리곤 테두리 색상 (필수, fallback용)
|
|
39
|
+
* @param baseLineWidth 기본 폴리곤 테두리 두께 (필수, fallback용)
|
|
40
|
+
* @param selectedFillColor 선택된 폴리곤 채우기 색상 (선택, 기본값: baseFillColor)
|
|
41
|
+
* @param selectedStrokeColor 선택된 폴리곤 테두리 색상 (선택, 기본값: baseStrokeColor)
|
|
42
|
+
* @param selectedLineWidth 선택된 폴리곤 테두리 두께 (선택, 기본값: baseLineWidth)
|
|
43
|
+
* @param activeFillColor 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
44
|
+
* @param activeStrokeColor 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
45
|
+
* @param activeLineWidth 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
46
|
+
* @param hoveredFillColor Hover 시 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
47
|
+
* @param hoveredStrokeColor Hover 시 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
48
|
+
* @param hoveredLineWidth Hover 시 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
99
49
|
* @returns Event Layer 렌더링 함수
|
|
100
50
|
*
|
|
101
|
-
* @template T 마커/폴리곤 데이터의 추가 속성 타입
|
|
102
|
-
*
|
|
103
51
|
* @example
|
|
104
|
-
* ```typescript
|
|
105
52
|
* const renderEvent = renderPolygonEvent(
|
|
106
53
|
* 'rgba(255, 100, 100, 0.5)', // baseFillColor
|
|
107
54
|
* 'rgba(200, 50, 50, 0.8)', // baseStrokeColor
|
|
@@ -110,6 +57,5 @@ export declare const renderPolygonBase: <T = any>(baseFillColor: string, baseStr
|
|
|
110
57
|
* 'rgba(255, 152, 0, 1)', // selectedStrokeColor
|
|
111
58
|
* 4 // selectedLineWidth
|
|
112
59
|
* );
|
|
113
|
-
* ```
|
|
114
60
|
*/
|
|
115
61
|
export declare const renderPolygonEvent: <T = any>(baseFillColor: string, baseStrokeColor: string, baseLineWidth: number, selectedFillColor?: string, selectedStrokeColor?: string, selectedLineWidth?: number, activeFillColor?: string, activeStrokeColor?: string, activeLineWidth?: number, hoveredFillColor?: string, hoveredStrokeColor?: string, hoveredLineWidth?: number) => CustomRenderEvent<KonvaCanvasData<T>>;
|
|
@@ -3,47 +3,13 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* 폴리곤 렌더링 유틸리티
|
|
7
7
|
*
|
|
8
|
-
* 이 파일은
|
|
9
|
-
* 함수들을 제공합니다. 다양한 상태(기본, 선택, 호버)에 따른 렌더링과
|
|
10
|
-
* 도넛 폴리곤(구멍이 있는 폴리곤) 지원을 포함합니다.
|
|
11
|
-
*
|
|
12
|
-
* ## 주요 기능
|
|
13
|
-
* - **폴리곤 그리기**: Canvas 2D API를 사용한 폴리곤 렌더링
|
|
14
|
-
* - **도넛 폴리곤 지원**: evenodd fill rule을 사용한 구멍 처리
|
|
15
|
-
* - **상태별 렌더링**: 기본/선택/호버 상태에 따른 색상 및 스타일 적용
|
|
16
|
-
* - **팩토리 함수**: 렌더링 함수를 쉽게 생성할 수 있는 헬퍼
|
|
17
|
-
*
|
|
18
|
-
* @version 2.2.1
|
|
19
|
-
* @since 2.0.0
|
|
20
|
-
* @author 박건웅
|
|
8
|
+
* 이 파일은 폴리곤 렌더링을 위한 헬퍼 함수와 팩토리 함수를 제공합니다.
|
|
21
9
|
*/
|
|
22
10
|
|
|
23
11
|
/**
|
|
24
|
-
* 폴리곤 그리기 헬퍼 함수
|
|
25
|
-
*
|
|
26
|
-
* Canvas 2D API를 사용하여 폴리곤을 그리는 핵심 함수입니다.
|
|
27
|
-
* 도넛 폴리곤(구멍이 있는 폴리곤)도 지원합니다.
|
|
28
|
-
*
|
|
29
|
-
* @param ctx - Canvas 2D 렌더링 컨텍스트
|
|
30
|
-
* @param polygonOffsets - 변환된 폴리곤 좌표 배열
|
|
31
|
-
* @param isDonutPolygon - 도넛 폴리곤 여부
|
|
32
|
-
* @param fillColor - 채우기 색상
|
|
33
|
-
* @param strokeColor - 테두리 색상
|
|
34
|
-
* @param lineWidth - 테두리 두께
|
|
35
|
-
*
|
|
36
|
-
* @example
|
|
37
|
-
* ```typescript
|
|
38
|
-
* drawPolygon({
|
|
39
|
-
* ctx,
|
|
40
|
-
* polygonOffsets: [[[[100, 200], [200, 200], [200, 300], [100, 300]]]],
|
|
41
|
-
* isDonutPolygon: false,
|
|
42
|
-
* fillColor: 'rgba(255, 0, 0, 0.5)',
|
|
43
|
-
* strokeColor: 'rgba(255, 0, 0, 1)',
|
|
44
|
-
* lineWidth: 2
|
|
45
|
-
* });
|
|
46
|
-
* ```
|
|
12
|
+
* 폴리곤 그리기 헬퍼 함수 (도넛 폴리곤 지원)
|
|
47
13
|
*/
|
|
48
14
|
var drawPolygon = function (_a) {
|
|
49
15
|
var ctx = _a.ctx,
|
|
@@ -114,26 +80,19 @@ var drawPolygon = function (_a) {
|
|
|
114
80
|
}
|
|
115
81
|
};
|
|
116
82
|
/**
|
|
117
|
-
* 폴리곤 Base
|
|
83
|
+
* 폴리곤 Base 렌더링 함수
|
|
118
84
|
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
* @param baseFillColor - 기본 폴리곤 채우기 색상
|
|
123
|
-
* @param baseStrokeColor - 기본 폴리곤 테두리 색상
|
|
124
|
-
* @param baseLineWidth - 기본 폴리곤 테두리 두께
|
|
85
|
+
* @param baseFillColor 기본 폴리곤 채우기 색상
|
|
86
|
+
* @param baseStrokeColor 기본 폴리곤 테두리 색상
|
|
87
|
+
* @param baseLineWidth 기본 폴리곤 테두리 두께
|
|
125
88
|
* @returns Base Layer 렌더링 함수
|
|
126
89
|
*
|
|
127
|
-
* @template T 마커/폴리곤 데이터의 추가 속성 타입
|
|
128
|
-
*
|
|
129
90
|
* @example
|
|
130
|
-
* ```typescript
|
|
131
91
|
* const renderBase = renderPolygonBase(
|
|
132
|
-
* 'rgba(255, 100, 100, 0.5)',
|
|
133
|
-
* 'rgba(200, 50, 50, 0.8)',
|
|
134
|
-
* 2
|
|
92
|
+
* 'rgba(255, 100, 100, 0.5)',
|
|
93
|
+
* 'rgba(200, 50, 50, 0.8)',
|
|
94
|
+
* 2
|
|
135
95
|
* );
|
|
136
|
-
* ```
|
|
137
96
|
*/
|
|
138
97
|
|
|
139
98
|
var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth) {
|
|
@@ -162,35 +121,23 @@ var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth)
|
|
|
162
121
|
};
|
|
163
122
|
};
|
|
164
123
|
/**
|
|
165
|
-
* 폴리곤 Event
|
|
166
|
-
*
|
|
167
|
-
* 선택, 호버, 활성 상태의 폴리곤들을 렌더링하는 함수를 생성합니다.
|
|
168
|
-
* 다양한 상태에 따른 색상과 스타일을 지원하며, fallback 메커니즘을 제공합니다.
|
|
124
|
+
* 폴리곤 Event 렌더링 함수
|
|
169
125
|
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
176
|
-
* @param
|
|
177
|
-
* @param
|
|
178
|
-
* @param
|
|
179
|
-
* @param
|
|
180
|
-
* @param
|
|
181
|
-
* @param
|
|
182
|
-
* @param activeFillColor - 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
183
|
-
* @param activeStrokeColor - 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
184
|
-
* @param activeLineWidth - 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
185
|
-
* @param hoveredFillColor - Hover 시 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
186
|
-
* @param hoveredStrokeColor - Hover 시 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
187
|
-
* @param hoveredLineWidth - Hover 시 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
126
|
+
* @param baseFillColor 기본 폴리곤 채우기 색상 (필수, fallback용)
|
|
127
|
+
* @param baseStrokeColor 기본 폴리곤 테두리 색상 (필수, fallback용)
|
|
128
|
+
* @param baseLineWidth 기본 폴리곤 테두리 두께 (필수, fallback용)
|
|
129
|
+
* @param selectedFillColor 선택된 폴리곤 채우기 색상 (선택, 기본값: baseFillColor)
|
|
130
|
+
* @param selectedStrokeColor 선택된 폴리곤 테두리 색상 (선택, 기본값: baseStrokeColor)
|
|
131
|
+
* @param selectedLineWidth 선택된 폴리곤 테두리 두께 (선택, 기본값: baseLineWidth)
|
|
132
|
+
* @param activeFillColor 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
133
|
+
* @param activeStrokeColor 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
134
|
+
* @param activeLineWidth 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
135
|
+
* @param hoveredFillColor Hover 시 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
136
|
+
* @param hoveredStrokeColor Hover 시 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
137
|
+
* @param hoveredLineWidth Hover 시 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
188
138
|
* @returns Event Layer 렌더링 함수
|
|
189
139
|
*
|
|
190
|
-
* @template T 마커/폴리곤 데이터의 추가 속성 타입
|
|
191
|
-
*
|
|
192
140
|
* @example
|
|
193
|
-
* ```typescript
|
|
194
141
|
* const renderEvent = renderPolygonEvent(
|
|
195
142
|
* 'rgba(255, 100, 100, 0.5)', // baseFillColor
|
|
196
143
|
* 'rgba(200, 50, 50, 0.8)', // baseStrokeColor
|
|
@@ -199,7 +146,6 @@ var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth)
|
|
|
199
146
|
* 'rgba(255, 152, 0, 1)', // selectedStrokeColor
|
|
200
147
|
* 4 // selectedLineWidth
|
|
201
148
|
* );
|
|
202
|
-
* ```
|
|
203
149
|
*/
|
|
204
150
|
|
|
205
151
|
var renderPolygonEvent = function (baseFillColor, baseStrokeColor, baseLineWidth, selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
|