mirror of
				https://github.com/excalidraw/excalidraw.git
				synced 2025-11-04 04:44:31 +01:00 
			
		
		
		
	feat: Elbow arrow segment fixing & positioning (#8952)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com> Co-authored-by: David Luzar <5153846+dwelle@users.noreply.github.com>
This commit is contained in:
		@@ -1,4 +1,4 @@
 | 
			
		||||
import { pointCenter, pointRotateRads } from "./point";
 | 
			
		||||
import { pointCenter, pointFrom, pointRotateRads } from "./point";
 | 
			
		||||
import type { GlobalPoint, Line, LocalPoint, Radians } from "./types";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -38,8 +38,16 @@ export function lineFromPointArray<P extends GlobalPoint | LocalPoint>(
 | 
			
		||||
    : undefined;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// return the coordinates resulting from rotating the given line about an origin by an angle in degrees
 | 
			
		||||
// note that when the origin is not given, the midpoint of the given line is used as the origin
 | 
			
		||||
/**
 | 
			
		||||
 * Return the coordinates resulting from rotating the given line about an
 | 
			
		||||
 * origin by an angle in degrees note that when the origin is not given,
 | 
			
		||||
 * the midpoint of the given line is used as the origin
 | 
			
		||||
 *
 | 
			
		||||
 * @param l
 | 
			
		||||
 * @param angle
 | 
			
		||||
 * @param origin
 | 
			
		||||
 * @returns
 | 
			
		||||
 */
 | 
			
		||||
export const lineRotate = <Point extends LocalPoint | GlobalPoint>(
 | 
			
		||||
  l: Line<Point>,
 | 
			
		||||
  angle: Radians,
 | 
			
		||||
@@ -50,3 +58,29 @@ export const lineRotate = <Point extends LocalPoint | GlobalPoint>(
 | 
			
		||||
    pointRotateRads(l[1], origin || pointCenter(l[0], l[1]), angle),
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Determines the intersection point (unless the lines are parallel) of two
 | 
			
		||||
 * lines
 | 
			
		||||
 *
 | 
			
		||||
 * @param a
 | 
			
		||||
 * @param b
 | 
			
		||||
 * @returns
 | 
			
		||||
 */
 | 
			
		||||
export const linesIntersectAt = <Point extends GlobalPoint | LocalPoint>(
 | 
			
		||||
  a: Line<Point>,
 | 
			
		||||
  b: Line<Point>,
 | 
			
		||||
): Point | null => {
 | 
			
		||||
  const A1 = a[1][1] - a[0][1];
 | 
			
		||||
  const B1 = a[0][0] - a[1][0];
 | 
			
		||||
  const A2 = b[1][1] - b[0][1];
 | 
			
		||||
  const B2 = b[0][0] - b[1][0];
 | 
			
		||||
  const D = A1 * B2 - A2 * B1;
 | 
			
		||||
  if (D !== 0) {
 | 
			
		||||
    const C1 = A1 * a[0][0] + B1 * a[0][1];
 | 
			
		||||
    const C2 = A2 * b[0][0] + B2 * b[0][1];
 | 
			
		||||
    return pointFrom<Point>((C1 * B2 - C2 * B1) / D, (A1 * C2 - A2 * C1) / D);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return null;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -61,6 +61,22 @@ export function pointFromVector<P extends GlobalPoint | LocalPoint>(
 | 
			
		||||
  return v as unknown as P;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Convert the coordiante object to a point.
 | 
			
		||||
 *
 | 
			
		||||
 * @param coords The coordinate object with x and y properties
 | 
			
		||||
 * @returns
 | 
			
		||||
 */
 | 
			
		||||
export function pointFromCoords<Point extends GlobalPoint | LocalPoint>({
 | 
			
		||||
  x,
 | 
			
		||||
  y,
 | 
			
		||||
}: {
 | 
			
		||||
  x: number;
 | 
			
		||||
  y: number;
 | 
			
		||||
}) {
 | 
			
		||||
  return [x, y] as Point;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Checks if the provided value has the shape of a Point.
 | 
			
		||||
 *
 | 
			
		||||
@@ -217,7 +233,10 @@ export function pointDistanceSq<P extends LocalPoint | GlobalPoint>(
 | 
			
		||||
  a: P,
 | 
			
		||||
  b: P,
 | 
			
		||||
): number {
 | 
			
		||||
  return Math.hypot(b[0] - a[0], b[1] - a[1]);
 | 
			
		||||
  const xDiff = b[0] - a[0];
 | 
			
		||||
  const yDiff = b[1] - a[1];
 | 
			
		||||
 | 
			
		||||
  return xDiff * xDiff + yDiff * yDiff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user