mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-05-03 10:00:07 -04:00
chore: Unify math types, utils and functions (#8389)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
This commit is contained in:
parent
e3d1dee9d0
commit
f4dd23fc31
98 changed files with 4291 additions and 3661 deletions
52
packages/math/ga/galines.ts
Normal file
52
packages/math/ga/galines.ts
Normal file
|
@ -0,0 +1,52 @@
|
|||
import * as GA from "./ga";
|
||||
import type { Line, Point } from "./ga";
|
||||
|
||||
/**
|
||||
* A line is stored as an array `[0, c, a, b, 0, 0, 0, 0]` representing:
|
||||
* c * e0 + a * e1 + b*e2
|
||||
*
|
||||
* This maps to a standard formula `a * x + b * y + c`.
|
||||
*
|
||||
* `(-b, a)` corresponds to a 2D vector parallel to the line. The lines
|
||||
* have a natural orientation, corresponding to that vector.
|
||||
*
|
||||
* The magnitude ("norm") of the line is `sqrt(a ^ 2 + b ^ 2)`.
|
||||
* `c / norm(line)` is the oriented distance from line to origin.
|
||||
*/
|
||||
|
||||
// Returns line with direction (x, y) through origin
|
||||
export const vector = (x: number, y: number): Line =>
|
||||
GA.normalized([0, 0, -y, x, 0, 0, 0, 0]);
|
||||
|
||||
// For equation ax + by + c = 0.
|
||||
export const equation = (a: number, b: number, c: number): Line =>
|
||||
GA.normalized([0, c, a, b, 0, 0, 0, 0]);
|
||||
|
||||
export const through = (from: Point, to: Point): Line =>
|
||||
GA.normalized(GA.join(to, from));
|
||||
|
||||
export const orthogonal = (line: Line, point: Point): Line =>
|
||||
GA.dot(line, point);
|
||||
|
||||
// Returns a line perpendicular to the line through `against` and `intersection`
|
||||
// going through `intersection`.
|
||||
export const orthogonalThrough = (against: Point, intersection: Point): Line =>
|
||||
orthogonal(through(against, intersection), intersection);
|
||||
|
||||
export const parallel = (line: Line, distance: number): Line => {
|
||||
const result = line.slice();
|
||||
result[1] -= distance;
|
||||
return result as unknown as Line;
|
||||
};
|
||||
|
||||
export const parallelThrough = (line: Line, point: Point): Line =>
|
||||
orthogonal(orthogonal(point, line), point);
|
||||
|
||||
export const distance = (line1: Line, line2: Line): number =>
|
||||
GA.inorm(GA.meet(line1, line2));
|
||||
|
||||
export const angle = (line1: Line, line2: Line): number =>
|
||||
Math.acos(GA.dot(line1, line2)[0]);
|
||||
|
||||
// The orientation of the line
|
||||
export const sign = (line: Line): number => Math.sign(line[1]);
|
Loading…
Add table
Add a link
Reference in a new issue