@plait/common 0.29.0 → 0.30.0

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.
@@ -1,4 +1,4 @@
1
- import { Direction, distanceBetweenPointAndPoint } from '@plait/core';
1
+ import { Direction, Point, distanceBetweenPointAndPoint } from '@plait/core';
2
2
  import { getDirectionFactor } from './direction';
3
3
  export function getOppositeDirection(direction) {
4
4
  switch (direction) {
@@ -143,4 +143,15 @@ export function isPointOnLineSegment(point, startPoint, endPoint) {
143
143
  const segmentLength = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);
144
144
  return Math.abs(distanceToStart + distanceToEnd - segmentLength) < 0.1;
145
145
  }
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1wYXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy91dGlscy9saW5lLXBhdGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBUyw0QkFBNEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFakQsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFNBQW9CO0lBQ3JELFFBQVEsU0FBUyxFQUFFO1FBQ2YsS0FBSyxTQUFTLENBQUMsSUFBSTtZQUNmLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQztRQUMzQixLQUFLLFNBQVMsQ0FBQyxLQUFLO1lBQ2hCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQztRQUMxQixLQUFLLFNBQVMsQ0FBQyxHQUFHO1lBQ2QsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQzVCLEtBQUssU0FBUyxDQUFDLE1BQU07WUFDakIsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDO0tBQzVCO0FBQ0wsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQWEsRUFBRSxjQUF5QixFQUFFLE1BQWEsRUFBRSxjQUF5QixFQUFFLE1BQWMsRUFBRSxFQUFFO0lBQzVILE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sWUFBWSxHQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ2pHLE1BQU0sWUFBWSxHQUFVLENBQUMsTUFBTSxDQUFDLENBQUMs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Y2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3Rpb24sIFBvaW50LCBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50IH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgZ2V0RGlyZWN0aW9uRmFjdG9yIH0gZnJvbSAnLi9kaXJlY3Rpb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVEaXJlY3Rpb24oZGlyZWN0aW9uOiBEaXJlY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICBjYXNlIERpcmVjdGlvbi5sZWZ0OlxuICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbi5yaWdodDtcbiAgICAgICAgY2FzZSBEaXJlY3Rpb24ucmlnaHQ6XG4gICAgICAgICAgICByZXR1cm4gRGlyZWN0aW9uLmxlZnQ7XG4gICAgICAgIGNhc2UgRGlyZWN0aW9uLnRvcDpcbiAgICAgICAgICAgIHJldHVybiBEaXJlY3Rpb24uYm90dG9tO1xuICAgICAgICBjYXNlIERpcmVjdGlvbi5ib3R0b206XG4gICAgICAgICAgICByZXR1cm4gRGlyZWN0aW9uLnRvcDtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRQb2ludHMgPSAoc291cmNlOiBQb2ludCwgc291cmNlUG9zaXRpb246IERpcmVjdGlvbiwgdGFyZ2V0OiBQb2ludCwgdGFyZ2V0UG9zaXRpb246IERpcmVjdGlvbiwgb2Zmc2V0OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBzb3VyY2VEaXIgPSBnZXREaXJlY3Rpb25GYWN0b3Ioc291cmNlUG9zaXRpb24pO1xuICAgIGNvbnN0IHRhcmdldERpciA9IGdldERpcmVjdGlvbkZhY3Rvcih0YXJnZXRQb3NpdGlvbik7XG4gICAgY29uc3Qgc291cmNlR2FwcGVkOiBQb2ludCA9IFtzb3VyY2VbMF0gKyBzb3VyY2VEaXIueCAqIG9mZnNldCwgc291cmNlWzFdICsgc291cmNlRGlyLnkgKiBvZmZzZXRdO1xuICAgIGNvbnN0IHRhcmdldEdhcHBlZDogUG9pbnQgPSBbdGFyZ2V0WzBdICsgdGFyZ2V0RGlyLnggKiBvZmZzZXQsIHRhcmdldFsxXSArIHRhcmdldERpci55ICogb2Zmc2V0XTtcbiAgICBjb25zdCBkaXIgPSBnZXREaXJlY3Rpb24oc291cmNlR2FwcGVkLCBzb3VyY2VQb3NpdGlvbiwgdGFyZ2V0R2FwcGVkKTtcbiAgICBjb25zdCBkaXJBY2Nlc3NvciA9IGRpci54ICE9PSAwID8gJ3gnIDogJ3knO1xuICAgIGNvbnN0IGN1cnJEaXIgPSBkaXJbZGlyQWNjZXNzb3JdO1xuXG4gICAgbGV0IHBvaW50czogUG9pbnRbXSA9IFtdO1xuICAgIGxldCBjZW50ZXJYLCBjZW50ZXJZO1xuICAgIGNvbnN0IFtkZWZhdWx0Q2VudGVyWCwgZGVmYXVsdENlbnRlclldID0gZ2V0RWRnZUNlbnRlcih7XG4gICAgICAgIHNvdXJjZVg6IHNvdXJjZVswXSxcbiAgICAgICAgc291cmNlWTogc291cmNlWzFdLFxuICAgICAgICB0YXJnZXRYOiB0YXJnZXRbMF0sXG4gICAgICAgIHRhcmdldFk6IHRhcmdldFsxXVxuICAgIH0pO1xuICAgIC8vIG9wcG9zaXRlIGhhbmRsZSBwb3NpdGlvbnMsIGRlZmF1bHQgY2FzZVxuICAgIGlmIChzb3VyY2VEaXJbZGlyQWNjZXNzb3JdICogdGFyZ2V0RGlyW2RpckFjY2Vzc29yXSA9PT0gLTEpIHtcbiAgICAgICAgY2VudGVyWCA9IGRlZmF1bHRDZW50ZXJYO1xuICAgICAgICBjZW50ZXJZID0gZGVmYXVsdENlbnRlclk7XG4gICAgICAgIC8vICAgIC0tLT5cbiAgICAgICAgLy8gICAgfFxuICAgICAgICAvLyA+LS0tXG4gICAgICAgIGNvbnN0IHZlcnRpY2FsU3BsaXQ6IFBvaW50W10gPSBbXG4gICAgICAgICAgICBbY2VudGVyWCwgc291cmNlR2FwcGVkWzFdXSxcbiAgICAgICAgICAgIFtjZW50ZXJYLCB0YXJnZXRHYXBwZWRbMV1dXG4gICAgICAgIF07XG4gICAgICAgIC8vICAgIHxcbiAgICAgICAgLy8gIC0tLVxuICAgICAgICAvLyAgfFxuICAgICAgICBjb25zdCBob3Jpem9udGFsU3BsaXQ6IFBvaW50W10gPSBbXG4gICAgICAgICAgICBbc291cmNlR2FwcGVkWzBdLCBjZW50ZXJZXSxcbiAgICAgICAgICAgIFt0YXJnZXRHYXBwZWRbMF0sIGNlbnRlclldXG4gICAgICAgIF07XG4gICAgICAgIGlmIChzb3VyY2VEaXJbZGlyQWNjZXNzb3JdID09PSBjdXJyRGlyKSB7XG4gICAgICAgICAgICBwb2ludHMgPSBkaXJBY2Nlc3NvciA9PT0gJ3gnID8gdmVydGljYWxTcGxpdCA6IGhvcml6b250YWxTcGxpdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvaW50cyA9IGRpckFjY2Vzc29yID09PSAneCcgPyBob3Jpem9udGFsU3BsaXQgOiB2ZXJ0aWNhbFNwbGl0O1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc291cmNlVGFyZ2V0IG1lYW5zIHdlIHRha2UgeCBmcm9tIHNvdXJjZSBhbmQgeSBmcm9tIHRhcmdldCwgdGFyZ2V0U291cmNlIGlzIHRoZSBvcHBvc2l0ZVxuICAgICAgICBjb25zdCBzb3VyY2VUYXJnZXQ6IFBvaW50W10gPSBbW3NvdXJjZUdhcHBlZFswXSwgdGFyZ2V0R2FwcGVkWzFdXV07XG4gICAgICAgIGNvbnN0IHRhcmdldFNvdXJjZTogUG9pbnRbXSA9IFtbdGFyZ2V0R2FwcGVkWzBdLCBzb3VyY2VHYXBwZWRbMV1dXTtcbiAgICAgICAgLy8gdGhpcyBoYW5kbGVzIGVkZ2VzIHdpdGggc2FtZSBoYW5kbGUgcG9zaXRpb25zXG4gICAgICAgIGlmIChkaXJBY2Nlc3NvciA9PT0gJ3gnKSB7XG4gICAgICAgICAgICBwb2ludHMgPSBzb3VyY2VEaXIueCA9PT0gY3VyckRpciA/IHRhcmdldFNvdXJjZSA6IHNvdXJjZVRhcmdldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvaW50cyA9IHNvdXJjZURpci55ID09PSBjdXJyRGlyID8gc291cmNlVGFyZ2V0IDogdGFyZ2V0U291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhlc2UgYXJlIGNvbmRpdGlvbnMgZm9yIGhhbmRsaW5nIG1peGVkIGhhbmRsZSBwb3NpdGlvbnMgbGlrZSByaWdodCAtPiBib3R0b20gZm9yIGV4YW1wbGVcbiAgICAgICAgbGV0IGZsaXBTb3VyY2VUYXJnZXQ7XG4gICAgICAgIGlmIChzb3VyY2VQb3NpdGlvbiAhPT0gdGFyZ2V0UG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRpckFjY2Vzc29yT3Bwb3NpdGUgPSBkaXJBY2Nlc3NvciA9PT0gJ3gnID8gMSA6IDA7XG4gICAgICAgICAgICBjb25zdCBpc1NhbWVEaXIgPSBzb3VyY2VEaXJbZGlyQWNjZXNzb3JdID09PSB0YXJnZXREaXJbZGlyQWNjZXNzb3IgPT09ICd4JyA/ICd5JyA6ICd4J107XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VHdFRhcmdldE9wcG8gPSBzb3VyY2VHYXBwZWRbZGlyQWNjZXNzb3JPcHBvc2l0ZV0gPiB0YXJnZXRHYXBwZWRbZGlyQWNjZXNzb3JPcHBvc2l0ZV07XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMdFRhcmdldE9wcG8gPSBzb3VyY2VHYXBwZWRbZGlyQWNjZXNzb3JPcHBvc2l0ZV0gPCB0YXJnZXRHYXBwZWRbZGlyQWNjZXNzb3JPcHBvc2l0ZV07XG4gICAgICAgICAgICBmbGlwU291cmNlVGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAoc291cmNlRGlyW2RpckFjY2Vzc29yXSA9PT0gMSAmJiAoKCFpc1NhbWVEaXIgJiYgc291cmNlR3RUYXJnZXRPcHBvKSB8fCAoaXNTYW1lRGlyICYmIHNvdXJjZUx0VGFyZ2V0T3BwbykpKSB8fFxuICAgICAgICAgICAgICAgIChzb3VyY2VEaXJbZGlyQWNjZXNzb3JdICE9PSAxICYmICgoIWlzU2FtZURpciAmJiBzb3VyY2VMdFRhcmdldE9wcG8pIHx8IChpc1NhbWVEaXIgJiYgc291cmNlR3RUYXJnZXRPcHBvKSkpO1xuXG4gICAgICAgICAgICBpZiAoZmxpcFNvdXJjZVRhcmdldCkge1xuICAgICAgICAgICAgICAgIHBvaW50cyA9IGRpckFjY2Vzc29yID09PSAneCcgPyBzb3VyY2VUYXJnZXQgOiB0YXJnZXRTb3VyY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtzb3VyY2UsIHNvdXJjZUdhcHBlZCwgLi4ucG9pbnRzLCB0YXJnZXRHYXBwZWQsIHRhcmdldF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlyZWN0aW9uID0gKHNvdXJjZTogUG9pbnQsIHNvdXJjZVBvc2l0aW9uID0gRGlyZWN0aW9uLmJvdHRvbSwgdGFyZ2V0OiBQb2ludCkgPT4ge1xuICAgIGlmIChzb3VyY2VQb3NpdGlvbiA9PT0gRGlyZWN0aW9uLmxlZnQgfHwgc291cmNlUG9zaXRpb24gPT09IERpcmVjdGlvbi5yaWdodCkge1xuICAgICAgICByZXR1cm4gc291cmNlWzBdIDwgdGFyZ2V0WzBdID8geyB4OiAxLCB5OiAwIH0gOiB7IHg6IC0xLCB5OiAwIH07XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VbMV0gPCB0YXJnZXRbMV0gPyB7IHg6IDAsIHk6IDEgfSA6IHsgeDogMCwgeTogLTEgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGdlQ2VudGVyKHtcbiAgICBzb3VyY2VYLFxuICAgIHNvdXJjZVksXG4gICAgdGFyZ2V0WCxcbiAgICB0YXJnZXRZXG59OiB7XG4gICAgc291cmNlWDogbnVtYmVyO1xuICAgIHNvdXJjZVk6IG51bWJlcjtcbiAgICB0YXJnZXRYOiBudW1iZXI7XG4gICAgdGFyZ2V0WTogbnVtYmVyO1xufSk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICBjb25zdCB4T2Zmc2V0ID0gTWF0aC5hYnModGFyZ2V0WCAtIHNvdXJjZVgpIC8gMjtcbiAgICBjb25zdCBjZW50ZXJYID0gdGFyZ2V0WCA8IHNvdXJjZVggPyB0YXJnZXRYICsgeE9mZnNldCA6IHRhcmdldFggLSB4T2Zmc2V0O1xuXG4gICAgY29uc3QgeU9mZnNldCA9IE1hdGguYWJzKHRhcmdldFkgLSBzb3VyY2VZKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9IHRhcmdldFkgPCBzb3VyY2VZID8gdGFyZ2V0WSArIHlPZmZzZXQgOiB0YXJnZXRZIC0geU9mZnNldDtcblxuICAgIHJldHVybiBbY2VudGVyWCwgY2VudGVyWSwgeE9mZnNldCwgeU9mZnNldF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2ludE9uUG9seWxpbmUocG9pbnRzOiBQb2ludFtdLCByYXRpbzogbnVtYmVyKSB7XG4gICAgY29uc3QgdG90YWxMZW5ndGggPSBjYWxjdWxhdGVQb2x5bGluZUxlbmd0aChwb2ludHMpO1xuICAgIGNvbnN0IHRhcmdldERpc3RhbmNlID0gdG90YWxMZW5ndGggKiByYXRpbztcblxuICAgIGxldCBhY2N1bXVsYXRlZERpc3RhbmNlID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgW3gxLCB5MV0gPSBwb2ludHNbaV07XG4gICAgICAgIGNvbnN0IFt4MiwgeTJdID0gcG9pbnRzW2kgKyAxXTtcbiAgICAgICAgY29uc3Qgc2VnbWVudExlbmd0aCA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoeDEsIHkxLCB4MiwgeTIpO1xuXG4gICAgICAgIGlmIChhY2N1bXVsYXRlZERpc3RhbmNlICsgc2VnbWVudExlbmd0aCA+PSB0YXJnZXREaXN0YW5jZSkge1xuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nRGlzdGFuY2UgPSB0YXJnZXREaXN0YW5jZSAtIGFjY3VtdWxhdGVkRGlzdGFuY2U7XG4gICAgICAgICAgICBjb25zdCByYXRpb0luU2VnbWVudCA9IHJlbWFpbmluZ0Rpc3RhbmNlIC8gc2VnbWVudExlbmd0aDtcblxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0WCA9IHgxICsgKHgyIC0geDEpICogcmF0aW9JblNlZ21lbnQ7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRZID0geTEgKyAoeTIgLSB5MSkgKiByYXRpb0luU2VnbWVudDtcbiAgICAgICAgICAgIHJldHVybiBbdGFyZ2V0WCwgdGFyZ2V0WV07XG4gICAgICAgIH1cblxuICAgICAgICBhY2N1bXVsYXRlZERpc3RhbmNlICs9IHNlZ21lbnRMZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVQb2x5bGluZUxlbmd0aChwb2ludHM6IFBvaW50W10pIHtcbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgW3gxLCB5MV0gPSBwb2ludHNbaV07XG4gICAgICAgIGNvbnN0IFt4MiwgeTJdID0gcG9pbnRzW2kgKyAxXTtcbiAgICAgICAgbGVuZ3RoICs9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoeDEsIHkxLCB4MiwgeTIpO1xuICAgIH1cbiAgICByZXR1cm4gbGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmF0aW9CeVBvaW50KHBvaW50czogUG9pbnRbXSwgcG9pbnQ6IFBvaW50KSB7XG4gICAgY29uc3QgdG90YWxMZW5ndGggPSBjYWxjdWxhdGVQb2x5bGluZUxlbmd0aChwb2ludHMpO1xuXG4gICAgbGV0IGRpc3RhbmNlID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBpc092ZXJsYXAgPSBpc1BvaW50T25MaW5lU2VnbWVudChwb2ludCwgcG9pbnRzW2ldLCBwb2ludHNbaSArIDFdKTtcblxuICAgICAgICBpZiAoaXNPdmVybGFwKSB7XG4gICAgICAgICAgICBkaXN0YW5jZSArPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KHBvaW50WzBdLCBwb2ludFsxXSwgcG9pbnRzW2ldWzBdLCBwb2ludHNbaV1bMV0pO1xuICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlIC8gdG90YWxMZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaXN0YW5jZSArPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KHBvaW50c1tpXVswXSwgcG9pbnRzW2ldWzFdLCBwb2ludHNbaSArIDFdWzBdLCBwb2ludHNbaSArIDFdWzFdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgcmF0aW8gYnkgcG9pbnQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUG9pbnRPbkxpbmVTZWdtZW50KHBvaW50OiBQb2ludCwgc3RhcnRQb2ludDogUG9pbnQsIGVuZFBvaW50OiBQb2ludCkge1xuICAgIGNvbnN0IGRpc3RhbmNlVG9TdGFydCA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQocG9pbnRbMF0sIHBvaW50WzFdLCBzdGFydFBvaW50WzBdLCBzdGFydFBvaW50WzFdKTtcbiAgICBjb25zdCBkaXN0YW5jZVRvRW5kID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludChwb2ludFswXSwgcG9pbnRbMV0sIGVuZFBvaW50WzBdLCBlbmRQb2ludFsxXSk7XG5cbiAgICBjb25zdCBzZWdtZW50TGVuZ3RoID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludChzdGFydFBvaW50WzBdLCBzdGFydFBvaW50WzFdLCBlbmRQb2ludFswXSwgZW5kUG9pbnRbMV0pO1xuXG4gICAgcmV0dXJuIE1hdGguYWJzKGRpc3RhbmNlVG9TdGFydCArIGRpc3RhbmNlVG9FbmQgLSBzZWdtZW50TGVuZ3RoKSA8IDAuMTtcbn1cbiJdfQ==
146
+ export const removeDuplicatePoints = (points) => {
147
+ const newArray = [];
148
+ points.forEach(point => {
149
+ const index = newArray.findIndex(otherPoint => {
150
+ return Point.isEquals(point, otherPoint);
151
+ });
152
+ if (index === -1)
153
+ newArray.push(point);
154
+ });
155
+ return newArray;
156
+ };
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1wYXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy91dGlscy9saW5lLXBhdGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxTQUFvQjtJQUNyRCxRQUFRLFNBQVMsRUFBRTtRQUNmLEtBQUssU0FBUyxDQUFDLElBQUk7WUFDZixPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFDM0IsS0FBSyxTQUFTLENBQUMsS0FBSztZQUNoQixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDMUIsS0FBSyxTQUFTLENBQUMsR0FBRztZQUNkLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUM1QixLQUFLLFNBQVMsQ0FBQyxNQUFNO1lBQ2pCLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQztLQUM1QjtBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFhLEVBQUUsY0FBeUIsRUFBRSxNQUFhLEVBQUUsY0FBeUIsRUFBRSxNQUFjLEVBQUUsRUFBRTtJQUM1SCxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNyRCxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNyRCxNQUFNLFlBQVksR0FBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUNqRyxNQUFNLFlBQVksR0FBVSxDQUFDLE1BQU0s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QUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxNQUFlLEVBQUUsRUFBRTtJQUNyRCxNQUFNLFFBQVEsR0FBWSxFQUFFLENBQUM7SUFDN0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNuQixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzFDLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7WUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxRQUFRLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aW9uLCBQb2ludCwgZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IGdldERpcmVjdGlvbkZhY3RvciB9IGZyb20gJy4vZGlyZWN0aW9uJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9wcG9zaXRlRGlyZWN0aW9uKGRpcmVjdGlvbjogRGlyZWN0aW9uKSB7XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgY2FzZSBEaXJlY3Rpb24ubGVmdDpcbiAgICAgICAgICAgIHJldHVybiBEaXJlY3Rpb24ucmlnaHQ7XG4gICAgICAgIGNhc2UgRGlyZWN0aW9uLnJpZ2h0OlxuICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbi5sZWZ0O1xuICAgICAgICBjYXNlIERpcmVjdGlvbi50b3A6XG4gICAgICAgICAgICByZXR1cm4gRGlyZWN0aW9uLmJvdHRvbTtcbiAgICAgICAgY2FzZSBEaXJlY3Rpb24uYm90dG9tOlxuICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbi50b3A7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UG9pbnRzID0gKHNvdXJjZTogUG9pbnQsIHNvdXJjZVBvc2l0aW9uOiBEaXJlY3Rpb24sIHRhcmdldDogUG9pbnQsIHRhcmdldFBvc2l0aW9uOiBEaXJlY3Rpb24sIG9mZnNldDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3Qgc291cmNlRGlyID0gZ2V0RGlyZWN0aW9uRmFjdG9yKHNvdXJjZVBvc2l0aW9uKTtcbiAgICBjb25zdCB0YXJnZXREaXIgPSBnZXREaXJlY3Rpb25GYWN0b3IodGFyZ2V0UG9zaXRpb24pO1xuICAgIGNvbnN0IHNvdXJjZUdhcHBlZDogUG9pbnQgPSBbc291cmNlWzBdICsgc291cmNlRGlyLnggKiBvZmZzZXQsIHNvdXJjZVsxXSArIHNvdXJjZURpci55ICogb2Zmc2V0XTtcbiAgICBjb25zdCB0YXJnZXRHYXBwZWQ6IFBvaW50ID0gW3RhcmdldFswXSArIHRhcmdldERpci54ICogb2Zmc2V0LCB0YXJnZXRbMV0gKyB0YXJnZXREaXIueSAqIG9mZnNldF07XG4gICAgY29uc3QgZGlyID0gZ2V0RGlyZWN0aW9uKHNvdXJjZUdhcHBlZCwgc291cmNlUG9zaXRpb24sIHRhcmdldEdhcHBlZCk7XG4gICAgY29uc3QgZGlyQWNjZXNzb3IgPSBkaXIueCAhPT0gMCA/ICd4JyA6ICd5JztcbiAgICBjb25zdCBjdXJyRGlyID0gZGlyW2RpckFjY2Vzc29yXTtcblxuICAgIGxldCBwb2ludHM6IFBvaW50W10gPSBbXTtcbiAgICBsZXQgY2VudGVyWCwgY2VudGVyWTtcbiAgICBjb25zdCBbZGVmYXVsdENlbnRlclgsIGRlZmF1bHRDZW50ZXJZXSA9IGdldEVkZ2VDZW50ZXIoe1xuICAgICAgICBzb3VyY2VYOiBzb3VyY2VbMF0sXG4gICAgICAgIHNvdXJjZVk6IHNvdXJjZVsxXSxcbiAgICAgICAgdGFyZ2V0WDogdGFyZ2V0WzBdLFxuICAgICAgICB0YXJnZXRZOiB0YXJnZXRbMV1cbiAgICB9KTtcbiAgICAvLyBvcHBvc2l0ZSBoYW5kbGUgcG9zaXRpb25zLCBkZWZhdWx0IGNhc2VcbiAgICBpZiAoc291cmNlRGlyW2RpckFjY2Vzc29yXSAqIHRhcmdldERpcltkaXJBY2Nlc3Nvcl0gPT09IC0xKSB7XG4gICAgICAgIGNlbnRlclggPSBkZWZhdWx0Q2VudGVyWDtcbiAgICAgICAgY2VudGVyWSA9IGRlZmF1bHRDZW50ZXJZO1xuICAgICAgICAvLyAgICAtLS0+XG4gICAgICAgIC8vICAgIHxcbiAgICAgICAgLy8gPi0tLVxuICAgICAgICBjb25zdCB2ZXJ0aWNhbFNwbGl0OiBQb2ludFtdID0gW1xuICAgICAgICAgICAgW2NlbnRlclgsIHNvdXJjZUdhcHBlZFsxXV0sXG4gICAgICAgICAgICBbY2VudGVyWCwgdGFyZ2V0R2FwcGVkWzFdXVxuICAgICAgICBdO1xuICAgICAgICAvLyAgICB8XG4gICAgICAgIC8vICAtLS1cbiAgICAgICAgLy8gIHxcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbFNwbGl0OiBQb2ludFtdID0gW1xuICAgICAgICAgICAgW3NvdXJjZUdhcHBlZFswXSwgY2VudGVyWV0sXG4gICAgICAgICAgICBbdGFyZ2V0R2FwcGVkWzBdLCBjZW50ZXJZXVxuICAgICAgICBdO1xuICAgICAgICBpZiAoc291cmNlRGlyW2RpckFjY2Vzc29yXSA9PT0gY3VyckRpcikge1xuICAgICAgICAgICAgcG9pbnRzID0gZGlyQWNjZXNzb3IgPT09ICd4JyA/IHZlcnRpY2FsU3BsaXQgOiBob3Jpem9udGFsU3BsaXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb2ludHMgPSBkaXJBY2Nlc3NvciA9PT0gJ3gnID8gaG9yaXpvbnRhbFNwbGl0IDogdmVydGljYWxTcGxpdDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNvdXJjZVRhcmdldCBtZWFucyB3ZSB0YWtlIHggZnJvbSBzb3VyY2UgYW5kIHkgZnJvbSB0YXJnZXQsIHRhcmdldFNvdXJjZSBpcyB0aGUgb3Bwb3NpdGVcbiAgICAgICAgY29uc3Qgc291cmNlVGFyZ2V0OiBQb2ludFtdID0gW1tzb3VyY2VHYXBwZWRbMF0sIHRhcmdldEdhcHBlZFsxXV1dO1xuICAgICAgICBjb25zdCB0YXJnZXRTb3VyY2U6IFBvaW50W10gPSBbW3RhcmdldEdhcHBlZFswXSwgc291cmNlR2FwcGVkWzFdXV07XG4gICAgICAgIC8vIHRoaXMgaGFuZGxlcyBlZGdlcyB3aXRoIHNhbWUgaGFuZGxlIHBvc2l0aW9uc1xuICAgICAgICBpZiAoZGlyQWNjZXNzb3IgPT09ICd4Jykge1xuICAgICAgICAgICAgcG9pbnRzID0gc291cmNlRGlyLnggPT09IGN1cnJEaXIgPyB0YXJnZXRTb3VyY2UgOiBzb3VyY2VUYXJnZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb2ludHMgPSBzb3VyY2VEaXIueSA9PT0gY3VyckRpciA/IHNvdXJjZVRhcmdldCA6IHRhcmdldFNvdXJjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZXNlIGFyZSBjb25kaXRpb25zIGZvciBoYW5kbGluZyBtaXhlZCBoYW5kbGUgcG9zaXRpb25zIGxpa2UgcmlnaHQgLT4gYm90dG9tIGZvciBleGFtcGxlXG4gICAgICAgIGxldCBmbGlwU291cmNlVGFyZ2V0O1xuICAgICAgICBpZiAoc291cmNlUG9zaXRpb24gIT09IHRhcmdldFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBkaXJBY2Nlc3Nvck9wcG9zaXRlID0gZGlyQWNjZXNzb3IgPT09ICd4JyA/IDEgOiAwO1xuICAgICAgICAgICAgY29uc3QgaXNTYW1lRGlyID0gc291cmNlRGlyW2RpckFjY2Vzc29yXSA9PT0gdGFyZ2V0RGlyW2RpckFjY2Vzc29yID09PSAneCcgPyAneScgOiAneCddO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlR3RUYXJnZXRPcHBvID0gc291cmNlR2FwcGVkW2RpckFjY2Vzc29yT3Bwb3NpdGVdID4gdGFyZ2V0R2FwcGVkW2RpckFjY2Vzc29yT3Bwb3NpdGVdO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTHRUYXJnZXRPcHBvID0gc291cmNlR2FwcGVkW2RpckFjY2Vzc29yT3Bwb3NpdGVdIDwgdGFyZ2V0R2FwcGVkW2RpckFjY2Vzc29yT3Bwb3NpdGVdO1xuICAgICAgICAgICAgZmxpcFNvdXJjZVRhcmdldCA9XG4gICAgICAgICAgICAgICAgKHNvdXJjZURpcltkaXJBY2Nlc3Nvcl0gPT09IDEgJiYgKCghaXNTYW1lRGlyICYmIHNvdXJjZUd0VGFyZ2V0T3BwbykgfHwgKGlzU2FtZURpciAmJiBzb3VyY2VMdFRhcmdldE9wcG8pKSkgfHxcbiAgICAgICAgICAgICAgICAoc291cmNlRGlyW2RpckFjY2Vzc29yXSAhPT0gMSAmJiAoKCFpc1NhbWVEaXIgJiYgc291cmNlTHRUYXJnZXRPcHBvKSB8fCAoaXNTYW1lRGlyICYmIHNvdXJjZUd0VGFyZ2V0T3BwbykpKTtcblxuICAgICAgICAgICAgaWYgKGZsaXBTb3VyY2VUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICBwb2ludHMgPSBkaXJBY2Nlc3NvciA9PT0gJ3gnID8gc291cmNlVGFyZ2V0IDogdGFyZ2V0U291cmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbc291cmNlLCBzb3VyY2VHYXBwZWQsIC4uLnBvaW50cywgdGFyZ2V0R2FwcGVkLCB0YXJnZXRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERpcmVjdGlvbiA9IChzb3VyY2U6IFBvaW50LCBzb3VyY2VQb3NpdGlvbiA9IERpcmVjdGlvbi5ib3R0b20sIHRhcmdldDogUG9pbnQpID0+IHtcbiAgICBpZiAoc291cmNlUG9zaXRpb24gPT09IERpcmVjdGlvbi5sZWZ0IHx8IHNvdXJjZVBvc2l0aW9uID09PSBEaXJlY3Rpb24ucmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVswXSA8IHRhcmdldFswXSA/IHsgeDogMSwgeTogMCB9IDogeyB4OiAtMSwgeTogMCB9O1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlWzFdIDwgdGFyZ2V0WzFdID8geyB4OiAwLCB5OiAxIH0gOiB7IHg6IDAsIHk6IC0xIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWRnZUNlbnRlcih7XG4gICAgc291cmNlWCxcbiAgICBzb3VyY2VZLFxuICAgIHRhcmdldFgsXG4gICAgdGFyZ2V0WVxufToge1xuICAgIHNvdXJjZVg6IG51bWJlcjtcbiAgICBzb3VyY2VZOiBudW1iZXI7XG4gICAgdGFyZ2V0WDogbnVtYmVyO1xuICAgIHRhcmdldFk6IG51bWJlcjtcbn0pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgY29uc3QgeE9mZnNldCA9IE1hdGguYWJzKHRhcmdldFggLSBzb3VyY2VYKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWCA9IHRhcmdldFggPCBzb3VyY2VYID8gdGFyZ2V0WCArIHhPZmZzZXQgOiB0YXJnZXRYIC0geE9mZnNldDtcblxuICAgIGNvbnN0IHlPZmZzZXQgPSBNYXRoLmFicyh0YXJnZXRZIC0gc291cmNlWSkgLyAyO1xuICAgIGNvbnN0IGNlbnRlclkgPSB0YXJnZXRZIDwgc291cmNlWSA/IHRhcmdldFkgKyB5T2Zmc2V0IDogdGFyZ2V0WSAtIHlPZmZzZXQ7XG5cbiAgICByZXR1cm4gW2NlbnRlclgsIGNlbnRlclksIHhPZmZzZXQsIHlPZmZzZXRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9pbnRPblBvbHlsaW5lKHBvaW50czogUG9pbnRbXSwgcmF0aW86IG51bWJlcikge1xuICAgIGNvbnN0IHRvdGFsTGVuZ3RoID0gY2FsY3VsYXRlUG9seWxpbmVMZW5ndGgocG9pbnRzKTtcbiAgICBjb25zdCB0YXJnZXREaXN0YW5jZSA9IHRvdGFsTGVuZ3RoICogcmF0aW87XG5cbiAgICBsZXQgYWNjdW11bGF0ZWREaXN0YW5jZSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IFt4MSwgeTFdID0gcG9pbnRzW2ldO1xuICAgICAgICBjb25zdCBbeDIsIHkyXSA9IHBvaW50c1tpICsgMV07XG4gICAgICAgIGNvbnN0IHNlZ21lbnRMZW5ndGggPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KHgxLCB5MSwgeDIsIHkyKTtcblxuICAgICAgICBpZiAoYWNjdW11bGF0ZWREaXN0YW5jZSArIHNlZ21lbnRMZW5ndGggPj0gdGFyZ2V0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ0Rpc3RhbmNlID0gdGFyZ2V0RGlzdGFuY2UgLSBhY2N1bXVsYXRlZERpc3RhbmNlO1xuICAgICAgICAgICAgY29uc3QgcmF0aW9JblNlZ21lbnQgPSByZW1haW5pbmdEaXN0YW5jZSAvIHNlZ21lbnRMZW5ndGg7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFggPSB4MSArICh4MiAtIHgxKSAqIHJhdGlvSW5TZWdtZW50O1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0WSA9IHkxICsgKHkyIC0geTEpICogcmF0aW9JblNlZ21lbnQ7XG4gICAgICAgICAgICByZXR1cm4gW3RhcmdldFgsIHRhcmdldFldO1xuICAgICAgICB9XG5cbiAgICAgICAgYWNjdW11bGF0ZWREaXN0YW5jZSArPSBzZWdtZW50TGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlUG9seWxpbmVMZW5ndGgocG9pbnRzOiBQb2ludFtdKSB7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IFt4MSwgeTFdID0gcG9pbnRzW2ldO1xuICAgICAgICBjb25zdCBbeDIsIHkyXSA9IHBvaW50c1tpICsgMV07XG4gICAgICAgIGxlbmd0aCArPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KHgxLCB5MSwgeDIsIHkyKTtcbiAgICB9XG4gICAgcmV0dXJuIGxlbmd0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJhdGlvQnlQb2ludChwb2ludHM6IFBvaW50W10sIHBvaW50OiBQb2ludCkge1xuICAgIGNvbnN0IHRvdGFsTGVuZ3RoID0gY2FsY3VsYXRlUG9seWxpbmVMZW5ndGgocG9pbnRzKTtcblxuICAgIGxldCBkaXN0YW5jZSA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgaXNPdmVybGFwID0gaXNQb2ludE9uTGluZVNlZ21lbnQocG9pbnQsIHBvaW50c1tpXSwgcG9pbnRzW2kgKyAxXSk7XG5cbiAgICAgICAgaWYgKGlzT3ZlcmxhcCkge1xuICAgICAgICAgICAgZGlzdGFuY2UgKz0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludChwb2ludFswXSwgcG9pbnRbMV0sIHBvaW50c1tpXVswXSwgcG9pbnRzW2ldWzFdKTtcbiAgICAgICAgICAgIHJldHVybiBkaXN0YW5jZSAvIHRvdGFsTGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGlzdGFuY2UgKz0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludChwb2ludHNbaV1bMF0sIHBvaW50c1tpXVsxXSwgcG9pbnRzW2kgKyAxXVswXSwgcG9pbnRzW2kgKyAxXVsxXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IHJhdGlvIGJ5IHBvaW50Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1BvaW50T25MaW5lU2VnbWVudChwb2ludDogUG9pbnQsIHN0YXJ0UG9pbnQ6IFBvaW50LCBlbmRQb2ludDogUG9pbnQpIHtcbiAgICBjb25zdCBkaXN0YW5jZVRvU3RhcnQgPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KHBvaW50WzBdLCBwb2ludFsxXSwgc3RhcnRQb2ludFswXSwgc3RhcnRQb2ludFsxXSk7XG4gICAgY29uc3QgZGlzdGFuY2VUb0VuZCA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQocG9pbnRbMF0sIHBvaW50WzFdLCBlbmRQb2ludFswXSwgZW5kUG9pbnRbMV0pO1xuXG4gICAgY29uc3Qgc2VnbWVudExlbmd0aCA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoc3RhcnRQb2ludFswXSwgc3RhcnRQb2ludFsxXSwgZW5kUG9pbnRbMF0sIGVuZFBvaW50WzFdKTtcblxuICAgIHJldHVybiBNYXRoLmFicyhkaXN0YW5jZVRvU3RhcnQgKyBkaXN0YW5jZVRvRW5kIC0gc2VnbWVudExlbmd0aCkgPCAwLjE7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVEdXBsaWNhdGVQb2ludHMgPSAocG9pbnRzOiBQb2ludFtdKSA9PiB7XG4gICAgY29uc3QgbmV3QXJyYXk6IFBvaW50W10gPSBbXTtcbiAgICBwb2ludHMuZm9yRWFjaChwb2ludCA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbmV3QXJyYXkuZmluZEluZGV4KG90aGVyUG9pbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFBvaW50LmlzRXF1YWxzKHBvaW50LCBvdGhlclBvaW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIG5ld0FycmF5LnB1c2gocG9pbnQpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXdBcnJheTtcbn07XG4iXX0=
@@ -1,4 +1,4 @@
1
- import { createG, RectangleClient, drawRectangle, drawCircle, PlaitBoard, createForeignObject, updateForeignObject, getSelectedElements, PlaitElement, Transforms, PlaitPointerType, isMainPointer, transformPoint, toPoint, preventTouchMove, distanceBetweenPointAndPoint, PRESS_AND_MOVE_BUFFER, throttleRAF, handleTouchTarget, MERGING, Direction, hotkeys, PlaitContextService, PlaitPluginElementComponent, isSelectionMoving, ACTIVE_STROKE_WIDTH } from '@plait/core';
1
+ import { createG, RectangleClient, drawRectangle, drawCircle, PlaitBoard, createForeignObject, updateForeignObject, getSelectedElements, PlaitElement, Transforms, PlaitPointerType, isMainPointer, transformPoint, toPoint, preventTouchMove, distanceBetweenPointAndPoint, PRESS_AND_MOVE_BUFFER, throttleRAF, handleTouchTarget, MERGING, Direction, Point, hotkeys, PlaitContextService, PlaitPluginElementComponent, isSelectionMoving, ACTIVE_STROKE_WIDTH } from '@plait/core';
2
2
  import { isKeyHotkey } from 'is-hotkey';
3
3
  import * as i0 from '@angular/core';
4
4
  import { Directive, Input } from '@angular/core';
@@ -7,6 +7,7 @@ const BASE = 4;
7
7
  const PRIMARY_COLOR = '#6698FF';
8
8
  const RESIZE_HANDLE_DIAMETER = 8;
9
9
  const WithTextPluginKey = 'plait-text-plugin-key';
10
+ const DEFAULT_ROUTE_MARGIN = 30;
10
11
 
11
12
  var MediaKeys;
12
13
  (function (MediaKeys) {
@@ -614,6 +615,17 @@ function isPointOnLineSegment(point, startPoint, endPoint) {
614
615
  const segmentLength = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);
615
616
  return Math.abs(distanceToStart + distanceToEnd - segmentLength) < 0.1;
616
617
  }
618
+ const removeDuplicatePoints = (points) => {
619
+ const newArray = [];
620
+ points.forEach(point => {
621
+ const index = newArray.findIndex(otherPoint => {
622
+ return Point.isEquals(point, otherPoint);
623
+ });
624
+ if (index === -1)
625
+ newArray.push(point);
626
+ });
627
+ return newArray;
628
+ };
617
629
 
618
630
  function isVirtualKey(e) {
619
631
  const isMod = e.ctrlKey || e.metaKey;
@@ -725,6 +737,376 @@ function getImageSize(file, defaultImageWidth) {
725
737
  };
726
738
  });
727
739
  }
