UNPKG

zrender

Version:

A lightweight graphic library providing 2d draw for Apache ECharts

208 lines (176 loc) 4.1 kB
import { MatrixArray } from './matrix'; export interface PointLike { x: number y: number } export default class Point { x: number y: number constructor(x?: number, y?: number) { this.x = x || 0; this.y = y || 0; } /** * Copy from another point */ copy(other: PointLike) { this.x = other.x; this.y = other.y; return this; } /** * Clone a point */ clone() { return new Point(this.x, this.y); } /** * Set x and y */ set(x: number, y: number) { this.x = x; this.y = y; return this; } /** * If equal to another point */ equal(other: PointLike) { return other.x === this.x && other.y === this.y; } /** * Add another point */ add(other: PointLike) { this.x += other.x; this.y += other.y; return this; } scale(scalar: number) { this.x *= scalar; this.y *= scalar; } scaleAndAdd(other: PointLike, scalar: number) { this.x += other.x * scalar; this.y += other.y * scalar; } /** * Sub another point */ sub(other: PointLike) { this.x -= other.x; this.y -= other.y; return this; } /** * Dot product with other point */ dot(other: PointLike) { return this.x * other.x + this.y * other.y; } /** * Get length of point */ len() { return Math.sqrt(this.x * this.x + this.y * this.y); } /** * Get squared length */ lenSquare() { return this.x * this.x + this.y * this.y; } /** * Normalize */ normalize() { const len = this.len(); this.x /= len; this.y /= len; return this; } /** * Distance to another point */ distance(other: PointLike) { const dx = this.x - other.x; const dy = this.y - other.y; return Math.sqrt(dx * dx + dy * dy); } /** * Square distance to another point */ distanceSquare(other: Point) { const dx = this.x - other.x; const dy = this.y - other.y; return dx * dx + dy * dy; } /** * Negate */ negate() { this.x = -this.x; this.y = -this.y; return this; } /** * Apply a transform matrix array. */ transform(m: MatrixArray) { if (!m) { return; } const x = this.x; const y = this.y; this.x = m[0] * x + m[2] * y + m[4]; this.y = m[1] * x + m[3] * y + m[5]; return this; } toArray(out: number[]) { out[0] = this.x; out[1] = this.y; return out; } fromArray(input: number[]) { this.x = input[0]; this.y = input[1]; } static set(p: PointLike, x: number, y: number) { p.x = x; p.y = y; } static copy(p: PointLike, p2: PointLike) { p.x = p2.x; p.y = p2.y; } static len(p: PointLike) { return Math.sqrt(p.x * p.x + p.y * p.y); } static lenSquare(p: PointLike) { return p.x * p.x + p.y * p.y; } static dot(p0: PointLike, p1: PointLike) { return p0.x * p1.x + p0.y * p1.y; } static add(out: PointLike, p0: PointLike, p1: PointLike) { out.x = p0.x + p1.x; out.y = p0.y + p1.y; } static sub(out: PointLike, p0: PointLike, p1: PointLike) { out.x = p0.x - p1.x; out.y = p0.y - p1.y; } static scale(out: PointLike, p0: PointLike, scalar: number) { out.x = p0.x * scalar; out.y = p0.y * scalar; } static scaleAndAdd(out: PointLike, p0: PointLike, p1: PointLike, scalar: number) { out.x = p0.x + p1.x * scalar; out.y = p0.y + p1.y * scalar; } static lerp(out: PointLike, p0: PointLike, p1: PointLike, t: number) { const onet = 1 - t; out.x = onet * p0.x + t * p1.x; out.y = onet * p0.y + t * p1.y; } }