@rxflow/manhattan 0.0.2-alpha.8 → 0.0.3
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/README.md +214 -10
- package/cjs/getManHattanPath.d.ts.map +1 -1
- package/cjs/getManHattanPath.js +77 -46
- package/cjs/obstacle/ObstacleMap.d.ts +41 -9
- package/cjs/obstacle/ObstacleMap.d.ts.map +1 -1
- package/cjs/obstacle/ObstacleMap.js +201 -96
- package/cjs/obstacle/QuadTree.d.ts +119 -0
- package/cjs/obstacle/QuadTree.d.ts.map +1 -0
- package/cjs/obstacle/QuadTree.js +334 -0
- package/cjs/options/defaults.d.ts +1 -1
- package/cjs/options/defaults.d.ts.map +1 -1
- package/cjs/options/resolver.d.ts.map +1 -1
- package/cjs/options/resolver.js +145 -17
- package/cjs/options/types.d.ts +41 -0
- package/cjs/options/types.d.ts.map +1 -1
- package/cjs/pathfinder/PathCache.d.ts +92 -0
- package/cjs/pathfinder/PathCache.d.ts.map +1 -0
- package/cjs/pathfinder/PathCache.js +249 -0
- package/cjs/pathfinder/findRoute.d.ts.map +1 -1
- package/cjs/pathfinder/findRoute.js +96 -31
- package/cjs/pathfinder/index.d.ts +1 -0
- package/cjs/pathfinder/index.d.ts.map +1 -1
- package/cjs/pathfinder/index.js +26 -1
- package/cjs/svg/pathConverter.d.ts +13 -0
- package/cjs/svg/pathConverter.d.ts.map +1 -1
- package/cjs/svg/pathConverter.js +170 -1
- package/cjs/utils/AdaptiveStepCalculator.d.ts +90 -0
- package/cjs/utils/AdaptiveStepCalculator.d.ts.map +1 -0
- package/cjs/utils/AdaptiveStepCalculator.js +224 -0
- package/cjs/utils/ErrorRecovery.d.ts +182 -0
- package/cjs/utils/ErrorRecovery.d.ts.map +1 -0
- package/cjs/utils/ErrorRecovery.js +413 -0
- package/cjs/utils/GlobalGrid.d.ts +99 -0
- package/cjs/utils/GlobalGrid.d.ts.map +1 -0
- package/cjs/utils/GlobalGrid.js +224 -0
- package/cjs/utils/PerformanceMonitor.d.ts +139 -0
- package/cjs/utils/PerformanceMonitor.d.ts.map +1 -0
- package/cjs/utils/PerformanceMonitor.js +305 -0
- package/cjs/utils/getAnchorPoints.d.ts.map +1 -1
- package/cjs/utils/getAnchorPoints.js +0 -4
- package/cjs/utils/grid.d.ts +15 -0
- package/cjs/utils/grid.d.ts.map +1 -1
- package/cjs/utils/grid.js +19 -12
- package/cjs/utils/heuristics.d.ts +61 -0
- package/cjs/utils/heuristics.d.ts.map +1 -0
- package/cjs/utils/heuristics.js +141 -0
- package/cjs/utils/index.d.ts +6 -0
- package/cjs/utils/index.d.ts.map +1 -1
- package/cjs/utils/index.js +66 -0
- package/cjs/utils/pathProcessing.d.ts +45 -0
- package/cjs/utils/pathProcessing.d.ts.map +1 -0
- package/cjs/utils/pathProcessing.js +270 -0
- package/cjs/utils/pathValidation.d.ts.map +1 -1
- package/cjs/utils/pathValidation.js +0 -1
- package/cjs/utils/rect.d.ts.map +1 -1
- package/cjs/utils/rect.js +7 -0
- package/cjs/utils/route.d.ts.map +1 -1
- package/cjs/utils/route.js +18 -2
- package/esm/getManHattanPath.d.ts.map +1 -1
- package/esm/getManHattanPath.js +92 -69
- package/esm/obstacle/ObstacleMap.d.ts +41 -9
- package/esm/obstacle/ObstacleMap.d.ts.map +1 -1
- package/esm/obstacle/ObstacleMap.js +218 -99
- package/esm/obstacle/QuadTree.d.ts +119 -0
- package/esm/obstacle/QuadTree.d.ts.map +1 -0
- package/esm/obstacle/QuadTree.js +488 -0
- package/esm/options/defaults.d.ts +1 -1
- package/esm/options/defaults.d.ts.map +1 -1
- package/esm/options/resolver.d.ts.map +1 -1
- package/esm/options/resolver.js +147 -18
- package/esm/options/types.d.ts +41 -0
- package/esm/options/types.d.ts.map +1 -1
- package/esm/pathfinder/PathCache.d.ts +92 -0
- package/esm/pathfinder/PathCache.d.ts.map +1 -0
- package/esm/pathfinder/PathCache.js +278 -0
- package/esm/pathfinder/findRoute.d.ts.map +1 -1
- package/esm/pathfinder/findRoute.js +98 -44
- package/esm/pathfinder/index.d.ts +1 -0
- package/esm/pathfinder/index.d.ts.map +1 -1
- package/esm/pathfinder/index.js +2 -1
- package/esm/svg/pathConverter.d.ts +13 -0
- package/esm/svg/pathConverter.d.ts.map +1 -1
- package/esm/svg/pathConverter.js +170 -1
- package/esm/utils/AdaptiveStepCalculator.d.ts +90 -0
- package/esm/utils/AdaptiveStepCalculator.d.ts.map +1 -0
- package/esm/utils/AdaptiveStepCalculator.js +252 -0
- package/esm/utils/ErrorRecovery.d.ts +182 -0
- package/esm/utils/ErrorRecovery.d.ts.map +1 -0
- package/esm/utils/ErrorRecovery.js +499 -0
- package/esm/utils/GlobalGrid.d.ts +99 -0
- package/esm/utils/GlobalGrid.d.ts.map +1 -0
- package/esm/utils/GlobalGrid.js +259 -0
- package/esm/utils/PerformanceMonitor.d.ts +139 -0
- package/esm/utils/PerformanceMonitor.d.ts.map +1 -0
- package/esm/utils/PerformanceMonitor.js +360 -0
- package/esm/utils/getAnchorPoints.d.ts.map +1 -1
- package/esm/utils/getAnchorPoints.js +0 -4
- package/esm/utils/grid.d.ts +15 -0
- package/esm/utils/grid.d.ts.map +1 -1
- package/esm/utils/grid.js +18 -13
- package/esm/utils/heuristics.d.ts +61 -0
- package/esm/utils/heuristics.d.ts.map +1 -0
- package/esm/utils/heuristics.js +144 -0
- package/esm/utils/index.d.ts +6 -0
- package/esm/utils/index.d.ts.map +1 -1
- package/esm/utils/index.js +7 -1
- package/esm/utils/pathProcessing.d.ts +45 -0
- package/esm/utils/pathProcessing.d.ts.map +1 -0
- package/esm/utils/pathProcessing.js +270 -0
- package/esm/utils/pathValidation.d.ts.map +1 -1
- package/esm/utils/pathValidation.js +0 -1
- package/esm/utils/rect.d.ts.map +1 -1
- package/esm/utils/rect.js +11 -4
- package/esm/utils/route.d.ts.map +1 -1
- package/esm/utils/route.js +18 -2
- package/package.json +10 -2
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
5
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
6
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
7
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
8
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
9
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
10
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
11
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
12
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
13
|
+
/**
|
|
14
|
+
* AdaptiveStepCalculator - 自适应步长计算器
|
|
15
|
+
*
|
|
16
|
+
* 根据场景自动调整网格步长,平衡性能和路径质量
|
|
17
|
+
* - 高密度区域使用小步长,提高路径精度
|
|
18
|
+
* - 长距离路径使用大步长,提高计算性能
|
|
19
|
+
*
|
|
20
|
+
* Feature: manhattan-optimization
|
|
21
|
+
* Requirements: 2.3, 2.4
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 自适应步长配置
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 默认自适应步长配置
|
|
30
|
+
*/
|
|
31
|
+
export var DEFAULT_ADAPTIVE_STEP_CONFIG = {
|
|
32
|
+
enabled: false,
|
|
33
|
+
minStep: 5,
|
|
34
|
+
maxStep: 20,
|
|
35
|
+
densityBased: {
|
|
36
|
+
enabled: true,
|
|
37
|
+
threshold: 0.5 // 每10000平方像素0.5个节点
|
|
38
|
+
},
|
|
39
|
+
distanceBased: {
|
|
40
|
+
enabled: true,
|
|
41
|
+
shortPathThreshold: 200,
|
|
42
|
+
longPathThreshold: 800
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* 自适应步长计算器
|
|
48
|
+
*/
|
|
49
|
+
export var AdaptiveStepCalculator = /*#__PURE__*/function () {
|
|
50
|
+
function AdaptiveStepCalculator() {
|
|
51
|
+
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
52
|
+
_classCallCheck(this, AdaptiveStepCalculator);
|
|
53
|
+
_defineProperty(this, "config", void 0);
|
|
54
|
+
this.config = this.mergeConfig(config);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* 合并配置与默认值
|
|
59
|
+
*/
|
|
60
|
+
_createClass(AdaptiveStepCalculator, [{
|
|
61
|
+
key: "mergeConfig",
|
|
62
|
+
value: function mergeConfig(config) {
|
|
63
|
+
var _config$enabled, _config$minStep, _config$maxStep, _config$densityBased$, _config$densityBased, _config$densityBased$2, _config$densityBased2, _config$distanceBased, _config$distanceBased2, _config$distanceBased3, _config$distanceBased4, _config$distanceBased5, _config$distanceBased6;
|
|
64
|
+
return {
|
|
65
|
+
enabled: (_config$enabled = config.enabled) !== null && _config$enabled !== void 0 ? _config$enabled : DEFAULT_ADAPTIVE_STEP_CONFIG.enabled,
|
|
66
|
+
minStep: (_config$minStep = config.minStep) !== null && _config$minStep !== void 0 ? _config$minStep : DEFAULT_ADAPTIVE_STEP_CONFIG.minStep,
|
|
67
|
+
maxStep: (_config$maxStep = config.maxStep) !== null && _config$maxStep !== void 0 ? _config$maxStep : DEFAULT_ADAPTIVE_STEP_CONFIG.maxStep,
|
|
68
|
+
densityBased: {
|
|
69
|
+
enabled: (_config$densityBased$ = (_config$densityBased = config.densityBased) === null || _config$densityBased === void 0 ? void 0 : _config$densityBased.enabled) !== null && _config$densityBased$ !== void 0 ? _config$densityBased$ : DEFAULT_ADAPTIVE_STEP_CONFIG.densityBased.enabled,
|
|
70
|
+
threshold: (_config$densityBased$2 = (_config$densityBased2 = config.densityBased) === null || _config$densityBased2 === void 0 ? void 0 : _config$densityBased2.threshold) !== null && _config$densityBased$2 !== void 0 ? _config$densityBased$2 : DEFAULT_ADAPTIVE_STEP_CONFIG.densityBased.threshold
|
|
71
|
+
},
|
|
72
|
+
distanceBased: {
|
|
73
|
+
enabled: (_config$distanceBased = (_config$distanceBased2 = config.distanceBased) === null || _config$distanceBased2 === void 0 ? void 0 : _config$distanceBased2.enabled) !== null && _config$distanceBased !== void 0 ? _config$distanceBased : DEFAULT_ADAPTIVE_STEP_CONFIG.distanceBased.enabled,
|
|
74
|
+
shortPathThreshold: (_config$distanceBased3 = (_config$distanceBased4 = config.distanceBased) === null || _config$distanceBased4 === void 0 ? void 0 : _config$distanceBased4.shortPathThreshold) !== null && _config$distanceBased3 !== void 0 ? _config$distanceBased3 : DEFAULT_ADAPTIVE_STEP_CONFIG.distanceBased.shortPathThreshold,
|
|
75
|
+
longPathThreshold: (_config$distanceBased5 = (_config$distanceBased6 = config.distanceBased) === null || _config$distanceBased6 === void 0 ? void 0 : _config$distanceBased6.longPathThreshold) !== null && _config$distanceBased5 !== void 0 ? _config$distanceBased5 : DEFAULT_ADAPTIVE_STEP_CONFIG.distanceBased.longPathThreshold
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* 计算节点密度
|
|
82
|
+
* @param nodeLookup 节点查找表
|
|
83
|
+
* @returns 密度值(节点数/10000平方像素)
|
|
84
|
+
*/
|
|
85
|
+
}, {
|
|
86
|
+
key: "calculateNodeDensity",
|
|
87
|
+
value: function calculateNodeDensity(nodeLookup) {
|
|
88
|
+
if (nodeLookup.size === 0) return 0;
|
|
89
|
+
var minX = Infinity,
|
|
90
|
+
minY = Infinity;
|
|
91
|
+
var maxX = -Infinity,
|
|
92
|
+
maxY = -Infinity;
|
|
93
|
+
var _iterator = _createForOfIteratorHelper(nodeLookup.values()),
|
|
94
|
+
_step;
|
|
95
|
+
try {
|
|
96
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
97
|
+
var _node$internals$posit, _node$internals, _ref, _node$measured$width, _node$measured, _ref2, _node$measured$height, _node$measured2;
|
|
98
|
+
var node = _step.value;
|
|
99
|
+
var pos = (_node$internals$posit = (_node$internals = node.internals) === null || _node$internals === void 0 ? void 0 : _node$internals.positionAbsolute) !== null && _node$internals$posit !== void 0 ? _node$internals$posit : node.position;
|
|
100
|
+
var _width = (_ref = (_node$measured$width = (_node$measured = node.measured) === null || _node$measured === void 0 ? void 0 : _node$measured.width) !== null && _node$measured$width !== void 0 ? _node$measured$width : node.width) !== null && _ref !== void 0 ? _ref : 100;
|
|
101
|
+
var _height = (_ref2 = (_node$measured$height = (_node$measured2 = node.measured) === null || _node$measured2 === void 0 ? void 0 : _node$measured2.height) !== null && _node$measured$height !== void 0 ? _node$measured$height : node.height) !== null && _ref2 !== void 0 ? _ref2 : 50;
|
|
102
|
+
minX = Math.min(minX, pos.x);
|
|
103
|
+
minY = Math.min(minY, pos.y);
|
|
104
|
+
maxX = Math.max(maxX, pos.x + _width);
|
|
105
|
+
maxY = Math.max(maxY, pos.y + _height);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// 计算边界框面积(以10000平方像素为单位)
|
|
109
|
+
} catch (err) {
|
|
110
|
+
_iterator.e(err);
|
|
111
|
+
} finally {
|
|
112
|
+
_iterator.f();
|
|
113
|
+
}
|
|
114
|
+
var width = maxX - minX;
|
|
115
|
+
var height = maxY - minY;
|
|
116
|
+
var area = width * height / 10000;
|
|
117
|
+
if (area <= 0) return 0;
|
|
118
|
+
return nodeLookup.size / area;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* 计算两点之间的曼哈顿距离
|
|
123
|
+
*/
|
|
124
|
+
}, {
|
|
125
|
+
key: "calculateDistance",
|
|
126
|
+
value: function calculateDistance(source, target) {
|
|
127
|
+
return Math.abs(target.x - source.x) + Math.abs(target.y - source.y);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* 基于距离计算步长
|
|
132
|
+
*/
|
|
133
|
+
}, {
|
|
134
|
+
key: "calculateDistanceBasedStep",
|
|
135
|
+
value: function calculateDistanceBasedStep(distance) {
|
|
136
|
+
var _this$config = this.config,
|
|
137
|
+
minStep = _this$config.minStep,
|
|
138
|
+
maxStep = _this$config.maxStep,
|
|
139
|
+
distanceBased = _this$config.distanceBased;
|
|
140
|
+
if (!distanceBased.enabled) {
|
|
141
|
+
return minStep;
|
|
142
|
+
}
|
|
143
|
+
var shortPathThreshold = distanceBased.shortPathThreshold,
|
|
144
|
+
longPathThreshold = distanceBased.longPathThreshold;
|
|
145
|
+
if (distance <= shortPathThreshold) {
|
|
146
|
+
return minStep;
|
|
147
|
+
}
|
|
148
|
+
if (distance >= longPathThreshold) {
|
|
149
|
+
return maxStep;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// 线性插值
|
|
153
|
+
var ratio = (distance - shortPathThreshold) / (longPathThreshold - shortPathThreshold);
|
|
154
|
+
return Math.round(minStep + ratio * (maxStep - minStep));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* 基于密度计算步长
|
|
159
|
+
*/
|
|
160
|
+
}, {
|
|
161
|
+
key: "calculateDensityBasedStep",
|
|
162
|
+
value: function calculateDensityBasedStep(density) {
|
|
163
|
+
var _this$config2 = this.config,
|
|
164
|
+
minStep = _this$config2.minStep,
|
|
165
|
+
maxStep = _this$config2.maxStep,
|
|
166
|
+
densityBased = _this$config2.densityBased;
|
|
167
|
+
if (!densityBased.enabled) {
|
|
168
|
+
return maxStep;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// 高密度使用小步长
|
|
172
|
+
if (density >= densityBased.threshold) {
|
|
173
|
+
return minStep;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// 低密度使用大步长
|
|
177
|
+
if (density <= densityBased.threshold / 2) {
|
|
178
|
+
return maxStep;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// 线性插值
|
|
182
|
+
var ratio = (densityBased.threshold - density) / (densityBased.threshold / 2);
|
|
183
|
+
return Math.round(minStep + ratio * (maxStep - minStep));
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* 计算自适应步长
|
|
188
|
+
* 综合考虑距离和密度因素
|
|
189
|
+
*/
|
|
190
|
+
}, {
|
|
191
|
+
key: "calculateStep",
|
|
192
|
+
value: function calculateStep(sourceNode, targetNode, nodeLookup) {
|
|
193
|
+
var _sourceNode$internals, _sourceNode$internals2, _targetNode$internals, _targetNode$internals2, _ref3, _sourceNode$measured$, _sourceNode$measured, _ref4, _sourceNode$measured$2, _sourceNode$measured2, _ref5, _targetNode$measured$, _targetNode$measured, _ref6, _targetNode$measured$2, _targetNode$measured2;
|
|
194
|
+
if (!this.config.enabled) {
|
|
195
|
+
return this.config.minStep;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// 获取源和目标位置
|
|
199
|
+
var sourcePos = (_sourceNode$internals = (_sourceNode$internals2 = sourceNode.internals) === null || _sourceNode$internals2 === void 0 ? void 0 : _sourceNode$internals2.positionAbsolute) !== null && _sourceNode$internals !== void 0 ? _sourceNode$internals : sourceNode.position;
|
|
200
|
+
var targetPos = (_targetNode$internals = (_targetNode$internals2 = targetNode.internals) === null || _targetNode$internals2 === void 0 ? void 0 : _targetNode$internals2.positionAbsolute) !== null && _targetNode$internals !== void 0 ? _targetNode$internals : targetNode.position;
|
|
201
|
+
|
|
202
|
+
// 计算节点中心点
|
|
203
|
+
var sourceWidth = (_ref3 = (_sourceNode$measured$ = (_sourceNode$measured = sourceNode.measured) === null || _sourceNode$measured === void 0 ? void 0 : _sourceNode$measured.width) !== null && _sourceNode$measured$ !== void 0 ? _sourceNode$measured$ : sourceNode.width) !== null && _ref3 !== void 0 ? _ref3 : 100;
|
|
204
|
+
var sourceHeight = (_ref4 = (_sourceNode$measured$2 = (_sourceNode$measured2 = sourceNode.measured) === null || _sourceNode$measured2 === void 0 ? void 0 : _sourceNode$measured2.height) !== null && _sourceNode$measured$2 !== void 0 ? _sourceNode$measured$2 : sourceNode.height) !== null && _ref4 !== void 0 ? _ref4 : 50;
|
|
205
|
+
var targetWidth = (_ref5 = (_targetNode$measured$ = (_targetNode$measured = targetNode.measured) === null || _targetNode$measured === void 0 ? void 0 : _targetNode$measured.width) !== null && _targetNode$measured$ !== void 0 ? _targetNode$measured$ : targetNode.width) !== null && _ref5 !== void 0 ? _ref5 : 100;
|
|
206
|
+
var targetHeight = (_ref6 = (_targetNode$measured$2 = (_targetNode$measured2 = targetNode.measured) === null || _targetNode$measured2 === void 0 ? void 0 : _targetNode$measured2.height) !== null && _targetNode$measured$2 !== void 0 ? _targetNode$measured$2 : targetNode.height) !== null && _ref6 !== void 0 ? _ref6 : 50;
|
|
207
|
+
var sourceCenter = {
|
|
208
|
+
x: sourcePos.x + sourceWidth / 2,
|
|
209
|
+
y: sourcePos.y + sourceHeight / 2
|
|
210
|
+
};
|
|
211
|
+
var targetCenter = {
|
|
212
|
+
x: targetPos.x + targetWidth / 2,
|
|
213
|
+
y: targetPos.y + targetHeight / 2
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
// 计算距离
|
|
217
|
+
var distance = this.calculateDistance(sourceCenter, targetCenter);
|
|
218
|
+
|
|
219
|
+
// 计算密度
|
|
220
|
+
var density = this.calculateNodeDensity(nodeLookup);
|
|
221
|
+
|
|
222
|
+
// 获取基于距离和密度的步长
|
|
223
|
+
var distanceStep = this.calculateDistanceBasedStep(distance);
|
|
224
|
+
var densityStep = this.calculateDensityBasedStep(density);
|
|
225
|
+
|
|
226
|
+
// 取两者中较小的值(更保守的选择)
|
|
227
|
+
var step = Math.min(distanceStep, densityStep);
|
|
228
|
+
|
|
229
|
+
// 确保步长在有效范围内
|
|
230
|
+
return Math.max(this.config.minStep, Math.min(this.config.maxStep, step));
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* 获取当前配置
|
|
235
|
+
*/
|
|
236
|
+
}, {
|
|
237
|
+
key: "getConfig",
|
|
238
|
+
value: function getConfig() {
|
|
239
|
+
return _objectSpread({}, this.config);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* 更新配置
|
|
244
|
+
*/
|
|
245
|
+
}, {
|
|
246
|
+
key: "updateConfig",
|
|
247
|
+
value: function updateConfig(config) {
|
|
248
|
+
this.config = this.mergeConfig(_objectSpread(_objectSpread({}, this.config), config));
|
|
249
|
+
}
|
|
250
|
+
}]);
|
|
251
|
+
return AdaptiveStepCalculator;
|
|
252
|
+
}();
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ErrorRecovery - 错误恢复和降级策略
|
|
3
|
+
*
|
|
4
|
+
* 提供路径计算失败时的恢复机制,包括:
|
|
5
|
+
* - 超时检测和处理
|
|
6
|
+
* - 降级路径生成
|
|
7
|
+
* - 错误分类和报告
|
|
8
|
+
*
|
|
9
|
+
* Implements: Requirements 4.2, 3.6
|
|
10
|
+
*/
|
|
11
|
+
import { Point, Rectangle } from '../geometry';
|
|
12
|
+
/**
|
|
13
|
+
* 错误类型枚举
|
|
14
|
+
*/
|
|
15
|
+
export declare enum PathfindingErrorType {
|
|
16
|
+
/** 超时错误 - 计算时间超过限制 */
|
|
17
|
+
TIMEOUT = "TIMEOUT",
|
|
18
|
+
/** 无路径错误 - 无法找到有效路径 */
|
|
19
|
+
NO_PATH = "NO_PATH",
|
|
20
|
+
/** 无效输入错误 - 输入参数无效 */
|
|
21
|
+
INVALID_INPUT = "INVALID_INPUT",
|
|
22
|
+
/** 障碍物阻塞错误 - 起点或终点被障碍物阻塞 */
|
|
23
|
+
BLOCKED = "BLOCKED",
|
|
24
|
+
/** 内部错误 - 算法内部错误 */
|
|
25
|
+
INTERNAL = "INTERNAL"
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 路径计算错误
|
|
29
|
+
*/
|
|
30
|
+
export declare class PathfindingError extends Error {
|
|
31
|
+
readonly type: PathfindingErrorType;
|
|
32
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
33
|
+
constructor(type: PathfindingErrorType, message: string, details?: Record<string, unknown> | undefined);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 恢复策略类型
|
|
37
|
+
*/
|
|
38
|
+
export declare enum RecoveryStrategy {
|
|
39
|
+
/** 直线连接 */
|
|
40
|
+
DIRECT_LINE = "DIRECT_LINE",
|
|
41
|
+
/** L形路径 */
|
|
42
|
+
L_SHAPE = "L_SHAPE",
|
|
43
|
+
/** Z形路径 */
|
|
44
|
+
Z_SHAPE = "Z_SHAPE",
|
|
45
|
+
/** 简化曼哈顿路径 */
|
|
46
|
+
SIMPLE_MANHATTAN = "SIMPLE_MANHATTAN",
|
|
47
|
+
/** 无恢复 */
|
|
48
|
+
NONE = "NONE"
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 恢复结果
|
|
52
|
+
*/
|
|
53
|
+
export interface RecoveryResult {
|
|
54
|
+
/** 是否成功恢复 */
|
|
55
|
+
success: boolean;
|
|
56
|
+
/** 恢复后的路径 */
|
|
57
|
+
path: Point[];
|
|
58
|
+
/** 使用的恢复策略 */
|
|
59
|
+
strategy: RecoveryStrategy;
|
|
60
|
+
/** 原始错误 */
|
|
61
|
+
originalError?: PathfindingError;
|
|
62
|
+
/** 恢复耗时(毫秒) */
|
|
63
|
+
recoveryTime: number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 错误恢复配置
|
|
67
|
+
*/
|
|
68
|
+
export interface ErrorRecoveryConfig {
|
|
69
|
+
/** 是否启用自动恢复 */
|
|
70
|
+
enabled: boolean;
|
|
71
|
+
/** 最大恢复尝试次数 */
|
|
72
|
+
maxAttempts: number;
|
|
73
|
+
/** 恢复策略优先级 */
|
|
74
|
+
strategyPriority: RecoveryStrategy[];
|
|
75
|
+
/** 是否记录恢复日志 */
|
|
76
|
+
logRecovery: boolean;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 默认恢复配置
|
|
80
|
+
*/
|
|
81
|
+
export declare const DEFAULT_RECOVERY_CONFIG: ErrorRecoveryConfig;
|
|
82
|
+
/**
|
|
83
|
+
* 错误恢复类
|
|
84
|
+
*/
|
|
85
|
+
export declare class ErrorRecovery {
|
|
86
|
+
private config;
|
|
87
|
+
private recoveryAttempts;
|
|
88
|
+
constructor(config?: Partial<ErrorRecoveryConfig>);
|
|
89
|
+
/**
|
|
90
|
+
* 尝试恢复路径计算
|
|
91
|
+
*/
|
|
92
|
+
recover(from: Point, to: Point, error: PathfindingError, obstacles?: Rectangle[]): RecoveryResult;
|
|
93
|
+
/**
|
|
94
|
+
* 应用恢复策略
|
|
95
|
+
*/
|
|
96
|
+
private applyStrategy;
|
|
97
|
+
/**
|
|
98
|
+
* 直线连接策略
|
|
99
|
+
*/
|
|
100
|
+
private directLine;
|
|
101
|
+
/**
|
|
102
|
+
* L形路径策略
|
|
103
|
+
*/
|
|
104
|
+
private lShape;
|
|
105
|
+
/**
|
|
106
|
+
* Z形路径策略
|
|
107
|
+
*/
|
|
108
|
+
private zShape;
|
|
109
|
+
/**
|
|
110
|
+
* 简化曼哈顿路径策略
|
|
111
|
+
*/
|
|
112
|
+
private simpleManhattan;
|
|
113
|
+
/**
|
|
114
|
+
* 检查路径是否与障碍物相交
|
|
115
|
+
*/
|
|
116
|
+
private pathIntersectsObstacles;
|
|
117
|
+
/**
|
|
118
|
+
* 检查线段是否与矩形相交
|
|
119
|
+
*/
|
|
120
|
+
private lineIntersectsRect;
|
|
121
|
+
/**
|
|
122
|
+
* 检查点是否在矩形内部
|
|
123
|
+
*/
|
|
124
|
+
private pointInRect;
|
|
125
|
+
/**
|
|
126
|
+
* 检查两条线段是否相交
|
|
127
|
+
*/
|
|
128
|
+
private lineIntersectsLine;
|
|
129
|
+
/**
|
|
130
|
+
* 计算叉积方向
|
|
131
|
+
*/
|
|
132
|
+
private direction;
|
|
133
|
+
/**
|
|
134
|
+
* 检查点是否在线段上
|
|
135
|
+
*/
|
|
136
|
+
private onSegment;
|
|
137
|
+
/**
|
|
138
|
+
* 创建超时错误
|
|
139
|
+
*/
|
|
140
|
+
static createTimeoutError(iterations: number, maxIterations: number): PathfindingError;
|
|
141
|
+
/**
|
|
142
|
+
* 创建无路径错误
|
|
143
|
+
*/
|
|
144
|
+
static createNoPathError(from: Point, to: Point): PathfindingError;
|
|
145
|
+
/**
|
|
146
|
+
* 创建无效输入错误
|
|
147
|
+
*/
|
|
148
|
+
static createInvalidInputError(message: string): PathfindingError;
|
|
149
|
+
/**
|
|
150
|
+
* 创建阻塞错误
|
|
151
|
+
*/
|
|
152
|
+
static createBlockedError(point: Point, type: 'source' | 'target'): PathfindingError;
|
|
153
|
+
/**
|
|
154
|
+
* 创建内部错误
|
|
155
|
+
*/
|
|
156
|
+
static createInternalError(message: string, cause?: Error): PathfindingError;
|
|
157
|
+
/**
|
|
158
|
+
* 生成回退路径(静态方法)
|
|
159
|
+
*/
|
|
160
|
+
static generateFallbackPath(source: Point, target: Point): Point[];
|
|
161
|
+
/**
|
|
162
|
+
* 验证并修复配置选项
|
|
163
|
+
*/
|
|
164
|
+
static validateAndFixOptions<T extends Record<string, unknown>>(options: T, defaults: T): T;
|
|
165
|
+
/**
|
|
166
|
+
* 获取恢复尝试次数
|
|
167
|
+
*/
|
|
168
|
+
getRecoveryAttempts(): number;
|
|
169
|
+
/**
|
|
170
|
+
* 重置恢复状态
|
|
171
|
+
*/
|
|
172
|
+
reset(): void;
|
|
173
|
+
/**
|
|
174
|
+
* 更新配置
|
|
175
|
+
*/
|
|
176
|
+
updateConfig(config: Partial<ErrorRecoveryConfig>): void;
|
|
177
|
+
/**
|
|
178
|
+
* 获取当前配置
|
|
179
|
+
*/
|
|
180
|
+
getConfig(): ErrorRecoveryConfig;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=ErrorRecovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorRecovery.d.ts","sourceRoot":"","sources":["../../src/utils/ErrorRecovery.ts"],"names":[],"mappings":"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"}
|