740
+ const BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE = new WeakMap();
741
+ const getElementOfFocusedImage = (board) => {
742
+ return BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.get(board);
743
+ };
744
+ const addElementOfFocusedImage = (board, element) => {
745
+ BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.set(board, element);
746
+ };
747
+ const removeElementOfFocusedImage = (board) => {
748
+ BOARD_TO_ELEMENT_OF_FOCUSED_IMAGE.delete(board);
749
+ };
750
+
751
+ class PriorityQueue {
752
+ constructor() {
753
+ this.list = [];
754
+ }
755
+ enqueue(item) {
756
+ this.list.push(item);
757
+ this.list = this.list.sort((item1, item2) => item1.priority - item2.priority);
758
+ }
759
+ dequeue() {
760
+ return this.list.shift();
761
+ }
762
+ }
763
+
764
+ class AStar {
765
+ constructor(graph) {
766
+ this.graph = graph;
767
+ this.cameFrom = new Map();
768
+ }
769
+ heuristic(a, b) {
770
+ return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);
771
+ }
772
+ search(start, end, previousStart) {
773
+ const frontier = new PriorityQueue();
774
+ const startNode = this.graph.get(start);
775
+ this.cameFrom = new Map();
776
+ const costSoFar = new Map();
777
+ costSoFar.set(startNode, 0);
778
+ frontier.enqueue({ node: startNode, priority: 0 });
779
+ while (frontier.list.length > 0) {
780
+ var current = frontier.dequeue();
781
+ if (!current) {
782
+ throw new Error(`can't find current`);
783
+ }
784
+ const currentPoint = current.node.data;
785
+ if (currentPoint[0] === end[0] && currentPoint[1] === end[1]) {
786
+ break;
787
+ }
788
+ current.node.adjacentNodes.forEach(next => {
789
+ let newCost = costSoFar.get(current.node) + this.heuristic(next.data, current.node.data);
790
+ const previousNode = this.cameFrom.get(current.node);
791
+ // 拐点权重
792
+ const previousPoint = previousNode ? previousNode.data : previousStart;
793
+ const x = previousPoint[0] === current?.node.data[0] && previousPoint[0] === next.data[0];
794
+ const y = previousPoint[1] === current?.node.data[1] && previousPoint[1] === next.data[1];
795
+ if (!x && !y) {
796
+ newCost = newCost + 1;
797
+ }
798
+ if (!costSoFar.has(next) || (costSoFar.get(next) && newCost < costSoFar.get(next))) {
799
+ costSoFar.set(next, newCost);
800
+ const priority = newCost + this.heuristic(next.data, end);
801
+ frontier.enqueue({ node: next, priority });
802
+ this.cameFrom.set(next, current.node);
803
+ }
804
+ });
805
+ }
806
+ }
807
+ getRoute(start, end) {
808
+ const result = [];
809
+ let temp = end;
810
+ while (temp[0] !== start[0] || temp[1] !== start[1]) {
811
+ const node = this.graph.get(temp);
812
+ const preNode = this.cameFrom.get(node);
813
+ result.unshift(preNode.data);
814
+ temp = preNode.data;
815
+ }
816
+ return result;
817
+ }
818
+ }
819
+
820
+ class PointNode {
821
+ constructor(data) {
822
+ this.data = data;
823
+ this.distance = Number.MAX_SAFE_INTEGER;
824
+ this.adjacentNodes = [];
825
+ }
826
+ }
827
+ class PointGraph {
828
+ constructor() {
829
+ this.index = {};
830
+ }
831
+ add(p) {
832
+ const x = p[0];
833
+ const y = p[1];
834
+ const xs = x.toString(), ys = y.toString();
835
+ if (!(xs in this.index)) {
836
+ this.index[xs] = {};
837
+ }
838
+ if (!(ys in this.index[xs])) {
839
+ this.index[xs][ys] = new PointNode(p);
840
+ }
841
+ }
842
+ connect(a, b) {
843
+ const nodeA = this.get(a);
844
+ const nodeB = this.get(b);
845
+ if (!nodeA || !nodeB) {
846
+ throw new Error(`A point was not found`);
847
+ }
848
+ nodeA.adjacentNodes.push(nodeB);
849
+ }
850
+ has(p) {
851
+ const x = p[0];
852
+ const y = p[1];
853
+ const xs = x.toString(), ys = y.toString();
854
+ return xs in this.index && ys in this.index[xs];
855
+ }
856
+ get(p) {
857
+ const x = p[0];
858
+ const y = p[1];
859
+ const xs = x.toString(), ys = y.toString();
860
+ if (xs in this.index && ys in this.index[xs]) {
861
+ return this.index[xs][ys];
862
+ }
863
+ return null;
864
+ }
865
+ }
866
+
867
+ const generateElbowLineRoute = (options) => {
868
+ const { nextSourcePoint, nextTargetPoint } = options;
869
+ const points = getGraphPoints(options);
870
+ const graph = createGraph(points);
871
+ const aStar = new AStar(graph);
872
+ aStar.search(nextSourcePoint, nextTargetPoint, options.sourcePoint);
873
+ let route = aStar.getRoute(nextSourcePoint, nextTargetPoint);
874
+ route = [options.sourcePoint, ...route, nextTargetPoint, options.targetPoint];
875
+ const isHitX = RectangleClient.isHitX(options.sourceOuterRectangle, options.targetOuterRectangle);
876
+ const isHitY = RectangleClient.isHitY(options.sourceOuterRectangle, options.targetOuterRectangle);
877
+ const xAxis = isHitX ? undefined : RectangleClient.getGapCenter(options.sourceOuterRectangle, options.targetOuterRectangle, false);
878
+ const yAxis = isHitY ? undefined : RectangleClient.getGapCenter(options.sourceOuterRectangle, options.targetOuterRectangle, true);
879
+ route = routeAdjust(route, { xAxis, yAxis, sourceRectangle: options.sourceRectangle, targetRectangle: options.targetRectangle });
880
+ return route;
881
+ };
882
+ const routeAdjust = (path, options) => {
883
+ // 基于 middleX/middleY 中线纠正 path
884
+ // 1. 找垂直/水平的线段
885
+ // 2. 找到和middleX/middleY相交的点
886
+ // 3. 基于垂直/水平的线段分别和相交点构建矩形
887
+ // 4. 判断矩形相交
888
+ // 5. 处理 path
889
+ const { sourceRectangle, targetRectangle, xAxis, yAxis } = options;
890
+ if (xAxis !== undefined) {
891
+ const optionsX = getAdjustOptions(path, xAxis, true);
892
+ const resultX = optionsX.pointOfHit &&
893
+ adjust(path, { parallelPaths: optionsX.parallelPaths, pointOfHit: optionsX.pointOfHit, sourceRectangle, targetRectangle });
894
+ if (resultX) {
895
+ path = resultX;
896
+ }
897
+ }
898
+ if (yAxis !== undefined) {
899
+ const optionsY = getAdjustOptions(path, yAxis, false);
900
+ const resultY = optionsY.pointOfHit &&
901
+ adjust(path, { parallelPaths: optionsY.parallelPaths, pointOfHit: optionsY.pointOfHit, sourceRectangle, targetRectangle });
902
+ if (resultY) {
903
+ path = resultY;
904
+ }
905
+ }
906
+ return path;
907
+ };
908
+ const adjust = (route, options) => {
909
+ const { parallelPaths, pointOfHit, sourceRectangle, targetRectangle } = options;
910
+ let result = null;
911
+ parallelPaths.forEach(parallelPath => {
912
+ // 构建矩形
913
+ const tempRect = RectangleClient.toRectangleClient([pointOfHit, parallelPath[0], parallelPath[1]]);
914
+ if (!RectangleClient.isHit(tempRect, sourceRectangle) && !RectangleClient.isHit(tempRect, targetRectangle)) {
915
+ const getCornerCount = (path) => {
916
+ let cornerCount = 0;
917
+ for (let index = 1; index < path.length - 1; index++) {
918
+ const pre = path[index - 1];
919
+ const current = path[index];
920
+ const next = path[index + 1];
921
+ if (pre &&
922
+ current &&
923
+ next &&
924
+ !((Math.floor(current[0]) === Math.floor(pre[0]) && Math.floor(current[0]) === Math.floor(next[0])) ||
925
+ (Math.floor(current[1]) === Math.floor(pre[1]) && Math.floor(current[1]) === Math.floor(next[1])))) {
926
+ cornerCount++;
927
+ }
928
+ }
929
+ return cornerCount;
930
+ };
931
+ const tempCorners = RectangleClient.getCornerPoints(tempRect);
932
+ const indexRangeInPath = [];
933
+ const indexRangeInCorner = [];
934
+ route.forEach((point, index) => {
935
+ const cornerResult = tempCorners.findIndex(corner => Math.floor(corner[0]) === Math.floor(point[0]) && Math.floor(corner[1]) === Math.floor(point[1]));
936
+ if (cornerResult !== -1) {
937
+ indexRangeInPath.push(index);
938
+ indexRangeInCorner.push(cornerResult);
939
+ }
940
+ });
941
+ const newPath = [...route];
942
+ const missCorner = tempCorners.find((c, index) => !indexRangeInCorner.includes(index));
943
+ const removeLength = Math.abs(indexRangeInPath[0] - indexRangeInPath[indexRangeInPath.length - 1]) + 1;
944
+ newPath.splice(indexRangeInPath[0] + 1, removeLength - 2, missCorner);
945
+ const cornerCount = getCornerCount([...route]);
946
+ const newCornerCount = getCornerCount([...newPath]);
947
+ if (newCornerCount <= cornerCount) {
948
+ result = newPath;
949
+ }
950
+ }
951
+ return null;
952
+ });
953
+ return result;
954
+ };
955
+ const getAdjustOptions = (path, middle, isHorizontal) => {
956
+ const parallelPaths = [];
957
+ let start = null;
958
+ let pointOfHit = null;
959
+ const axis = isHorizontal ? 0 : 1;
960
+ for (let index = 0; index < path.length; index++) {
961
+ const previous = path[index - 1];
962
+ const current = path[index];
963
+ if (start === null && previous && previous[axis] === current[axis]) {
964
+ start = previous;
965
+ }
966
+ if (start !== null) {
967
+ if (previous[axis] !== current[axis]) {
968
+ parallelPaths.push([start, previous]);
969
+ start = null;
970
+ }
971
+ }
972
+ if (current[axis] === middle) {
973
+ pointOfHit = current;
974
+ }
975
+ }
976
+ if (start) {
977
+ parallelPaths.push([start, path[path.length - 1]]);
978
+ }
979
+ return { pointOfHit, parallelPaths };
980
+ };
981
+ const getGraphPoints = (options) => {
982
+ const { nextSourcePoint, nextTargetPoint, sourceOuterRectangle, targetOuterRectangle } = options;
983
+ const x = [];
984
+ const y = [];
985
+ let result = [];
986
+ [sourceOuterRectangle, targetOuterRectangle].forEach(rectangle => {
987
+ x.push(rectangle.x, rectangle.x + rectangle.width / 2, rectangle.x + rectangle.width);
988
+ y.push(rectangle.y, rectangle.y + rectangle.height / 2, rectangle.y + rectangle.height);
989
+ });
990
+ const rectanglesX = [
991
+ sourceOuterRectangle.x,
992
+ sourceOuterRectangle.x + sourceOuterRectangle.width,
993
+ targetOuterRectangle.x,
994
+ targetOuterRectangle.x + targetOuterRectangle.width
995
+ ].sort((a, b) => a - b);
996
+ x.push((rectanglesX[1] + rectanglesX[2]) / 2, nextSourcePoint[0], nextTargetPoint[0]);
997
+ const rectanglesY = [
998
+ sourceOuterRectangle.y,
999
+ sourceOuterRectangle.y + sourceOuterRectangle.height,
1000
+ targetOuterRectangle.y,
1001
+ targetOuterRectangle.y + targetOuterRectangle.height
1002
+ ].sort((a, b) => a - b);
1003
+ y.push((rectanglesY[1] + rectanglesY[2]) / 2, nextSourcePoint[1], nextTargetPoint[1]);
1004
+ for (let i = 0; i < x.length; i++) {
1005
+ for (let j = 0; j < y.length; j++) {
1006
+ const point = [x[i], y[j]];
1007
+ const isInSource = RectangleClient.isPointInRectangle(sourceOuterRectangle, point);
1008
+ const isInTarget = RectangleClient.isPointInRectangle(targetOuterRectangle, point);
1009
+ if (!isInSource && !isInTarget) {
1010
+ result.push(point);
1011
+ }
1012
+ }
1013
+ }
1014
+ result = removeDuplicatePoints(result).filter(point => {
1015
+ const isInSource = RectangleClient.isPointInRectangle(sourceOuterRectangle, point);
1016
+ const isInTarget = RectangleClient.isPointInRectangle(targetOuterRectangle, point);
1017
+ return !isInSource && !isInTarget;
1018
+ });
1019
+ return result;
1020
+ };
1021
+ const createGraph = (points) => {
1022
+ const graph = new PointGraph();
1023
+ const Xs = [];
1024
+ const Ys = [];
1025
+ points.forEach(p => {
1026
+ const x = p[0], y = p[1];
1027
+ if (Xs.indexOf(x) < 0)
1028
+ Xs.push(x);
1029
+ if (Ys.indexOf(y) < 0)
1030
+ Ys.push(y);
1031
+ graph.add(p);
1032
+ });
1033
+ Xs.sort((a, b) => a - b);
1034
+ Ys.sort((a, b) => a - b);
1035
+ const inHotIndex = (p) => graph.has(p);
1036
+ for (let i = 0; i < Xs.length; i++) {
1037
+ for (let j = 0; j < Ys.length; j++) {
1038
+ const point = [Xs[i], Ys[j]];
1039
+ if (!inHotIndex(point))
1040
+ continue;
1041
+ if (i > 0) {
1042
+ const otherPoint = [Xs[i - 1], Ys[j]];
1043
+ if (inHotIndex(otherPoint)) {
1044
+ graph.connect(otherPoint, point);
1045
+ graph.connect(point, otherPoint);
1046
+ }
1047
+ }
1048
+ if (j > 0) {
1049
+ const otherPoint = [Xs[i], Ys[j - 1]];
1050
+ if (inHotIndex(otherPoint)) {
1051
+ graph.connect(otherPoint, point);
1052
+ graph.connect(point, otherPoint);
1053
+ }
1054
+ }
1055
+ }
1056
+ }
1057
+ return graph;
1058
+ };
1059
+ const reduceRouteMargin = (sourceRectangle, targetRectangle) => {
1060
+ const defaultOffset = DEFAULT_ROUTE_MARGIN;
1061
+ let sourceOffset = new Array(4).fill(defaultOffset);
1062
+ let targetOffset = new Array(4).fill(defaultOffset);
1063
+ const sourceOuterRectangle = RectangleClient.inflate(sourceRectangle, defaultOffset * 2);
1064
+ const targetOuterRectangle = RectangleClient.inflate(targetRectangle, defaultOffset * 2);
1065
+ const isHit = RectangleClient.isHit(sourceOuterRectangle, targetOuterRectangle);
1066
+ if (isHit) {
1067
+ const leftToRight = sourceRectangle.x - (targetRectangle.x + targetRectangle.width);
1068
+ const rightToLeft = targetRectangle.x - (sourceRectangle.x + sourceRectangle.width);
1069
+ if (leftToRight > 0 && leftToRight < defaultOffset * 2) {
1070
+ const offset = leftToRight / 2;
1071
+ sourceOffset[3] = offset;
1072
+ targetOffset[1] = offset;
1073
+ }
1074
+ if (rightToLeft > 0 && rightToLeft < defaultOffset * 2) {
1075
+ const offset = rightToLeft / 2;
1076
+ targetOffset[3] = offset;
1077
+ sourceOffset[1] = offset;
1078
+ }
1079
+ const topToBottom = sourceRectangle.y - (targetRectangle.y + targetRectangle.height);
1080
+ const bottomToTop = targetRectangle.y - (sourceRectangle.y + sourceRectangle.height);
1081
+ if (topToBottom > 0 && topToBottom < defaultOffset * 2) {
1082
+ const offset = topToBottom / 2;
1083
+ sourceOffset[0] = offset;
1084
+ targetOffset[2] = offset;
1085
+ }
1086
+ if (bottomToTop > 0 && bottomToTop < defaultOffset * 2) {
1087
+ const offset = bottomToTop / 2;
1088
+ sourceOffset[2] = offset;
1089
+ targetOffset[0] = offset;
1090
+ }
1091
+ }
1092
+ return { sourceOffset, targetOffset };
1093
+ };
1094
+ const getNextPoint = (point, outerRectangle, direction) => {
1095
+ switch (direction) {
1096
+ case Direction.top: {
1097
+ return [point[0], outerRectangle.y];
1098
+ }
1099
+ case Direction.bottom: {
1100
+ return [point[0], outerRectangle.y + outerRectangle.height];
1101
+ }
1102
+ case Direction.right: {
1103
+ return [outerRectangle.x + outerRectangle.width, point[1]];
1104
+ }
1105
+ default: {
1106
+ return [outerRectangle.x, point[1]];
1107
+ }
1108
+ }
1109
+ };
728
1110
 
