Files
upstream-affine/blocksuite/framework/global/src/gfx/perfect-freehand/vec.ts
upstream-mirror 50f788e799
Some checks failed
Build & Test / Analyze (javascript, blocksuite) (push) Failing after 3s
Build & Test / Rust test filter (push) Failing after 3s
Build & Test / E2E BlockSuite Test (2) (push) Failing after 3s
Build & Test / E2E BlockSuite Test (3) (push) Failing after 4s
Build & Test / E2E BlockSuite Test (4) (push) Failing after 3s
Build & Test / E2E BlockSuite Cross Browser Test (push) Failing after 3s
Build & Test / E2E Mobile Test (1) (push) Failing after 3s
Build & Test / E2E Mobile Test (2) (push) Failing after 3s
Build & Test / Build AFFiNE native (x86_64-unknown-linux-gnu) (push) Failing after 4s
Build & Test / Unit Test (1) (push) Has been skipped
Build & Test / Unit Test (2) (push) Has been skipped
Build & Test / Unit Test (3) (push) Has been skipped
Build & Test / Build Server native (push) Failing after 3s
Build & Test / Check Git Status (push) Has been skipped
Build & Test / Server Test (0, 4) (push) Has been skipped
Build & Test / Server Test (1, 4) (push) Has been skipped
Build & Test / Analyze (javascript, affine) (push) Failing after 3s
Build & Test / Analyze (typescript, affine) (push) Failing after 3s
Build & Test / Analyze (typescript, blocksuite) (push) Failing after 3s
Build & Test / Mobile native build filter (push) Failing after 3s
Build & Test / Check yarn binary (push) Failing after 3s
Build & Test / E2E BlockSuite Test (1) (push) Failing after 4s
Build & Test / E2E BlockSuite Test (5) (push) Failing after 3s
Build & Test / Unit Test (4) (push) Has been skipped
Build & Test / Unit Test (5) (push) Has been skipped
Build & Test / Native Unit Test (push) Has been skipped
Build & Test / Server Test (2, 4) (push) Has been skipped
Build & Test / Server Test (3, 4) (push) Has been skipped
Build & Test / Server Test with Elasticsearch (push) Has been skipped
Build & Test / Server Test with Embedded Search (push) Has been skipped
Build & Test / Server Test with Manticore Search (push) Has been skipped
Build & Test / Server E2E Test (push) Has been skipped
Build & Test / Cloud Desktop E2E Test (push) Has been skipped
Build & Test / Cloud E2E Test 1/2 (push) Has been skipped
Build & Test / Cloud E2E Test 2/2 (push) Has been skipped
Build & Test / Build @affine/electron renderer (push) Failing after 3s
Build & Test / Copilot test filter (push) Failing after 4s
Build & Test / Lint Rust (push) Has been skipped
Build & Test / Build Android app (push) Has been skipped
Build & Test / Test Android app (push) Has been skipped
Build & Test / Run native tests (push) Has been skipped
Build & Test / Server Copilot Api Test (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (3, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (4, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (1, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (2, 5) (push) Has been skipped
Build & Test / Frontend Copilot E2E Test (5, 5) (push) Has been skipped
Build & Test / Desktop Test (ubuntu-latest, linux, x64, x86_64-unknown-linux-gnu, true) (push) Has been cancelled
Build & Test / Desktop Test (windows-latest, windows, x64, x86_64-pc-windows-msvc, true) (push) Has been cancelled
Build & Test / 3, 2, 1 Launch (push) Has been cancelled
Build & Test / Lint (push) Has been cancelled
Build & Test / Typecheck (push) Has been cancelled
Build & Test / Build iOS app (push) Has been cancelled
Build & Test / Build AFFiNE native (aarch64-apple-darwin) (push) Has been cancelled
Build & Test / E2E Test (1) (push) Has been cancelled
Build & Test / E2E Test (2) (push) Has been cancelled
Build & Test / E2E Test (3) (push) Has been cancelled
Build & Test / E2E Test (4) (push) Has been cancelled
Build & Test / E2E Test (5) (push) Has been cancelled
Build & Test / Build AFFiNE native (x86_64-apple-darwin) (push) Has been cancelled
Build & Test / Build AFFiNE native (aarch64-pc-windows-msvc) (push) Has been cancelled
Build & Test / Build AFFiNE native (x86_64-pc-windows-msvc) (push) Has been cancelled
Build & Test / Desktop Test (macos-latest, macos, arm64, aarch64-apple-darwin, true) (push) Has been cancelled
Build & Test / Desktop Test (macos-latest, macos, x64, x86_64-apple-darwin, false) (push) Has been cancelled
snapshot of https://github.com/toeverything/AFFiNE.git (canary, 2026-09-16; blobs > 131072B omitted)
2026-09-16 00:31:07 +05:00

179 lines
2.8 KiB
TypeScript

import type { IVec } from '../model/index.js';
/**
* Negate a vector.
* @param A
* @internal
*/
export function neg(A: IVec): IVec {
return [-A[0], -A[1]];
}
/**
* Add vectors.
* @param A
* @param B
* @internal
*/
export function add(A: IVec, B: IVec): IVec {
return [A[0] + B[0], A[1] + B[1]];
}
/**
* Subtract vectors.
* @param A
* @param B
* @internal
*/
export function sub(A: IVec, B: IVec): IVec {
return [A[0] - B[0], A[1] - B[1]];
}
/**
* Vector multiplication by scalar
* @param A
* @param n
* @internal
*/
export function mul(A: IVec, n: number): IVec {
return [A[0] * n, A[1] * n];
}
/**
* Vector division by scalar.
* @param A
* @param n
* @internal
*/
export function div(A: IVec, n: number): IVec {
return [A[0] / n, A[1] / n];
}
/**
* Perpendicular rotation of a vector A
* @param A
* @internal
*/
export function per(A: IVec): IVec {
return [A[1], -A[0]];
}
/**
* Dot product
* @param A
* @param B
* @internal
*/
export function dpr(A: IVec, B: IVec) {
return A[0] * B[0] + A[1] * B[1];
}
/**
* Get whether two vectors are equal.
* @param A
* @param B
* @internal
*/
export function isEqual(A: IVec, B: IVec) {
return A[0] === B[0] && A[1] === B[1];
}
/**
* Length of the vector
* @param A
* @internal
*/
export function len(A: IVec) {
return Math.hypot(A[0], A[1]);
}
/**
* Length of the vector squared
* @param A
* @internal
*/
export function len2(A: IVec) {
return A[0] * A[0] + A[1] * A[1];
}
/**
* Dist length from A to B squared.
* @param A
* @param B
* @internal
*/
export function dist2(A: IVec, B: IVec) {
return len2(sub(A, B));
}
/**
* Get normalized / unit vector.
* @param A
* @internal
*/
export function uni(A: IVec) {
return div(A, len(A));
}
/**
* Dist length from A to B
* @param A
* @param B
* @internal
*/
export function dist(A: IVec, B: IVec) {
return Math.hypot(A[1] - B[1], A[0] - B[0]);
}
/**
* Mean between two vectors or mid vector between two vectors
* @param A
* @param B
* @internal
*/
export function med(A: IVec, B: IVec) {
return mul(add(A, B), 0.5);
}
/**
* Rotate a vector around another vector by r (radians)
* @param A vector
* @param C center
* @param r rotation in radians
* @internal
*/
export function rotAround(A: IVec, C: IVec, r: number): IVec {
const s = Math.sin(r);
const c = Math.cos(r);
const px = A[0] - C[0];
const py = A[1] - C[1];
const nx = px * c - py * s;
const ny = px * s + py * c;
return [nx + C[0], ny + C[1]];
}
/**
* Interpolate vector A to B with a scalar t
* @param A
* @param B
* @param t scalar
* @internal
*/
export function lrp(A: IVec, B: IVec, t: number) {
return add(A, mul(sub(B, A), t));
}
/**
* Project a point A in the direction B by a scalar c
* @param A
* @param B
* @param c
* @internal
*/
export function prj(A: IVec, B: IVec, c: number) {
return add(A, mul(B, c));
}