数学Math

MicLon2022年8月10日
大约 2 分钟

Calculate the angle of a line defined by two points

JavaScript version

// In radians
const radiansAngle = (p1, p2) => Math.atan2(p2.y - p1.y, p2.x - p1.x);

// In degrees
const degreesAngle = (p1, p2) => (Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180) / Math.PI;

TypeScript version

interface Point {
    x: number;
    y: number;
}

const radiansAngle = (p1: Point, p2: Point): number => Math.atan2(p2.y - p1.y, p2.x - p1.x);

const degreesAngle = (p1: Point, p2: Point): number => (Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180) / Math.PI;

Calculate the distance between two points

JavaScript version

const distance = (p1, p2) => Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));

TypeScript version

interface Point {
    x: number;
    y: number;
}

const distance = (p1: Point, p2: Point): number => Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));

Calculate the linear interpolation between two numbers

JavaScript version

const lerp = (a, b, amount) => (1 - amount) * a + amount * b;

TypeScript version

const lerp = (a: number, b: number, amount: number): number => (1 - amount) * a + amount * b;

Calculate the midpoint between two points

JavaScript version

const midpoint = (p1, p2) => [(p1.x + p2.x) / 2, (p1.y + p2.y) / 2];

TypeScript version

interface Point {
    x: number;
    y: number;
}

const midpoint = (p1: Point, p2: Point): number[] => [(p1.x + p2.x) / 2, (p1.y + p2.y) / 2];

Check if a point is inside a rectangle

JavaScript version

const isInside = (point, rect) => point.x > rect.left && point.x < rect.right && point.y > rect.top && point.y < rect.bottom;

TypeScript version

interface Point {
    x: number;
    y: number;
}

interface Rect {
    bottom: number;
    left: number;
    top: number;
    right: number;
}

const isInside = (point: Point, rect: Rect): boolean => point.x > rect.left && point.x < rect.right && point.y > rect.top && point.y < rect.bottom;

Check if a rectangle contains other one

JavaScript version

// Returns true if `a` contains `b`
// (x1, y1) and (x2, y2) are top-left and bottom-right corners
const contains = (a, b) => a.x1 <= b.x1 && a.y1 <= b.y1 && a.x2 >= b.x2 && a.y2 >= b.y2;

TypeScript version

interface Rect {
    x1: number;
    x2: number;
    y1: number;
    y2: number;
}

const contains = (a: Rect, b: Rect): boolean => a.x1 <= b.x1 && a.y1 <= b.y1 && a.x2 >= b.x2 && a.y2 >= b.y2;

Check if a rectangle overlaps other one

JavaScript version

// Returns true if `a` overlaps `b`
// (x1, y1) and (x2, y2) are top-left and bottom-right corners
const overlaps = (a, b) => (a.x1 < b.x2 && b.x1 < a.x2) || (a.y1 < b.y2 && b.y1 < a.y2);

TypeScript version

interface Rect {
    x1: number;
    x2: number;
    y1: number;
    y2: number;
}

const contains = (a: Rect, b: Rect): boolean => (a.x1 < b.x2 && b.x1 < a.x2) || (a.y1 < b.y2 && b.y1 < a.y2);

Convert degrees to radians

JavaScript version

const degsToRads = (deg) => (deg * Math.PI) / 180.0;

TypeScript version

const degsToRads = (deg: number): number => (deg * Math.PI) / 180.0;

Convert radians to degrees

JavaScript version

const radsToDegs = (rad) => (rad * 180) / Math.PI;

TypeScript version

const radsToDegs = (rad: number): number => (rad * 180) / Math.PI;

Normalize the ratio of a number in a range

JavaScript version

const normalizeRatio = (value, min, max) => (value - min) / (max - min);

TypeScript version

const normalizeRatio = (value: number, min: number, max: number): number => (value - min) / (max - min);

Round a number to the nearest multiple of a given value

JavaScript version

const roundNearest = (value, nearest) => Math.round(value / nearest) * nearest;

TypeScript version

const roundNearest = (value: number, nearest: number): number => Math.round(value / nearest) * nearest;

Examples

roundNearest(100, 30); // 90
roundNearest(200, 30); // 210
roundNearest(200, 40); // 200

Loading...