729
1111
  class CommonPluginElement extends PlaitPluginElementComponent {
730
1112
  constructor() {
@@ -836,5 +1218,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
836
1218
  * Generated bundle index. Do not edit.
837
1219
  */
838
1220
 
839
- export { ActiveGenerator, BASE, BoardCreationMode, CommonPluginElement, Generator, IS_RESIZING, ImageBaseComponent, ImageGenerator, MediaKeys, PICTURE_ACCEPTED_UPLOAD_SIZE, PRIMARY_COLOR, PropertyTransforms, RESIZE_HANDLE_DIAMETER, ResizeCursorClass, ResizeHandle, WithCommonPluginKey, WithTextPluginKey, acceptImageTypes, addResizing, buildImage, calculatePolylineLength, getCreationMode, getDirection, getDirectionBetweenPointAndPoint, getDirectionByPointOfRectangle, getDirectionByVector, getDirectionFactor, getEdgeCenter, getFactorByPoints, getOppositeDirection, getPointByVector, getPointOnPolyline, getPoints, getRatioByPoint, getRectangleByPoints, getRectangleResizeHandleRefs, getTextEditors, getTextManages, hasAfterDraw, isDelete, isDndMode, isDrawingMode, isEnterHotkey, isExpandHotkey, isPointOnLineSegment, isResizing, isResizingByCondition, isSpaceHotkey, isTabHotkey, isVirtualKey, normalizeShapePoints, removeResizing, rotateVectorAnti90, selectImage, setCreationMode, withResize };
1221
+ export { AStar, ActiveGenerator, BASE, BoardCreationMode, CommonPluginElement, DEFAULT_ROUTE_MARGIN, Generator, IS_RESIZING, ImageBaseComponent, ImageGenerator, MediaKeys, PICTURE_ACCEPTED_UPLOAD_SIZE, PRIMARY_COLOR, PointGraph, PointNode, PriorityQueue, PropertyTransforms, RESIZE_HANDLE_DIAMETER, ResizeCursorClass, ResizeHandle, WithCommonPluginKey, WithTextPluginKey, acceptImageTypes, addElementOfFocusedImage, addResizing, buildImage, calculatePolylineLength, createGraph, generateElbowLineRoute, getCreationMode, getDirection, getDirectionBetweenPointAndPoint, getDirectionByPointOfRectangle, getDirectionByVector, getDirectionFactor, getEdgeCenter, getElementOfFocusedImage, getFactorByPoints, getGraphPoints, getNextPoint, getOppositeDirection, getPointByVector, getPointOnPolyline, getPoints, getRatioByPoint, getRectangleByPoints, getRectangleResizeHandleRefs, getTextEditors, getTextManages, hasAfterDraw, isDelete, isDndMode, isDrawingMode, isEnterHotkey, isExpandHotkey, isPointOnLineSegment, isResizing, isResizingByCondition, isSpaceHotkey, isTabHotkey, isVirtualKey, normalizeShapePoints, reduceRouteMargin, removeDuplicatePoints, removeElementOfFocusedImage, removeResizing, rotateVectorAnti90, selectImage, setCreationMode, withResize };
840
1222
  //# sourceMappingURL=plait-common.mjs.map