@plait/draw 0.1.0-next.12 → 0.1.0-next.13
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/constants/image.d.ts +1 -0
- package/constants/index.d.ts +1 -0
- package/constants/pointer.d.ts +4 -14
- package/engines/comment.d.ts +4 -0
- package/engines/cross.d.ts +4 -0
- package/{utils/engine → engines}/diamond.d.ts +1 -1
- package/{utils/engine → engines}/ellipse.d.ts +1 -1
- package/engines/hexagon.d.ts +4 -0
- package/{utils/engine → engines}/index.d.ts +1 -1
- package/{utils/engine → engines}/left-arrow.d.ts +1 -1
- package/engines/octagon.d.ts +4 -0
- package/{utils/engine → engines}/parallelogram.d.ts +1 -1
- package/engines/pentagon-arrow.d.ts +4 -0
- package/engines/pentagon.d.ts +4 -0
- package/engines/process-arrow.d.ts +4 -0
- package/{utils/engine → engines}/rectangle.d.ts +1 -1
- package/{utils/engine → engines}/right-arrow.d.ts +1 -1
- package/engines/round-comment.d.ts +4 -0
- package/{utils/engine → engines}/round-rectangle.d.ts +1 -1
- package/engines/star.d.ts +4 -0
- package/{utils/engine → engines}/trapezoid.d.ts +1 -1
- package/{utils/engine → engines}/triangle.d.ts +1 -1
- package/engines/two-way-arrow.d.ts +4 -0
- package/esm2022/constants/geometry.mjs +3 -3
- package/esm2022/constants/image.mjs +2 -0
- package/esm2022/constants/index.mjs +2 -1
- package/esm2022/constants/pointer.mjs +8 -27
- package/esm2022/engines/comment.mjs +57 -0
- package/esm2022/engines/cross.mjs +46 -0
- package/esm2022/engines/diamond.mjs +30 -0
- package/esm2022/engines/ellipse.mjs +92 -0
- package/esm2022/engines/hexagon.mjs +40 -0
- package/esm2022/engines/index.mjs +46 -0
- package/esm2022/engines/left-arrow.mjs +45 -0
- package/esm2022/engines/octagon.mjs +42 -0
- package/esm2022/engines/parallelogram.mjs +39 -0
- package/esm2022/engines/pentagon-arrow.mjs +39 -0
- package/esm2022/engines/pentagon.mjs +39 -0
- package/esm2022/engines/process-arrow.mjs +41 -0
- package/esm2022/engines/rectangle.mjs +26 -0
- package/esm2022/engines/right-arrow.mjs +45 -0
- package/esm2022/engines/round-comment.mjs +81 -0
- package/esm2022/engines/round-rectangle.mjs +59 -0
- package/esm2022/engines/star.mjs +45 -0
- package/esm2022/engines/trapezoid.mjs +40 -0
- package/esm2022/engines/triangle.mjs +40 -0
- package/esm2022/engines/two-way-arrow.mjs +48 -0
- package/esm2022/generators/geometry-shape.generator.mjs +7 -2
- package/esm2022/generators/line-active.generator.mjs +49 -15
- package/esm2022/generators/line.generator.mjs +2 -11
- package/esm2022/geometry.component.mjs +13 -7
- package/esm2022/image.component.mjs +70 -0
- package/esm2022/interfaces/geometry.mjs +11 -1
- package/esm2022/interfaces/image.mjs +2 -0
- package/esm2022/interfaces/index.mjs +8 -2
- package/esm2022/interfaces/line.mjs +17 -2
- package/esm2022/line.component.mjs +4 -3
- package/esm2022/plugins/with-draw-fragment.mjs +20 -2
- package/esm2022/plugins/with-draw.mjs +25 -4
- package/esm2022/plugins/with-geometry-create.mjs +15 -12
- package/esm2022/plugins/with-geometry-resize.mjs +17 -11
- package/esm2022/plugins/with-line-bound-reaction.mjs +10 -5
- package/esm2022/plugins/with-line-create.mjs +7 -5
- package/esm2022/plugins/with-line-resize.mjs +12 -4
- package/esm2022/transforms/geometry-text.mjs +1 -1
- package/esm2022/transforms/image.mjs +23 -0
- package/esm2022/transforms/index.mjs +4 -2
- package/esm2022/utils/clipboard.mjs +3 -3
- package/esm2022/utils/geometry.mjs +8 -5
- package/esm2022/utils/index.mjs +1 -1
- package/esm2022/utils/line-arrow.mjs +43 -18
- package/esm2022/utils/line.mjs +163 -49
- package/esm2022/utils/position/geometry.mjs +5 -4
- package/esm2022/utils/position/line.mjs +32 -21
- package/esm2022/utils/selected.mjs +5 -1
- package/esm2022/utils/shape.mjs +8 -0
- package/fesm2022/plait-draw.mjs +1075 -258
- package/fesm2022/plait-draw.mjs.map +1 -1
- package/generators/line-active.generator.d.ts +2 -0
- package/generators/line.generator.d.ts +1 -1
- package/geometry.component.d.ts +1 -1
- package/image.component.d.ts +20 -0
- package/interfaces/geometry.d.ts +12 -1
- package/interfaces/image.d.ts +7 -0
- package/interfaces/index.d.ts +5 -1
- package/interfaces/line.d.ts +11 -4
- package/line.component.d.ts +1 -1
- package/package.json +1 -1
- package/plugins/with-geometry-create.d.ts +1 -1
- package/transforms/image.d.ts +3 -0
- package/transforms/index.d.ts +1 -0
- package/utils/line.d.ts +8 -4
- package/utils/position/geometry.d.ts +2 -1
- package/utils/position/line.d.ts +7 -3
- package/utils/selected.d.ts +2 -0
- package/utils/shape.d.ts +2 -0
- package/esm2022/utils/engine/diamond.mjs +0 -30
- package/esm2022/utils/engine/ellipse.mjs +0 -92
- package/esm2022/utils/engine/index.mjs +0 -26
- package/esm2022/utils/engine/left-arrow.mjs +0 -45
- package/esm2022/utils/engine/parallelogram.mjs +0 -39
- package/esm2022/utils/engine/rectangle.mjs +0 -26
- package/esm2022/utils/engine/right-arrow.mjs +0 -45
- package/esm2022/utils/engine/round-rectangle.mjs +0 -59
- package/esm2022/utils/engine/trapezoid.mjs +0 -40
- package/esm2022/utils/engine/triangle.mjs +0 -40
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const DEFAULT_IMAGE_WIDTH = 1000;
|
package/constants/index.d.ts
CHANGED
package/constants/pointer.d.ts
CHANGED
|
@@ -1,14 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
diamond = "diamond",
|
|
6
|
-
roundRectangle = "roundRectangle",
|
|
7
|
-
parallelogram = "parallelogram",
|
|
8
|
-
ellipse = "ellipse",
|
|
9
|
-
triangle = "triangle",
|
|
10
|
-
leftArrow = "leftArrow",
|
|
11
|
-
trapezoid = "trapezoid",
|
|
12
|
-
rightArrow = "rightArrow"
|
|
13
|
-
}
|
|
14
|
-
export declare const GeometryPointer: DrawPointerType[];
|
|
1
|
+
import { GeometryShape, LineShape } from '../interfaces';
|
|
2
|
+
export type DrawPointerType = GeometryShape | LineShape;
|
|
3
|
+
export declare const getGeometryPointers: () => string[];
|
|
4
|
+
export declare const getLinePointers: () => string[];
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { ShapeEngine } from '
|
|
1
|
+
import { ShapeEngine } from '../interfaces';
|
|
2
2
|
export declare const DiamondEngine: ShapeEngine;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Point } from '@plait/core';
|
|
2
|
-
import { ShapeEngine } from '
|
|
2
|
+
import { ShapeEngine } from '../interfaces';
|
|
3
3
|
export declare const EllipseEngine: ShapeEngine;
|
|
4
4
|
export declare function getNearestPointBetweenPointAndEllipse(point: Point, center: Point, rx: number, ry: number, rotation?: number): Point;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Point, RectangleClient } from '@plait/core';
|
|
2
|
-
import { ShapeEngine } from '
|
|
2
|
+
import { ShapeEngine } from '../interfaces';
|
|
3
3
|
export declare const LeftArrowEngine: ShapeEngine;
|
|
4
4
|
export declare const getLeftArrowPoints: (rectangle: RectangleClient) => Point[];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Point, RectangleClient } from '@plait/core';
|
|
2
|
-
import { ShapeEngine } from '
|
|
2
|
+
import { ShapeEngine } from '../interfaces';
|
|
3
3
|
export declare const ParallelogramEngine: ShapeEngine;
|
|
4
4
|
export declare const getParallelogramCornerPoints: (rectangle: RectangleClient) => Point[];
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { ShapeEngine } from '
|
|
1
|
+
import { ShapeEngine } from '../interfaces';
|
|
2
2
|
export declare const RectangleEngine: ShapeEngine;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Point, RectangleClient } from '@plait/core';
|
|
2
|
-
import { ShapeEngine } from '
|
|
2
|
+
import { ShapeEngine } from '../interfaces';
|
|
3
3
|
export declare const RightArrowEngine: ShapeEngine;
|
|
4
4
|
export declare const getRightArrowPoints: (rectangle: RectangleClient) => Point[];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Point, RectangleClient } from '@plait/core';
|
|
2
|
-
import { ShapeEngine } from '
|
|
2
|
+
import { ShapeEngine } from '../interfaces';
|
|
3
3
|
export declare const RoundRectangleEngine: ShapeEngine;
|
|
4
4
|
export declare const getRoundRectangleRadius: (rectangle: RectangleClient) => number;
|
|
5
5
|
export declare function getNearestPointBetweenPointAndRoundRectangle(point: Point, rectangle: RectangleClient, radius: number): Point;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Point, RectangleClient } from '@plait/core';
|
|
2
|
-
import { ShapeEngine } from '
|
|
2
|
+
import { ShapeEngine } from '../interfaces';
|
|
3
3
|
export declare const TrapezoidEngine: ShapeEngine;
|
|
4
4
|
export declare const getTrapezoidPoints: (rectangle: RectangleClient) => Point[];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Point, RectangleClient } from '@plait/core';
|
|
2
|
-
import { ShapeEngine } from '
|
|
2
|
+
import { ShapeEngine } from '../interfaces';
|
|
3
3
|
export declare const TriangleEngine: ShapeEngine;
|
|
4
4
|
export declare const getTrianglePoints: (rectangle: RectangleClient) => Point[];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ACTIVE_STROKE_WIDTH } from
|
|
1
|
+
import { ACTIVE_STROKE_WIDTH } from '@plait/core';
|
|
2
2
|
export const ShapeDefaultSpace = {
|
|
3
3
|
rectangleAndText: 4
|
|
4
4
|
};
|
|
@@ -24,6 +24,6 @@ export const DefaultTextProperty = {
|
|
|
24
24
|
text: '文本'
|
|
25
25
|
};
|
|
26
26
|
export const GeometryThreshold = {
|
|
27
|
-
defaultTextMaxWidth: 34 * 14
|
|
27
|
+
defaultTextMaxWidth: 34 * 14
|
|
28
28
|
};
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy9jb25zdGFudHMvZ2VvbWV0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWxELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHO0lBQzdCLGdCQUFnQixFQUFFLENBQUM7Q0FDdEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2hDLFdBQVcsRUFBRSxDQUFDO0lBQ2QsYUFBYSxFQUFFLENBQUM7SUFDaEIsV0FBVyxFQUFFLE1BQU07SUFDbkIsSUFBSSxFQUFFLE1BQU07Q0FDZixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUc7SUFDdEMsV0FBVyxFQUFFLG1CQUFtQjtJQUNoQyxvQkFBb0IsRUFBRSxtQkFBbUI7Q0FDNUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHO0lBQ25DLEtBQUssRUFBRSxHQUFHO0lBQ1YsTUFBTSxFQUFFLEdBQUc7SUFDWCxXQUFXLEVBQUUsTUFBTTtJQUNuQixXQUFXLEVBQUUsQ0FBQztDQUNqQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDL0IsS0FBSyxFQUFFLEVBQUU7SUFDVCxNQUFNLEVBQUUsRUFBRTtJQUNWLElBQUksRUFBRSxJQUFJO0NBQ2IsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHO0lBQzdCLG1CQUFtQixFQUFFLEVBQUUsR0FBRyxFQUFFO0NBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBQ1RJVkVfU1RST0tFX1dJRFRIIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuXG5leHBvcnQgY29uc3QgU2hhcGVEZWZhdWx0U3BhY2UgPSB7XG4gICAgcmVjdGFuZ2xlQW5kVGV4dDogNFxufTtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRHZW9tZXRyeVN0eWxlID0ge1xuICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgIGRlZmF1bHRSYWRpdXM6IDQsXG4gICAgc3Ryb2tlQ29sb3I6ICcjMDAwJyxcbiAgICBmaWxsOiAnbm9uZSdcbn07XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0R2VvbWV0cnlBY3RpdmVTdHlsZSA9IHtcbiAgICBzdHJva2VXaWR0aDogQUNUSVZFX1NUUk9LRV9XSURUSCxcbiAgICBzZWxlY3Rpb25TdHJva2VXaWR0aDogQUNUSVZFX1NUUk9LRV9XSURUSFxufTtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRHZW9tZXRyeVByb3BlcnR5ID0ge1xuICAgIHdpZHRoOiAxMDAsXG4gICAgaGVpZ2h0OiAxMDAsXG4gICAgc3Ryb2tlQ29sb3I6ICcjMzMzJyxcbiAgICBzdHJva2VXaWR0aDogMlxufTtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRUZXh0UHJvcGVydHkgPSB7XG4gICAgd2lkdGg6IDM2LFxuICAgIGhlaWdodDogMjAsXG4gICAgdGV4dDogJ+aWh+acrCdcbn07XG5cbmV4cG9ydCBjb25zdCBHZW9tZXRyeVRocmVzaG9sZCA9IHtcbiAgICBkZWZhdWx0VGV4dE1heFdpZHRoOiAzNCAqIDE0XG59O1xuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export const DEFAULT_IMAGE_WIDTH = 1000;
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy9jb25zdGFudHMvaW1hZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IERFRkFVTFRfSU1BR0VfV0lEVEggPSAxMDAwO1xuIl19
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export * from './geometry';
|
|
2
2
|
export * from './pointer';
|
|
3
|
-
|
|
3
|
+
export * from './image';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy9jb25zdGFudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2dlb21ldHJ5JztcbmV4cG9ydCAqIGZyb20gJy4vcG9pbnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2ltYWdlJztcbiJdfQ==
|
|
@@ -1,27 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
DrawPointerType["ellipse"] = "ellipse";
|
|
10
|
-
DrawPointerType["triangle"] = "triangle";
|
|
11
|
-
DrawPointerType["leftArrow"] = "leftArrow";
|
|
12
|
-
DrawPointerType["trapezoid"] = "trapezoid";
|
|
13
|
-
DrawPointerType["rightArrow"] = "rightArrow";
|
|
14
|
-
})(DrawPointerType || (DrawPointerType = {}));
|
|
15
|
-
export const GeometryPointer = [
|
|
16
|
-
DrawPointerType.rectangle,
|
|
17
|
-
DrawPointerType.text,
|
|
18
|
-
DrawPointerType.diamond,
|
|
19
|
-
DrawPointerType.ellipse,
|
|
20
|
-
DrawPointerType.parallelogram,
|
|
21
|
-
DrawPointerType.roundRectangle,
|
|
22
|
-
DrawPointerType.triangle,
|
|
23
|
-
DrawPointerType.leftArrow,
|
|
24
|
-
DrawPointerType.trapezoid,
|
|
25
|
-
DrawPointerType.rightArrow
|
|
26
|
-
];
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL2NvbnN0YW50cy9wb2ludGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLGVBWVg7QUFaRCxXQUFZLGVBQWU7SUFDdkIsZ0NBQWEsQ0FBQTtJQUNiLDBDQUF1QixDQUFBO0lBQ3ZCLGdDQUFhLENBQUE7SUFDYixzQ0FBbUIsQ0FBQTtJQUNuQixvREFBaUMsQ0FBQTtJQUNqQyxrREFBK0IsQ0FBQTtJQUMvQixzQ0FBbUIsQ0FBQTtJQUNuQix3Q0FBcUIsQ0FBQTtJQUNyQiwwQ0FBdUIsQ0FBQTtJQUN2QiwwQ0FBdUIsQ0FBQTtJQUN2Qiw0Q0FBeUIsQ0FBQTtBQUM3QixDQUFDLEVBWlcsZUFBZSxLQUFmLGVBQWUsUUFZMUI7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUc7SUFDM0IsZUFBZSxDQUFDLFNBQVM7SUFDekIsZUFBZSxDQUFDLElBQUk7SUFDcEIsZUFBZSxDQUFDLE9BQU87SUFDdkIsZUFBZSxDQUFDLE9BQU87SUFDdkIsZUFBZSxDQUFDLGFBQWE7SUFDN0IsZUFBZSxDQUFDLGNBQWM7SUFDOUIsZUFBZSxDQUFDLFFBQVE7SUFDeEIsZUFBZSxDQUFDLFNBQVM7SUFDekIsZUFBZSxDQUFDLFNBQVM7SUFDekIsZUFBZSxDQUFDLFVBQVU7Q0FDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIERyYXdQb2ludGVyVHlwZSB7XG4gICAgdGV4dCA9ICd0ZXh0JyxcbiAgICByZWN0YW5nbGUgPSAncmVjdGFuZ2xlJyxcbiAgICBsaW5lID0gJ2xpbmUnLFxuICAgIGRpYW1vbmQgPSAnZGlhbW9uZCcsXG4gICAgcm91bmRSZWN0YW5nbGUgPSAncm91bmRSZWN0YW5nbGUnLFxuICAgIHBhcmFsbGVsb2dyYW0gPSAncGFyYWxsZWxvZ3JhbScsXG4gICAgZWxsaXBzZSA9ICdlbGxpcHNlJyxcbiAgICB0cmlhbmdsZSA9ICd0cmlhbmdsZScsXG4gICAgbGVmdEFycm93ID0gJ2xlZnRBcnJvdycsXG4gICAgdHJhcGV6b2lkID0gJ3RyYXBlem9pZCcsXG4gICAgcmlnaHRBcnJvdyA9ICdyaWdodEFycm93J1xufVxuXG5leHBvcnQgY29uc3QgR2VvbWV0cnlQb2ludGVyID0gW1xuICAgIERyYXdQb2ludGVyVHlwZS5yZWN0YW5nbGUsXG4gICAgRHJhd1BvaW50ZXJUeXBlLnRleHQsXG4gICAgRHJhd1BvaW50ZXJUeXBlLmRpYW1vbmQsXG4gICAgRHJhd1BvaW50ZXJUeXBlLmVsbGlwc2UsXG4gICAgRHJhd1BvaW50ZXJUeXBlLnBhcmFsbGVsb2dyYW0sXG4gICAgRHJhd1BvaW50ZXJUeXBlLnJvdW5kUmVjdGFuZ2xlLFxuICAgIERyYXdQb2ludGVyVHlwZS50cmlhbmdsZSxcbiAgICBEcmF3UG9pbnRlclR5cGUubGVmdEFycm93LFxuICAgIERyYXdQb2ludGVyVHlwZS50cmFwZXpvaWQsXG4gICAgRHJhd1BvaW50ZXJUeXBlLnJpZ2h0QXJyb3dcbl07XG4iXX0=
|
|
1
|
+
import { GeometryShape, LineShape } from '../interfaces';
|
|
2
|
+
export const getGeometryPointers = () => {
|
|
3
|
+
return Object.keys(GeometryShape);
|
|
4
|
+
};
|
|
5
|
+
export const getLinePointers = () => {
|
|
6
|
+
return Object.keys(LineShape);
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL2NvbnN0YW50cy9wb2ludGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSXpELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsRUFBRTtJQUNwQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDdEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEdBQUcsRUFBRTtJQUNoQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2VvbWV0cnlTaGFwZSwgTGluZVNoYXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCB0eXBlIERyYXdQb2ludGVyVHlwZSA9IEdlb21ldHJ5U2hhcGUgfCBMaW5lU2hhcGU7XG5cbmV4cG9ydCBjb25zdCBnZXRHZW9tZXRyeVBvaW50ZXJzID0gKCkgPT4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhHZW9tZXRyeVNoYXBlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRMaW5lUG9pbnRlcnMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKExpbmVTaGFwZSk7XG59O1xuIl19
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { PlaitBoard, RectangleClient, getNearestPointBetweenPointAndSegments, isPointInPolygon, setStrokeLinecap } from '@plait/core';
|
|
2
|
+
import { getEdgeOnPolygonByPoint } from '../utils/geometry';
|
|
3
|
+
import { getRectangleByPoints } from '@plait/common';
|
|
4
|
+
import { ShapeDefaultSpace } from '../constants';
|
|
5
|
+
import { getStrokeWidthByElement } from '../utils';
|
|
6
|
+
const heightRatio = 3 / 4;
|
|
7
|
+
export const CommentEngine = {
|
|
8
|
+
draw(board, rectangle, options) {
|
|
9
|
+
const points = getCommentPoints(rectangle);
|
|
10
|
+
const rs = PlaitBoard.getRoughSVG(board);
|
|
11
|
+
const polygon = rs.polygon(points, { ...options, fillStyle: 'solid' });
|
|
12
|
+
setStrokeLinecap(polygon, 'round');
|
|
13
|
+
return polygon;
|
|
14
|
+
},
|
|
15
|
+
isHit(rectangle, point) {
|
|
16
|
+
const parallelogramPoints = getCommentPoints(rectangle);
|
|
17
|
+
return isPointInPolygon(point, parallelogramPoints);
|
|
18
|
+
},
|
|
19
|
+
getCornerPoints(rectangle) {
|
|
20
|
+
return getCommentPoints(rectangle);
|
|
21
|
+
},
|
|
22
|
+
getNearestPoint(rectangle, point) {
|
|
23
|
+
return getNearestPointBetweenPointAndSegments(point, getCommentPoints(rectangle));
|
|
24
|
+
},
|
|
25
|
+
getEdgeByConnectionPoint(rectangle, pointOfRectangle) {
|
|
26
|
+
const corners = getCommentPoints(rectangle);
|
|
27
|
+
const point = RectangleClient.getConnectionPoint(rectangle, pointOfRectangle);
|
|
28
|
+
return getEdgeOnPolygonByPoint(corners, point);
|
|
29
|
+
},
|
|
30
|
+
getConnectorPoints(rectangle) {
|
|
31
|
+
return RectangleClient.getEdgeCenterPoints(rectangle);
|
|
32
|
+
},
|
|
33
|
+
getTextRectangle(element) {
|
|
34
|
+
const elementRectangle = getRectangleByPoints(element.points);
|
|
35
|
+
const strokeWidth = getStrokeWidthByElement(element);
|
|
36
|
+
const height = element.textHeight;
|
|
37
|
+
const width = elementRectangle.width - ShapeDefaultSpace.rectangleAndText * 2 - strokeWidth * 2;
|
|
38
|
+
return {
|
|
39
|
+
height,
|
|
40
|
+
width: width > 0 ? width : 0,
|
|
41
|
+
x: elementRectangle.x + ShapeDefaultSpace.rectangleAndText + strokeWidth,
|
|
42
|
+
y: elementRectangle.y + (elementRectangle.height * heightRatio - height) / 2
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
export const getCommentPoints = (rectangle) => {
|
|
47
|
+
return [
|
|
48
|
+
[rectangle.x, rectangle.y],
|
|
49
|
+
[rectangle.x + rectangle.width, rectangle.y],
|
|
50
|
+
[rectangle.x + rectangle.width, rectangle.y + rectangle.height * heightRatio],
|
|
51
|
+
[rectangle.x + (rectangle.width * 3) / 5, rectangle.y + rectangle.height * heightRatio],
|
|
52
|
+
[rectangle.x + rectangle.width / 2, rectangle.y + rectangle.height],
|
|
53
|
+
[rectangle.x + (rectangle.width * 2) / 5, rectangle.y + rectangle.height * heightRatio],
|
|
54
|
+
[rectangle.x, rectangle.y + rectangle.height * heightRatio]
|
|
55
|
+
];
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL2VuZ2luZXMvY29tbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsVUFBVSxFQUdWLGVBQWUsRUFDZixzQ0FBc0MsRUFDdEMsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNuQixNQUFNLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQTRCLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFdEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFbkQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUUxQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWdCO0lBQ3RDLElBQUksQ0FBQyxLQUFpQixFQUFFLFNBQTBCLEVBQUUsT0FBZ0I7UUFDaEUsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuQyxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBQ0QsS0FBSyxDQUFDLFNBQTBCLEVBQUUsS0FBWTtRQUMxQyxNQUFNLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELE9BQU8sZ0JBQWdCLENBQUMs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QUM7QUFDTixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIFBsYWl0Qm9hcmQsXG4gICAgUG9pbnQsXG4gICAgUG9pbnRPZlJlY3RhbmdsZSxcbiAgICBSZWN0YW5nbGVDbGllbnQsXG4gICAgZ2V0TmVhcmVzdFBvaW50QmV0d2VlblBvaW50QW5kU2VnbWVudHMsXG4gICAgaXNQb2ludEluUG9seWdvbixcbiAgICBzZXRTdHJva2VMaW5lY2FwXG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IFBsYWl0R2VvbWV0cnksIFNoYXBlRW5naW5lIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBnZXRDZW50ZXJQb2ludHNPblBvbHlnb24sIGdldEVkZ2VPblBvbHlnb25CeVBvaW50IH0gZnJvbSAnLi4vdXRpbHMvZ2VvbWV0cnknO1xuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJ3JvdWdoanMvYmluL2NvcmUnO1xuaW1wb3J0IHsgZ2V0UmVjdGFuZ2xlQnlQb2ludHMgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7IFNoYXBlRGVmYXVsdFNwYWNlIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGdldFN0cm9rZVdpZHRoQnlFbGVtZW50IH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBoZWlnaHRSYXRpbyA9IDMgLyA0O1xuXG5leHBvcnQgY29uc3QgQ29tbWVudEVuZ2luZTogU2hhcGVFbmdpbmUgPSB7XG4gICAgZHJhdyhib2FyZDogUGxhaXRCb2FyZCwgcmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZ2V0Q29tbWVudFBvaW50cyhyZWN0YW5nbGUpO1xuICAgICAgICBjb25zdCBycyA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcoYm9hcmQpO1xuICAgICAgICBjb25zdCBwb2x5Z29uID0gcnMucG9seWdvbihwb2ludHMsIHsgLi4ub3B0aW9ucywgZmlsbFN0eWxlOiAnc29saWQnIH0pO1xuICAgICAgICBzZXRTdHJva2VMaW5lY2FwKHBvbHlnb24sICdyb3VuZCcpO1xuICAgICAgICByZXR1cm4gcG9seWdvbjtcbiAgICB9LFxuICAgIGlzSGl0KHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgY29uc3QgcGFyYWxsZWxvZ3JhbVBvaW50cyA9IGdldENvbW1lbnRQb2ludHMocmVjdGFuZ2xlKTtcbiAgICAgICAgcmV0dXJuIGlzUG9pbnRJblBvbHlnb24ocG9pbnQsIHBhcmFsbGVsb2dyYW1Qb2ludHMpO1xuICAgIH0sXG4gICAgZ2V0Q29ybmVyUG9pbnRzKHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSB7XG4gICAgICAgIHJldHVybiBnZXRDb21tZW50UG9pbnRzKHJlY3RhbmdsZSk7XG4gICAgfSxcbiAgICBnZXROZWFyZXN0UG9pbnQocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICByZXR1cm4gZ2V0TmVhcmVzdFBvaW50QmV0d2VlblBvaW50QW5kU2VnbWVudHMocG9pbnQsIGdldENvbW1lbnRQb2ludHMocmVjdGFuZ2xlKSk7XG4gICAgfSxcbiAgICBnZXRFZGdlQnlDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIHBvaW50T2ZSZWN0YW5nbGU6IFBvaW50T2ZSZWN0YW5nbGUpOiBbUG9pbnQsIFBvaW50XSB8IG51bGwge1xuICAgICAgICBjb25zdCBjb3JuZXJzID0gZ2V0Q29tbWVudFBvaW50cyhyZWN0YW5nbGUpO1xuICAgICAgICBjb25zdCBwb2ludCA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlLCBwb2ludE9mUmVjdGFuZ2xlKTtcbiAgICAgICAgcmV0dXJuIGdldEVkZ2VPblBvbHlnb25CeVBvaW50KGNvcm5lcnMsIHBvaW50KTtcbiAgICB9LFxuICAgIGdldENvbm5lY3RvclBvaW50cyhyZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmdldEVkZ2VDZW50ZXJQb2ludHMocmVjdGFuZ2xlKTtcbiAgICB9LFxuICAgIGdldFRleHRSZWN0YW5nbGUoZWxlbWVudDogUGxhaXRHZW9tZXRyeSkge1xuICAgICAgICBjb25zdCBlbGVtZW50UmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlQb2ludHMoZWxlbWVudC5wb2ludHMhKTtcbiAgICAgICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gZWxlbWVudC50ZXh0SGVpZ2h0O1xuICAgICAgICBjb25zdCB3aWR0aCA9IGVsZW1lbnRSZWN0YW5nbGUud2lkdGggLSBTaGFwZURlZmF1bHRTcGFjZS5yZWN0YW5nbGVBbmRUZXh0ICogMiAtIHN0cm9rZVdpZHRoICogMjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCA+IDAgPyB3aWR0aCA6IDAsXG4gICAgICAgICAgICB4OiBlbGVtZW50UmVjdGFuZ2xlLnggKyBTaGFwZURlZmF1bHRTcGFjZS5yZWN0YW5nbGVBbmRUZXh0ICsgc3Ryb2tlV2lkdGgsXG4gICAgICAgICAgICB5OiBlbGVtZW50UmVjdGFuZ2xlLnkgKyAoZWxlbWVudFJlY3RhbmdsZS5oZWlnaHQgKiBoZWlnaHRSYXRpbyAtIGhlaWdodCkgLyAyXG4gICAgICAgIH07XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbW1lbnRQb2ludHMgPSAocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQpOiBQb2ludFtdID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgICBbcmVjdGFuZ2xlLngsIHJlY3RhbmdsZS55XSxcbiAgICAgICAgW3JlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoLCByZWN0YW5nbGUueV0sXG4gICAgICAgIFtyZWN0YW5nbGUueCArIHJlY3RhbmdsZS53aWR0aCwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0ICogaGVpZ2h0UmF0aW9dLFxuICAgICAgICBbcmVjdGFuZ2xlLnggKyAocmVjdGFuZ2xlLndpZHRoICogMykgLyA1LCByZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQgKiBoZWlnaHRSYXRpb10sXG4gICAgICAgIFtyZWN0YW5nbGUueCArIHJlY3RhbmdsZS53aWR0aCAvIDIsIHJlY3RhbmdsZS55ICsgcmVjdGFuZ2xlLmhlaWdodF0sXG4gICAgICAgIFtyZWN0YW5nbGUueCArIChyZWN0YW5nbGUud2lkdGggKiAyKSAvIDUsIHJlY3RhbmdsZS55ICsgcmVjdGFuZ2xlLmhlaWdodCAqIGhlaWdodFJhdGlvXSxcbiAgICAgICAgW3JlY3RhbmdsZS54LCByZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQgKiBoZWlnaHRSYXRpb11cbiAgICBdO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { PlaitBoard, RectangleClient, getNearestPointBetweenPointAndSegments, isPointInPolygon, setStrokeLinecap } from '@plait/core';
|
|
2
|
+
import { getEdgeOnPolygonByPoint } from '../utils/geometry';
|
|
3
|
+
export const CrossEngine = {
|
|
4
|
+
draw(board, rectangle, options) {
|
|
5
|
+
const points = getCrossPoints(rectangle);
|
|
6
|
+
const rs = PlaitBoard.getRoughSVG(board);
|
|
7
|
+
const polygon = rs.polygon(points, { ...options, fillStyle: 'solid' });
|
|
8
|
+
setStrokeLinecap(polygon, 'round');
|
|
9
|
+
return polygon;
|
|
10
|
+
},
|
|
11
|
+
isHit(rectangle, point) {
|
|
12
|
+
const parallelogramPoints = getCrossPoints(rectangle);
|
|
13
|
+
return isPointInPolygon(point, parallelogramPoints);
|
|
14
|
+
},
|
|
15
|
+
getCornerPoints(rectangle) {
|
|
16
|
+
return getCrossPoints(rectangle);
|
|
17
|
+
},
|
|
18
|
+
getNearestPoint(rectangle, point) {
|
|
19
|
+
return getNearestPointBetweenPointAndSegments(point, getCrossPoints(rectangle));
|
|
20
|
+
},
|
|
21
|
+
getEdgeByConnectionPoint(rectangle, pointOfRectangle) {
|
|
22
|
+
const corners = getCrossPoints(rectangle);
|
|
23
|
+
const point = RectangleClient.getConnectionPoint(rectangle, pointOfRectangle);
|
|
24
|
+
return getEdgeOnPolygonByPoint(corners, point);
|
|
25
|
+
},
|
|
26
|
+
getConnectorPoints(rectangle) {
|
|
27
|
+
return RectangleClient.getEdgeCenterPoints(rectangle);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
export const getCrossPoints = (rectangle) => {
|
|
31
|
+
return [
|
|
32
|
+
[rectangle.x + rectangle.width / 4, rectangle.y],
|
|
33
|
+
[rectangle.x + (rectangle.width * 3) / 4, rectangle.y],
|
|
34
|
+
[rectangle.x + (rectangle.width * 3) / 4, rectangle.y + rectangle.height / 4],
|
|
35
|
+
[rectangle.x + rectangle.width, rectangle.y + rectangle.height / 4],
|
|
36
|
+
[rectangle.x + rectangle.width, rectangle.y + (rectangle.height * 3) / 4],
|
|
37
|
+
[rectangle.x + (rectangle.width * 3) / 4, rectangle.y + (rectangle.height * 3) / 4],
|
|
38
|
+
[rectangle.x + (rectangle.width * 3) / 4, rectangle.y + rectangle.height],
|
|
39
|
+
[rectangle.x + rectangle.width / 4, rectangle.y + rectangle.height],
|
|
40
|
+
[rectangle.x + rectangle.width / 4, rectangle.y + (rectangle.height * 3) / 4],
|
|
41
|
+
[rectangle.x, rectangle.y + (rectangle.height * 3) / 4],
|
|
42
|
+
[rectangle.x, rectangle.y + rectangle.height / 4],
|
|
43
|
+
[rectangle.x + rectangle.width / 4, rectangle.y + rectangle.height / 4]
|
|
44
|
+
];
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy9lbmdpbmVzL2Nyb3NzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxVQUFVLEVBR1YsZUFBZSxFQUNmLHNDQUFzQyxFQUN0QyxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ25CLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFBNEIsdUJBQXVCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd0RixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWdCO0lBQ3BDLElBQUksQ0FBQyxLQUFpQixFQUFFLFNBQTBCLEVBQUUsT0FBZ0I7UUFDaEUsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN2RSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkMsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUNELEtBQUssQ0FBQyxTQUEwQixFQUFFLEtBQVk7UUFDMUMsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsT0FBTyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsZUFBZSxDQUFDLFNBQTBCO1FBQ3RDLE9BQU8sY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxlQUFlLENBQUMsU0FBMEIsRUFBRSxLQUFZO1FBQ3BELE9BQU8sc0NBQXNDLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FB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biAgICBQb2ludCxcbiAgICBQb2ludE9mUmVjdGFuZ2xlLFxuICAgIFJlY3RhbmdsZUNsaWVudCxcbiAgICBnZXROZWFyZXN0UG9pbnRCZXR3ZWVuUG9pbnRBbmRTZWdtZW50cyxcbiAgICBpc1BvaW50SW5Qb2x5Z29uLFxuICAgIHNldFN0cm9rZUxpbmVjYXBcbn0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgU2hhcGVFbmdpbmUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGdldENlbnRlclBvaW50c09uUG9seWdvbiwgZ2V0RWRnZU9uUG9seWdvbkJ5UG9pbnQgfSBmcm9tICcuLi91dGlscy9nZW9tZXRyeSc7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAncm91Z2hqcy9iaW4vY29yZSc7XG5cbmV4cG9ydCBjb25zdCBDcm9zc0VuZ2luZTogU2hhcGVFbmdpbmUgPSB7XG4gICAgZHJhdyhib2FyZDogUGxhaXRCb2FyZCwgcmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZ2V0Q3Jvc3NQb2ludHMocmVjdGFuZ2xlKTtcbiAgICAgICAgY29uc3QgcnMgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKTtcbiAgICAgICAgY29uc3QgcG9seWdvbiA9IHJzLnBvbHlnb24ocG9pbnRzLCB7IC4uLm9wdGlvbnMsIGZpbGxTdHlsZTogJ3NvbGlkJyB9KTtcbiAgICAgICAgc2V0U3Ryb2tlTGluZWNhcChwb2x5Z29uLCAncm91bmQnKTtcbiAgICAgICAgcmV0dXJuIHBvbHlnb247XG4gICAgfSxcbiAgICBpc0hpdChyZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgcG9pbnQ6IFBvaW50KSB7XG4gICAgICAgIGNvbnN0IHBhcmFsbGVsb2dyYW1Qb2ludHMgPSBnZXRDcm9zc1BvaW50cyhyZWN0YW5nbGUpO1xuICAgICAgICByZXR1cm4gaXNQb2ludEluUG9seWdvbihwb2ludCwgcGFyYWxsZWxvZ3JhbVBvaW50cyk7XG4gICAgfSxcbiAgICBnZXRDb3JuZXJQb2ludHMocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQpIHtcbiAgICAgICAgcmV0dXJuIGdldENyb3NzUG9pbnRzKHJlY3RhbmdsZSk7XG4gICAgfSxcbiAgICBnZXROZWFyZXN0UG9pbnQocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICByZXR1cm4gZ2V0TmVhcmVzdFBvaW50QmV0d2VlblBvaW50QW5kU2VnbWVudHMocG9pbnQsIGdldENyb3NzUG9pbnRzKHJlY3RhbmdsZSkpO1xuICAgIH0sXG4gICAgZ2V0RWRnZUJ5Q29ubmVjdGlvblBvaW50KHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBwb2ludE9mUmVjdGFuZ2xlOiBQb2ludE9mUmVjdGFuZ2xlKTogW1BvaW50LCBQb2ludF0gfCBudWxsIHtcbiAgICAgICAgY29uc3QgY29ybmVycyA9IGdldENyb3NzUG9pbnRzKHJlY3RhbmdsZSk7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gUmVjdGFuZ2xlQ2xpZW50LmdldENvbm5lY3Rpb25Qb2ludChyZWN0YW5nbGUsIHBvaW50T2ZSZWN0YW5nbGUpO1xuICAgICAgICByZXR1cm4gZ2V0RWRnZU9uUG9seWdvbkJ5UG9pbnQoY29ybmVycywgcG9pbnQpO1xuICAgIH0sXG4gICAgZ2V0Q29ubmVjdG9yUG9pbnRzKHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSB7XG4gICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuZ2V0RWRnZUNlbnRlclBvaW50cyhyZWN0YW5nbGUpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDcm9zc1BvaW50cyA9IChyZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCk6IFBvaW50W10gPT4ge1xuICAgIHJldHVybiBbXG4gICAgICAgIFtyZWN0YW5nbGUueCArIHJlY3RhbmdsZS53aWR0aCAvIDQsIHJlY3RhbmdsZS55XSxcbiAgICAgICAgW3JlY3RhbmdsZS54ICsgKHJlY3RhbmdsZS53aWR0aCAqIDMpIC8gNCwgcmVjdGFuZ2xlLnldLFxuICAgICAgICBbcmVjdGFuZ2xlLnggKyAocmVjdGFuZ2xlLndpZHRoICogMykgLyA0LCByZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQgLyA0XSxcbiAgICAgICAgW3JlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoLCByZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQgLyA0XSxcbiAgICAgICAgW3JlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoLCByZWN0YW5nbGUueSArIChyZWN0YW5nbGUuaGVpZ2h0ICogMykgLyA0XSxcbiAgICAgICAgW3JlY3RhbmdsZS54ICsgKHJlY3RhbmdsZS53aWR0aCAqIDMpIC8gNCwgcmVjdGFuZ2xlLnkgKyAocmVjdGFuZ2xlLmhlaWdodCAqIDMpIC8gNF0sXG4gICAgICAgIFtyZWN0YW5nbGUueCArIChyZWN0YW5nbGUud2lkdGggKiAzKSAvIDQsIHJlY3RhbmdsZS55ICsgcmVjdGFuZ2xlLmhlaWdodF0sXG4gICAgICAgIFtyZWN0YW5nbGUueCArIHJlY3RhbmdsZS53aWR0aCAvIDQsIHJlY3RhbmdsZS55ICsgcmVjdGFuZ2xlLmhlaWdodF0sXG4gICAgICAgIFtyZWN0YW5nbGUueCArIHJlY3RhbmdsZS53aWR0aCAvIDQsIHJlY3RhbmdsZS55ICsgKHJlY3RhbmdsZS5oZWlnaHQgKiAzKSAvIDRdLFxuICAgICAgICBbcmVjdGFuZ2xlLngsIHJlY3RhbmdsZS55ICsgKHJlY3RhbmdsZS5oZWlnaHQgKiAzKSAvIDRdLFxuICAgICAgICBbcmVjdGFuZ2xlLngsIHJlY3RhbmdsZS55ICsgcmVjdGFuZ2xlLmhlaWdodCAvIDRdLFxuICAgICAgICBbcmVjdGFuZ2xlLnggKyByZWN0YW5nbGUud2lkdGggLyA0LCByZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQgLyA0XVxuICAgIF07XG59O1xuIl19
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { PlaitBoard, RectangleClient, getNearestPointBetweenPointAndSegments, isPointInPolygon, setStrokeLinecap } from '@plait/core';
|
|
2
|
+
import { getEdgeOnPolygonByPoint } from '../utils/geometry';
|
|
3
|
+
export const DiamondEngine = {
|
|
4
|
+
draw(board, rectangle, options) {
|
|
5
|
+
const points = RectangleClient.getEdgeCenterPoints(rectangle);
|
|
6
|
+
const rs = PlaitBoard.getRoughSVG(board);
|
|
7
|
+
const polygon = rs.polygon(points, { ...options, fillStyle: 'solid' });
|
|
8
|
+
setStrokeLinecap(polygon, 'round');
|
|
9
|
+
return polygon;
|
|
10
|
+
},
|
|
11
|
+
isHit(rectangle, point) {
|
|
12
|
+
const controlPoints = RectangleClient.getEdgeCenterPoints(rectangle);
|
|
13
|
+
return isPointInPolygon(point, controlPoints);
|
|
14
|
+
},
|
|
15
|
+
getCornerPoints(rectangle) {
|
|
16
|
+
return RectangleClient.getEdgeCenterPoints(rectangle);
|
|
17
|
+
},
|
|
18
|
+
getNearestPoint(rectangle, point) {
|
|
19
|
+
return getNearestPointBetweenPointAndSegments(point, DiamondEngine.getCornerPoints(rectangle));
|
|
20
|
+
},
|
|
21
|
+
getEdgeByConnectionPoint(rectangle, pointOfRectangle) {
|
|
22
|
+
const corners = DiamondEngine.getCornerPoints(rectangle);
|
|
23
|
+
const point = RectangleClient.getConnectionPoint(rectangle, pointOfRectangle);
|
|
24
|
+
return getEdgeOnPolygonByPoint(corners, point);
|
|
25
|
+
},
|
|
26
|
+
getConnectorPoints(rectangle) {
|
|
27
|
+
return RectangleClient.getEdgeCenterPoints(rectangle);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbW9uZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL2VuZ2luZXMvZGlhbW9uZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsVUFBVSxFQUdWLGVBQWUsRUFDZixzQ0FBc0MsRUFDdEMsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNuQixNQUFNLGFBQWEsQ0FBQztBQUdyQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWdCO0lBQ3RDLElBQUksQ0FBQyxLQUFpQixFQUFFLFNBQTBCLEVBQUUsT0FBZ0I7UUFDaEUsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN2RSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkMsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUNELEtBQUssQ0FBQyxTQUEwQixFQUFFLEtBQVk7UUFDMUMsTUFBTSxhQUFhLEdBQUcsZUFBZSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxlQUFlLENBQUMsU0FBMEI7UUFDdEMsT0FBTyxlQUFlLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUNELGVBQWUsQ0FBQyxTQUEwQixFQUFFLEtBQVk7UUFDcEQsT0FBTyxzQ0FBc0MsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ25HLENBQUM7SUFDRCx3QkFBd0IsQ0FBQyxTQUEwQixFQUFFLGdCQUFrQztRQUNuRixNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUM5RSxPQUFPLHVCQUF1QixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0Qsa0JBQWtCLENBQUMsU0FBMEI7UUFDekMsT0FBTyxlQUFlLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUQsQ0FBQztDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIFBsYWl0Qm9hcmQsXG4gICAgUG9pbnQsXG4gICAgUG9pbnRPZlJlY3RhbmdsZSxcbiAgICBSZWN0YW5nbGVDbGllbnQsXG4gICAgZ2V0TmVhcmVzdFBvaW50QmV0d2VlblBvaW50QW5kU2VnbWVudHMsXG4gICAgaXNQb2ludEluUG9seWdvbixcbiAgICBzZXRTdHJva2VMaW5lY2FwXG59IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IFNoYXBlRW5naW5lIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAncm91Z2hqcy9iaW4vY29yZSc7XG5pbXBvcnQgeyBnZXRFZGdlT25Qb2x5Z29uQnlQb2ludCB9IGZyb20gJy4uL3V0aWxzL2dlb21ldHJ5JztcblxuZXhwb3J0IGNvbnN0IERpYW1vbmRFbmdpbmU6IFNoYXBlRW5naW5lID0ge1xuICAgIGRyYXcoYm9hcmQ6IFBsYWl0Qm9hcmQsIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IFJlY3RhbmdsZUNsaWVudC5nZXRFZGdlQ2VudGVyUG9pbnRzKHJlY3RhbmdsZSk7XG4gICAgICAgIGNvbnN0IHJzID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyhib2FyZCk7XG4gICAgICAgIGNvbnN0IHBvbHlnb24gPSBycy5wb2x5Z29uKHBvaW50cywgeyAuLi5vcHRpb25zLCBmaWxsU3R5bGU6ICdzb2xpZCcgfSk7XG4gICAgICAgIHNldFN0cm9rZUxpbmVjYXAocG9seWdvbiwgJ3JvdW5kJyk7XG4gICAgICAgIHJldHVybiBwb2x5Z29uO1xuICAgIH0sXG4gICAgaXNIaXQocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICBjb25zdCBjb250cm9sUG9pbnRzID0gUmVjdGFuZ2xlQ2xpZW50LmdldEVkZ2VDZW50ZXJQb2ludHMocmVjdGFuZ2xlKTtcbiAgICAgICAgcmV0dXJuIGlzUG9pbnRJblBvbHlnb24ocG9pbnQsIGNvbnRyb2xQb2ludHMpO1xuICAgIH0sXG4gICAgZ2V0Q29ybmVyUG9pbnRzKHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSB7XG4gICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuZ2V0RWRnZUNlbnRlclBvaW50cyhyZWN0YW5nbGUpO1xuICAgIH0sXG4gICAgZ2V0TmVhcmVzdFBvaW50KHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIGdldE5lYXJlc3RQb2ludEJldHdlZW5Qb2ludEFuZFNlZ21lbnRzKHBvaW50LCBEaWFtb25kRW5naW5lLmdldENvcm5lclBvaW50cyhyZWN0YW5nbGUpKTtcbiAgICB9LFxuICAgIGdldEVkZ2VCeUNvbm5lY3Rpb25Qb2ludChyZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgcG9pbnRPZlJlY3RhbmdsZTogUG9pbnRPZlJlY3RhbmdsZSk6IFtQb2ludCwgUG9pbnRdIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGNvcm5lcnMgPSBEaWFtb25kRW5naW5lLmdldENvcm5lclBvaW50cyhyZWN0YW5nbGUpO1xuICAgICAgICBjb25zdCBwb2ludCA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlLCBwb2ludE9mUmVjdGFuZ2xlKTtcbiAgICAgICAgcmV0dXJuIGdldEVkZ2VPblBvbHlnb25CeVBvaW50KGNvcm5lcnMsIHBvaW50KTtcbiAgICB9LFxuICAgIGdldENvbm5lY3RvclBvaW50cyhyZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmdldEVkZ2VDZW50ZXJQb2ludHMocmVjdGFuZ2xlKTtcbiAgICB9XG59O1xuIl19
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { PlaitBoard, RectangleClient, isPointInEllipse } from '@plait/core';
|
|
2
|
+
export const EllipseEngine = {
|
|
3
|
+
draw(board, rectangle, options) {
|
|
4
|
+
const centerPoint = [rectangle.x + rectangle.width / 2, rectangle.y + rectangle.height / 2];
|
|
5
|
+
const rs = PlaitBoard.getRoughSVG(board);
|
|
6
|
+
return rs.ellipse(centerPoint[0], centerPoint[1], rectangle.width, rectangle.height, { ...options, fillStyle: 'solid' });
|
|
7
|
+
},
|
|
8
|
+
isHit(rectangle, point) {
|
|
9
|
+
const centerPoint = [rectangle.x + rectangle.width / 2, rectangle.y + rectangle.height / 2];
|
|
10
|
+
return isPointInEllipse(point, centerPoint, rectangle.width / 2, rectangle.height / 2);
|
|
11
|
+
},
|
|
12
|
+
getCornerPoints(rectangle) {
|
|
13
|
+
return RectangleClient.getEdgeCenterPoints(rectangle);
|
|
14
|
+
},
|
|
15
|
+
getNearestPoint(rectangle, point) {
|
|
16
|
+
const centerPoint = [rectangle.x + rectangle.width / 2, rectangle.y + rectangle.height / 2];
|
|
17
|
+
return getNearestPointBetweenPointAndEllipse(point, centerPoint, rectangle.width / 2, rectangle.height / 2);
|
|
18
|
+
},
|
|
19
|
+
getTangentVectorByConnectionPoint(rectangle, pointOfRectangle) {
|
|
20
|
+
const connectionPoint = RectangleClient.getConnectionPoint(rectangle, pointOfRectangle);
|
|
21
|
+
const centerPoint = [rectangle.x + rectangle.width / 2, rectangle.y + rectangle.height / 2];
|
|
22
|
+
const point = [connectionPoint[0] - centerPoint[0], -(connectionPoint[1] - centerPoint[1])];
|
|
23
|
+
const a = rectangle.width / 2;
|
|
24
|
+
const b = rectangle.height / 2;
|
|
25
|
+
const slope = getTangentSlope(point[0], point[1], a, b);
|
|
26
|
+
return getVectorBySlope(point[0], point[1], slope);
|
|
27
|
+
},
|
|
28
|
+
getConnectorPoints(rectangle) {
|
|
29
|
+
return RectangleClient.getEdgeCenterPoints(rectangle);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
export function getNearestPointBetweenPointAndEllipse(point, center, rx, ry, rotation = 0) {
|
|
33
|
+
const rectangleClient = {
|
|
34
|
+
x: center[0] - rx,
|
|
35
|
+
y: center[1] - ry,
|
|
36
|
+
height: ry * 2,
|
|
37
|
+
width: rx * 2
|
|
38
|
+
};
|
|
39
|
+
// https://stackoverflow.com/a/46007540/232122
|
|
40
|
+
const px = Math.abs(point[0] - rectangleClient.x - rectangleClient.width / 2);
|
|
41
|
+
const py = Math.abs(point[1] - rectangleClient.y - rectangleClient.height / 2);
|
|
42
|
+
let tx = 0.707;
|
|
43
|
+
let ty = 0.707;
|
|
44
|
+
const a = Math.abs(rectangleClient.width) / 2;
|
|
45
|
+
const b = Math.abs(rectangleClient.height) / 2;
|
|
46
|
+
[0, 1, 2, 3].forEach(x => {
|
|
47
|
+
const xx = a * tx;
|
|
48
|
+
const yy = b * ty;
|
|
49
|
+
const ex = ((a * a - b * b) * tx ** 3) / a;
|
|
50
|
+
const ey = ((b * b - a * a) * ty ** 3) / b;
|
|
51
|
+
const rx = xx - ex;
|
|
52
|
+
const ry = yy - ey;
|
|
53
|
+
const qx = px - ex;
|
|
54
|
+
const qy = py - ey;
|
|
55
|
+
const r = Math.hypot(ry, rx);
|
|
56
|
+
const q = Math.hypot(qy, qx);
|
|
57
|
+
tx = Math.min(1, Math.max(0, ((qx * r) / q + ex) / a));
|
|
58
|
+
ty = Math.min(1, Math.max(0, ((qy * r) / q + ey) / b));
|
|
59
|
+
const t = Math.hypot(ty, tx);
|
|
60
|
+
tx /= t;
|
|
61
|
+
ty /= t;
|
|
62
|
+
});
|
|
63
|
+
const signX = point[0] > center[0] ? 1 : -1;
|
|
64
|
+
const signY = point[1] > center[1] ? 1 : -1;
|
|
65
|
+
return [center[0] + a * tx * signX, center[1] + b * ty * signY];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* the result of slope is based on Cartesian coordinate system
|
|
69
|
+
* x, y are based on the position in the Cartesian coordinate system
|
|
70
|
+
*/
|
|
71
|
+
function getTangentSlope(x, y, a, b) {
|
|
72
|
+
const k = (-b * b * x) / (a * a * y);
|
|
73
|
+
return k;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* x, y are based on the position in the Cartesian coordinate system
|
|
77
|
+
*/
|
|
78
|
+
function getVectorBySlope(x, y, slope) {
|
|
79
|
+
const deltaX = 30;
|
|
80
|
+
const deltaY = -slope * deltaX;
|
|
81
|
+
let start = [0 - deltaX, 0 - deltaY];
|
|
82
|
+
let end = [0 + deltaX, 0 + deltaY];
|
|
83
|
+
// y < 0 acts on the lower half of the x-axis, with the starting point at the top and the end point at the bottom.
|
|
84
|
+
if (y < 0) {
|
|
85
|
+
const temp = start;
|
|
86
|
+
start = end;
|
|
87
|
+
end = temp;
|
|
88
|
+
}
|
|
89
|
+
const vector = [end[0] - start[0], end[1] - start[1]];
|
|
90
|
+
return vector;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxsaXBzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL2VuZ2luZXMvZWxsaXBzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUEyQixlQUFlLEVBQVUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJN0csTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFnQjtJQUN0QyxJQUFJLENBQUMsS0FBaUIsRUFBRSxTQUEwQixFQUFFLE9BQWdCO1FBQ2hFLE1BQU0sV0FBVyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUYsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM3SCxDQUFDO0lBQ0QsS0FBSyxDQUFDLFNBQTBCLEVBQUUsS0FBWTtRQUMxQyxNQUFNLFdBQVcsR0FBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25HLE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLENB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RSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1IsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTVDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZUFBZSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7SUFDL0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxDQUFDO0FBQ2IsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEtBQWE7SUFDekQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztJQUMvQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBVSxDQUFDO0lBQzlDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFVLENBQUM7SUFDNUMsa0hBQWtIO0lBRWxILElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNQLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNuQixLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ1osR0FBRyxHQUFHLElBQUksQ0FBQztLQUNkO0lBQ0QsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQVcsQ0FBQztJQUNoRSxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCwgUG9pbnQsIFBvaW50T2ZSZWN0YW5nbGUsIFJlY3RhbmdsZUNsaWVudCwgVmVjdG9yLCBpc1BvaW50SW5FbGxpcHNlIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgU2hhcGVFbmdpbmUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICdyb3VnaGpzL2Jpbi9jb3JlJztcblxuZXhwb3J0IGNvbnN0IEVsbGlwc2VFbmdpbmU6IFNoYXBlRW5naW5lID0ge1xuICAgIGRyYXcoYm9hcmQ6IFBsYWl0Qm9hcmQsIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNlbnRlclBvaW50ID0gW3JlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoIC8gMiwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0IC8gMl07XG4gICAgICAgIGNvbnN0IHJzID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyhib2FyZCk7XG4gICAgICAgIHJldHVybiBycy5lbGxpcHNlKGNlbnRlclBvaW50WzBdLCBjZW50ZXJQb2ludFsxXSwgcmVjdGFuZ2xlLndpZHRoLCByZWN0YW5nbGUuaGVpZ2h0LCB7IC4uLm9wdGlvbnMsIGZpbGxTdHlsZTogJ3NvbGlkJyB9KTtcbiAgICB9LFxuICAgIGlzSGl0KHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgY29uc3QgY2VudGVyUG9pbnQ6IFBvaW50ID0gW3JlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoIC8gMiwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0IC8gMl07XG4gICAgICAgIHJldHVybiBpc1BvaW50SW5FbGxpcHNlKHBvaW50LCBjZW50ZXJQb2ludCwgcmVjdGFuZ2xlLndpZHRoIC8gMiwgcmVjdGFuZ2xlLmhlaWdodCAvIDIpO1xuICAgIH0sXG4gICAgZ2V0Q29ybmVyUG9pbnRzKHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSB7XG4gICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuZ2V0RWRnZUNlbnRlclBvaW50cyhyZWN0YW5nbGUpO1xuICAgIH0sXG4gICAgZ2V0TmVhcmVzdFBvaW50KHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgY29uc3QgY2VudGVyUG9pbnQ6IFBvaW50ID0gW3JlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoIC8gMiwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0IC8gMl07XG4gICAgICAgIHJldHVybiBnZXROZWFyZXN0UG9pbnRCZXR3ZWVuUG9pbnRBbmRFbGxpcHNlKHBvaW50LCBjZW50ZXJQb2ludCwgcmVjdGFuZ2xlLndpZHRoIC8gMiwgcmVjdGFuZ2xlLmhlaWdodCAvIDIpO1xuICAgIH0sXG4gICAgZ2V0VGFuZ2VudFZlY3RvckJ5Q29ubmVjdGlvblBvaW50KHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBwb2ludE9mUmVjdGFuZ2xlOiBQb2ludE9mUmVjdGFuZ2xlKSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25Qb2ludCA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlLCBwb2ludE9mUmVjdGFuZ2xlKTtcbiAgICAgICAgY29uc3QgY2VudGVyUG9pbnQ6IFBvaW50ID0gW3JlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoIC8gMiwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0IC8gMl07XG4gICAgICAgIGNvbnN0IHBvaW50ID0gW2Nvbm5lY3Rpb25Qb2ludFswXSAtIGNlbnRlclBvaW50WzBdLCAtKGNvbm5lY3Rpb25Qb2ludFsxXSAtIGNlbnRlclBvaW50WzFdKV07XG4gICAgICAgIGNvbnN0IGEgPSByZWN0YW5nbGUud2lkdGggLyAyO1xuICAgICAgICBjb25zdCBiID0gcmVjdGFuZ2xlLmhlaWdodCAvIDI7XG4gICAgICAgIGNvbnN0IHNsb3BlID0gZ2V0VGFuZ2VudFNsb3BlKHBvaW50WzBdLCBwb2ludFsxXSwgYSwgYikgYXMgYW55O1xuICAgICAgICByZXR1cm4gZ2V0VmVjdG9yQnlTbG9wZShwb2ludFswXSwgcG9pbnRbMV0sIHNsb3BlKTtcbiAgICB9LFxuICAgIGdldENvbm5lY3RvclBvaW50cyhyZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmdldEVkZ2VDZW50ZXJQb2ludHMocmVjdGFuZ2xlKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVhcmVzdFBvaW50QmV0d2VlblBvaW50QW5kRWxsaXBzZShwb2ludDogUG9pbnQsIGNlbnRlcjogUG9pbnQsIHJ4OiBudW1iZXIsIHJ5OiBudW1iZXIsIHJvdGF0aW9uOiBudW1iZXIgPSAwKTogUG9pbnQge1xuICAgIGNvbnN0IHJlY3RhbmdsZUNsaWVudCA9IHtcbiAgICAgICAgeDogY2VudGVyWzBdIC0gcngsXG4gICAgICAgIHk6IGNlbnRlclsxXSAtIHJ5LFxuICAgICAgICBoZWlnaHQ6IHJ5ICogMixcbiAgICAgICAgd2lkdGg6IHJ4ICogMlxuICAgIH07XG4gICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2MDA3NTQwLzIzMjEyMlxuICAgIGNvbnN0IHB4ID0gTWF0aC5hYnMocG9pbnRbMF0gLSByZWN0YW5nbGVDbGllbnQueCAtIHJlY3RhbmdsZUNsaWVudC53aWR0aCAvIDIpO1xuICAgIGNvbnN0IHB5ID0gTWF0aC5hYnMocG9pbnRbMV0gLSByZWN0YW5nbGVDbGllbnQueSAtIHJlY3RhbmdsZUNsaWVudC5oZWlnaHQgLyAyKTtcblxuICAgIGxldCB0eCA9IDAuNzA3O1xuICAgIGxldCB0eSA9IDAuNzA3O1xuXG4gICAgY29uc3QgYSA9IE1hdGguYWJzKHJlY3RhbmdsZUNsaWVudC53aWR0aCkgLyAyO1xuICAgIGNvbnN0IGIgPSBNYXRoLmFicyhyZWN0YW5nbGVDbGllbnQuaGVpZ2h0KSAvIDI7XG5cbiAgICBbMCwgMSwgMiwgM10uZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgY29uc3QgeHggPSBhICogdHg7XG4gICAgICAgIGNvbnN0IHl5ID0gYiAqIHR5O1xuXG4gICAgICAgIGNvbnN0IGV4ID0gKChhICogYSAtIGIgKiBiKSAqIHR4ICoqIDMpIC8gYTtcbiAgICAgICAgY29uc3QgZXkgPSAoKGIgKiBiIC0gYSAqIGEpICogdHkgKiogMykgLyBiO1xuXG4gICAgICAgIGNvbnN0IHJ4ID0geHggLSBleDtcbiAgICAgICAgY29uc3QgcnkgPSB5eSAtIGV5O1xuXG4gICAgICAgIGNvbnN0IHF4ID0gcHggLSBleDtcbiAgICAgICAgY29uc3QgcXkgPSBweSAtIGV5O1xuXG4gICAgICAgIGNvbnN0IHIgPSBNYXRoLmh5cG90KHJ5LCByeCk7XG4gICAgICAgIGNvbnN0IHEgPSBNYXRoLmh5cG90KHF5LCBxeCk7XG5cbiAgICAgICAgdHggPSBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCAoKHF4ICogcikgLyBxICsgZXgpIC8gYSkpO1xuICAgICAgICB0eSA9IE1hdGgubWluKDEsIE1hdGgubWF4KDAsICgocXkgKiByKSAvIHEgKyBleSkgLyBiKSk7XG4gICAgICAgIGNvbnN0IHQgPSBNYXRoLmh5cG90KHR5LCB0eCk7XG4gICAgICAgIHR4IC89IHQ7XG4gICAgICAgIHR5IC89IHQ7XG4gICAgfSk7XG4gICAgY29uc3Qgc2lnblggPSBwb2ludFswXSA+IGNlbnRlclswXSA/IDEgOiAtMTtcbiAgICBjb25zdCBzaWduWSA9IHBvaW50WzFdID4gY2VudGVyWzFdID8gMSA6IC0xO1xuXG4gICAgcmV0dXJuIFtjZW50ZXJbMF0gKyBhICogdHggKiBzaWduWCwgY2VudGVyWzFdICsgYiAqIHR5ICogc2lnblldO1xufVxuXG4vKipcbiAqIHRoZSByZXN1bHQgb2Ygc2xvcGUgaXMgYmFzZWQgb24gQ2FydGVzaWFuIGNvb3JkaW5hdGUgc3lzdGVtXG4gKiB4LCB5IGFyZSBiYXNlZCBvbiB0aGUgcG9zaXRpb24gaW4gdGhlIENhcnRlc2lhbiBjb29yZGluYXRlIHN5c3RlbVxuICovXG5mdW5jdGlvbiBnZXRUYW5nZW50U2xvcGUoeDogbnVtYmVyLCB5OiBudW1iZXIsIGE6IG51bWJlciwgYjogbnVtYmVyKSB7XG4gICAgY29uc3QgayA9ICgtYiAqIGIgKiB4KSAvIChhICogYSAqIHkpO1xuICAgIHJldHVybiBrO1xufVxuXG4vKipcbiAqIHgsIHkgYXJlIGJhc2VkIG9uIHRoZSBwb3NpdGlvbiBpbiB0aGUgQ2FydGVzaWFuIGNvb3JkaW5hdGUgc3lzdGVtXG4gKi9cbmZ1bmN0aW9uIGdldFZlY3RvckJ5U2xvcGUoeDogbnVtYmVyLCB5OiBudW1iZXIsIHNsb3BlOiBudW1iZXIpIHtcbiAgICBjb25zdCBkZWx0YVggPSAzMDtcbiAgICBjb25zdCBkZWx0YVkgPSAtc2xvcGUgKiBkZWx0YVg7XG4gICAgbGV0IHN0YXJ0ID0gWzAgLSBkZWx0YVgsIDAgLSBkZWx0YVldIGFzIFBvaW50O1xuICAgIGxldCBlbmQgPSBbMCArIGRlbHRhWCwgMCArIGRlbHRhWV0gYXMgUG9pbnQ7XG4gICAgLy8geSA8IDAgYWN0cyBvbiB0aGUgbG93ZXIgaGFsZiBvZiB0aGUgeC1heGlzLCB3aXRoIHRoZSBzdGFydGluZyBwb2ludCBhdCB0aGUgdG9wIGFuZCB0aGUgZW5kIHBvaW50IGF0IHRoZSBib3R0b20uXG4gICAgXG4gICAgaWYgKHkgPCAwKSB7XG4gICAgICAgIGNvbnN0IHRlbXAgPSBzdGFydDtcbiAgICAgICAgc3RhcnQgPSBlbmQ7XG4gICAgICAgIGVuZCA9IHRlbXA7XG4gICAgfVxuICAgIGNvbnN0IHZlY3RvciA9IFtlbmRbMF0gLSBzdGFydFswXSwgZW5kWzFdIC0gc3RhcnRbMV1dIGFzIFZlY3RvcjtcbiAgICByZXR1cm4gdmVjdG9yO1xufVxuIl19
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { PlaitBoard, RectangleClient, getNearestPointBetweenPointAndSegments, isPointInPolygon, setStrokeLinecap } from '@plait/core';
|
|
2
|
+
import { getEdgeOnPolygonByPoint } from '../utils/geometry';
|
|
3
|
+
export const HexagonEngine = {
|
|
4
|
+
draw(board, rectangle, options) {
|
|
5
|
+
const points = getHexagonPoints(rectangle);
|
|
6
|
+
const rs = PlaitBoard.getRoughSVG(board);
|
|
7
|
+
const polygon = rs.polygon(points, { ...options, fillStyle: 'solid' });
|
|
8
|
+
setStrokeLinecap(polygon, 'round');
|
|
9
|
+
return polygon;
|
|
10
|
+
},
|
|
11
|
+
isHit(rectangle, point) {
|
|
12
|
+
const parallelogramPoints = getHexagonPoints(rectangle);
|
|
13
|
+
return isPointInPolygon(point, parallelogramPoints);
|
|
14
|
+
},
|
|
15
|
+
getCornerPoints(rectangle) {
|
|
16
|
+
return getHexagonPoints(rectangle);
|
|
17
|
+
},
|
|
18
|
+
getNearestPoint(rectangle, point) {
|
|
19
|
+
return getNearestPointBetweenPointAndSegments(point, getHexagonPoints(rectangle));
|
|
20
|
+
},
|
|
21
|
+
getEdgeByConnectionPoint(rectangle, pointOfRectangle) {
|
|
22
|
+
const corners = getHexagonPoints(rectangle);
|
|
23
|
+
const point = RectangleClient.getConnectionPoint(rectangle, pointOfRectangle);
|
|
24
|
+
return getEdgeOnPolygonByPoint(corners, point);
|
|
25
|
+
},
|
|
26
|
+
getConnectorPoints(rectangle) {
|
|
27
|
+
return RectangleClient.getEdgeCenterPoints(rectangle);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
export const getHexagonPoints = (rectangle) => {
|
|
31
|
+
return [
|
|
32
|
+
[rectangle.x + rectangle.width / 4, rectangle.y],
|
|
33
|
+
[rectangle.x + (rectangle.width * 3) / 4, rectangle.y],
|
|
34
|
+
[rectangle.x + rectangle.width, rectangle.y + rectangle.height / 2],
|
|
35
|
+
[rectangle.x + (rectangle.width * 3) / 4, rectangle.y + rectangle.height],
|
|
36
|
+
[rectangle.x + rectangle.width / 4, rectangle.y + rectangle.height],
|
|
37
|
+
[rectangle.x, rectangle.y + rectangle.height / 2]
|
|
38
|
+
];
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGV4YWdvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL2VuZ2luZXMvaGV4YWdvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsVUFBVSxFQUdWLGVBQWUsRUFDZixzQ0FBc0MsRUFDdEMsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNuQixNQUFNLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQTRCLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHdEYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFnQjtJQUN0QyxJQUFJLENBQUMsS0FBaUIsRUFBRSxTQUEwQixFQUFFLE9BQWdCO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN2RSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkMsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUNELEtBQUssQ0FBQyxTQUEwQixFQUFFLEtBQVk7UUFDMUMsTUFBTSxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RCxPQUFPLGdCQUFnQixDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRCxlQUFlLENBQUMsU0FBMEI7UUFDdEMsT0FBTyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsZUFBZSxDQUFDLFNBQTBCLEVBQUUsS0FBWTtRQUNwRCxPQUFPLHNDQUFzQyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFDRCx3QkFBd0IsQ0FBQyxTQUEwQixFQUFFLGdCQUFrQztRQUNuRixNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDOUUsT0FBTyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELGtCQUFrQixDQUFDLFNBQTBCO1FBQ3pDLE9BQU8sZUFBZSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFELENBQUM7Q0FDSixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxTQUEwQixFQUFXLEVBQUU7SUFDcEUsT0FBTztRQUNILENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNuRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDekUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUNuRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztLQUNwRCxDQUFDO0FBQ04sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBQbGFpdEJvYXJkLFxuICAgIFBvaW50LFxuICAgIFBvaW50T2ZSZWN0YW5nbGUsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIGdldE5lYXJlc3RQb2ludEJldHdlZW5Qb2ludEFuZFNlZ21lbnRzLFxuICAgIGlzUG9pbnRJblBvbHlnb24sXG4gICAgc2V0U3Ryb2tlTGluZWNhcFxufSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBTaGFwZUVuZ2luZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZ2V0Q2VudGVyUG9pbnRzT25Qb2x5Z29uLCBnZXRFZGdlT25Qb2x5Z29uQnlQb2ludCB9IGZyb20gJy4uL3V0aWxzL2dlb21ldHJ5JztcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICdyb3VnaGpzL2Jpbi9jb3JlJztcblxuZXhwb3J0IGNvbnN0IEhleGFnb25FbmdpbmU6IFNoYXBlRW5naW5lID0ge1xuICAgIGRyYXcoYm9hcmQ6IFBsYWl0Qm9hcmQsIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGdldEhleGFnb25Qb2ludHMocmVjdGFuZ2xlKTtcbiAgICAgICAgY29uc3QgcnMgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKTtcbiAgICAgICAgY29uc3QgcG9seWdvbiA9IHJzLnBvbHlnb24ocG9pbnRzLCB7IC4uLm9wdGlvbnMsIGZpbGxTdHlsZTogJ3NvbGlkJyB9KTtcbiAgICAgICAgc2V0U3Ryb2tlTGluZWNhcChwb2x5Z29uLCAncm91bmQnKTtcbiAgICAgICAgcmV0dXJuIHBvbHlnb247XG4gICAgfSxcbiAgICBpc0hpdChyZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgcG9pbnQ6IFBvaW50KSB7XG4gICAgICAgIGNvbnN0IHBhcmFsbGVsb2dyYW1Qb2ludHMgPSBnZXRIZXhhZ29uUG9pbnRzKHJlY3RhbmdsZSk7XG4gICAgICAgIHJldHVybiBpc1BvaW50SW5Qb2x5Z29uKHBvaW50LCBwYXJhbGxlbG9ncmFtUG9pbnRzKTtcbiAgICB9LFxuICAgIGdldENvcm5lclBvaW50cyhyZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgICAgICByZXR1cm4gZ2V0SGV4YWdvblBvaW50cyhyZWN0YW5nbGUpO1xuICAgIH0sXG4gICAgZ2V0TmVhcmVzdFBvaW50KHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIGdldE5lYXJlc3RQb2ludEJldHdlZW5Qb2ludEFuZFNlZ21lbnRzKHBvaW50LCBnZXRIZXhhZ29uUG9pbnRzKHJlY3RhbmdsZSkpO1xuICAgIH0sXG4gICAgZ2V0RWRnZUJ5Q29ubmVjdGlvblBvaW50KHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBwb2ludE9mUmVjdGFuZ2xlOiBQb2ludE9mUmVjdGFuZ2xlKTogW1BvaW50LCBQb2ludF0gfCBudWxsIHtcbiAgICAgICAgY29uc3QgY29ybmVycyA9IGdldEhleGFnb25Qb2ludHMocmVjdGFuZ2xlKTtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBSZWN0YW5nbGVDbGllbnQuZ2V0Q29ubmVjdGlvblBvaW50KHJlY3RhbmdsZSwgcG9pbnRPZlJlY3RhbmdsZSk7XG4gICAgICAgIHJldHVybiBnZXRFZGdlT25Qb2x5Z29uQnlQb2ludChjb3JuZXJzLCBwb2ludCk7XG4gICAgfSxcbiAgICBnZXRDb25uZWN0b3JQb2ludHMocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQpIHtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5nZXRFZGdlQ2VudGVyUG9pbnRzKHJlY3RhbmdsZSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEhleGFnb25Qb2ludHMgPSAocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQpOiBQb2ludFtdID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgICBbcmVjdGFuZ2xlLnggKyByZWN0YW5nbGUud2lkdGggLyA0LCByZWN0YW5nbGUueV0sXG4gICAgICAgIFtyZWN0YW5nbGUueCArIChyZWN0YW5nbGUud2lkdGggKiAzKSAvIDQsIHJlY3RhbmdsZS55XSxcbiAgICAgICAgW3JlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoLCByZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQgLyAyXSxcbiAgICAgICAgW3JlY3RhbmdsZS54ICsgKHJlY3RhbmdsZS53aWR0aCAqIDMpIC8gNCwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0XSxcbiAgICAgICAgW3JlY3RhbmdsZS54ICsgcmVjdGFuZ2xlLndpZHRoIC8gNCwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0XSxcbiAgICAgICAgW3JlY3RhbmdsZS54LCByZWN0YW5nbGUueSArIHJlY3RhbmdsZS5oZWlnaHQgLyAyXVxuICAgIF07XG59O1xuIl19
|