FIx elbow arrow routing at rounded diamond edge

This commit is contained in:
Mark Tolmacs 2025-04-06 17:22:22 +02:00
parent 02eaec34eb
commit ae3cc10b03

View file

@ -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
const top = pointFromVector(
vectorScale(
vectorFromPoint(
pointRotateRads(
pointFrom<GlobalPoint>(element.x + element.width / 2, element.y), pointFrom<GlobalPoint>(element.x + element.width / 2, element.y),
midPoint, midPoint,
element.angle, element.angle,
),
midPoint,
),
SHRINK,
),
midPoint,
); );
const right = pointRotateRads( const right = pointFromVector(
vectorScale(
vectorFromPoint(
pointRotateRads(
pointFrom<GlobalPoint>( pointFrom<GlobalPoint>(
element.x + element.width, element.x + element.width,
element.y + element.height / 2, element.y + element.height / 2,
), ),
midPoint, midPoint,
element.angle, element.angle,
),
midPoint,
),
SHRINK,
),
midPoint,
); );
const bottom = pointRotateRads( const bottom = pointFromVector(
vectorScale(
vectorFromPoint(
pointRotateRads(
pointFrom<GlobalPoint>( pointFrom<GlobalPoint>(
element.x + element.width / 2, element.x + element.width / 2,
element.y + element.height, element.y + element.height,
), ),
midPoint, midPoint,
element.angle, element.angle,
),
midPoint,
),
SHRINK,
),
midPoint,
); );
const left = pointRotateRads( const left = pointFromVector(
vectorScale(
vectorFromPoint(
pointRotateRads(
pointFrom<GlobalPoint>(element.x, element.y + element.height / 2), pointFrom<GlobalPoint>(element.x, element.y + element.height / 2),
midPoint, midPoint,
element.angle, element.angle,
),
midPoint,
),
SHRINK,
),
midPoint,
); );
// Corners // Corners