mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-05-03 10:00:07 -04:00
FIx elbow arrow routing at rounded diamond edge
This commit is contained in:
parent
02eaec34eb
commit
ae3cc10b03
1 changed files with 57 additions and 36 deletions
|
@ -2,12 +2,14 @@ import { invariant, isDevEnv, isTestEnv } from "@excalidraw/common";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
pointFrom,
|
pointFrom,
|
||||||
|
pointFromVector,
|
||||||
pointRotateRads,
|
pointRotateRads,
|
||||||
pointScaleFromOrigin,
|
pointScaleFromOrigin,
|
||||||
pointsEqual,
|
pointsEqual,
|
||||||
triangleIncludesPoint,
|
triangleIncludesPoint,
|
||||||
vectorCross,
|
vectorCross,
|
||||||
vectorFromPoint,
|
vectorFromPoint,
|
||||||
|
vectorScale,
|
||||||
} from "@excalidraw/math";
|
} from "@excalidraw/math";
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
|
@ -27,24 +29,6 @@ export const HEADING_LEFT = [-1, 0] as Heading;
|
||||||
export const HEADING_UP = [0, -1] as Heading;
|
export const HEADING_UP = [0, -1] as Heading;
|
||||||
export type Heading = [1, 0] | [0, 1] | [-1, 0] | [0, -1];
|
export type Heading = [1, 0] | [0, 1] | [-1, 0] | [0, -1];
|
||||||
|
|
||||||
// export const headingForDiamond = <Point extends GlobalPoint | LocalPoint>(
|
|
||||||
// a: Point,
|
|
||||||
// b: Point,
|
|
||||||
// ) => {
|
|
||||||
// const angle = radiansToDegrees(
|
|
||||||
// normalizeRadians(Math.atan2(b[1] - a[1], b[0] - a[0]) as Radians),
|
|
||||||
// );
|
|
||||||
|
|
||||||
// if (angle >= 315 || angle < 45) {
|
|
||||||
// return HEADING_UP;
|
|
||||||
// } else if (angle >= 45 && angle < 135) {
|
|
||||||
// return HEADING_RIGHT;
|
|
||||||
// } else if (angle >= 135 && angle < 225) {
|
|
||||||
// return HEADING_DOWN;
|
|
||||||
// }
|
|
||||||
// return HEADING_LEFT;
|
|
||||||
// };
|
|
||||||
|
|
||||||
export const vectorToHeading = (vec: Vector): Heading => {
|
export const vectorToHeading = (vec: Vector): Heading => {
|
||||||
const [x, y] = vec;
|
const [x, y] = vec;
|
||||||
const absX = Math.abs(x);
|
const absX = Math.abs(x);
|
||||||
|
@ -95,31 +79,68 @@ const headingForPointFromDiamondElement = (
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const top = pointRotateRads(
|
const SHRINK = 0.95; // Rounded elements tolerance
|
||||||
pointFrom<GlobalPoint>(element.x + element.width / 2, element.y),
|
const top = pointFromVector(
|
||||||
midPoint,
|
vectorScale(
|
||||||
element.angle,
|
vectorFromPoint(
|
||||||
);
|
pointRotateRads(
|
||||||
const right = pointRotateRads(
|
pointFrom<GlobalPoint>(element.x + element.width / 2, element.y),
|
||||||
pointFrom<GlobalPoint>(
|
midPoint,
|
||||||
element.x + element.width,
|
element.angle,
|
||||||
element.y + element.height / 2,
|
),
|
||||||
|
midPoint,
|
||||||
|
),
|
||||||
|
SHRINK,
|
||||||
),
|
),
|
||||||
midPoint,
|
midPoint,
|
||||||
element.angle,
|
|
||||||
);
|
);
|
||||||
const bottom = pointRotateRads(
|
const right = pointFromVector(
|
||||||
pointFrom<GlobalPoint>(
|
vectorScale(
|
||||||
element.x + element.width / 2,
|
vectorFromPoint(
|
||||||
element.y + element.height,
|
pointRotateRads(
|
||||||
|
pointFrom<GlobalPoint>(
|
||||||
|
element.x + element.width,
|
||||||
|
element.y + element.height / 2,
|
||||||
|
),
|
||||||
|
midPoint,
|
||||||
|
element.angle,
|
||||||
|
),
|
||||||
|
midPoint,
|
||||||
|
),
|
||||||
|
SHRINK,
|
||||||
),
|
),
|
||||||
midPoint,
|
midPoint,
|
||||||
element.angle,
|
|
||||||
);
|
);
|
||||||
const left = pointRotateRads(
|
const bottom = pointFromVector(
|
||||||
pointFrom<GlobalPoint>(element.x, element.y + element.height / 2),
|
vectorScale(
|
||||||
|
vectorFromPoint(
|
||||||
|
pointRotateRads(
|
||||||
|
pointFrom<GlobalPoint>(
|
||||||
|
element.x + element.width / 2,
|
||||||
|
element.y + element.height,
|
||||||
|
),
|
||||||
|
midPoint,
|
||||||
|
element.angle,
|
||||||
|
),
|
||||||
|
midPoint,
|
||||||
|
),
|
||||||
|
SHRINK,
|
||||||
|
),
|
||||||
|
midPoint,
|
||||||
|
);
|
||||||
|
const left = pointFromVector(
|
||||||
|
vectorScale(
|
||||||
|
vectorFromPoint(
|
||||||
|
pointRotateRads(
|
||||||
|
pointFrom<GlobalPoint>(element.x, element.y + element.height / 2),
|
||||||
|
midPoint,
|
||||||
|
element.angle,
|
||||||
|
),
|
||||||
|
midPoint,
|
||||||
|
),
|
||||||
|
SHRINK,
|
||||||
|
),
|
||||||
midPoint,
|
midPoint,
|
||||||
element.angle,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Corners
|
// Corners
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue