@leafer/math
Version:
170 lines (129 loc) • 4.33 kB
text/typescript
import { IMatrix, IMatrixData, IPointData, ILayoutData, IMatrixWithScaleData } from '@leafer/interface'
import { isObject } from '@leafer/data'
import { MatrixHelper as M } from './MatrixHelper'
export class Matrix implements IMatrix {
public a: number
public b: number
public c: number
public d: number
public e: number
public f: number
public scaleX: number
public scaleY: number
constructor(a?: number | IMatrixData, b?: number, c?: number, d?: number, e?: number, f?: number) {
this.set(a, b, c, d, e, f)
}
public set(a?: number | IMatrixData, b?: number, c?: number, d?: number, e?: number, f?: number): IMatrix {
isObject(a) ? M.copy(this, a) : M.set(this, a, b, c, d, e, f)
return this
}
public setWith(dataWithScale: IMatrixWithScaleData): IMatrix {
M.copy(this, dataWithScale)
this.scaleX = dataWithScale.scaleX
this.scaleY = dataWithScale.scaleY
return this
}
public get(): IMatrixData {
const { a, b, c, d, e, f } = this
return { a, b, c, d, e, f }
}
public clone(): IMatrix {
return new Matrix(this)
}
public translate(x: number, y: number): IMatrix {
M.translate(this, x, y)
return this
}
public translateInner(x: number, y: number): IMatrix {
M.translateInner(this, x, y)
return this
}
public scale(x: number, y?: number): IMatrix {
M.scale(this, x, y)
return this
}
public scaleWith(x: number, y?: number): IMatrix {
M.scale(this, x, y)
this.scaleX *= x
this.scaleY *= y || x
return this
}
public scaleOfOuter(origin: IPointData, x: number, y?: number): IMatrix {
M.scaleOfOuter(this, origin, x, y)
return this
}
public scaleOfInner(origin: IPointData, x: number, y?: number): IMatrix {
M.scaleOfInner(this, origin, x, y)
return this
}
public rotate(angle: number): IMatrix {
M.rotate(this, angle)
return this
}
public rotateOfOuter(origin: IPointData, angle: number): IMatrix {
M.rotateOfOuter(this, origin, angle)
return this
}
public rotateOfInner(origin: IPointData, angle: number): IMatrix {
M.rotateOfInner(this, origin, angle)
return this
}
public skew(x: number, y?: number): IMatrix {
M.skew(this, x, y)
return this
}
public skewOfOuter(origin: IPointData, x: number, y?: number): IMatrix {
M.skewOfOuter(this, origin, x, y)
return this
}
public skewOfInner(origin: IPointData, x: number, y?: number): IMatrix {
M.skewOfInner(this, origin, x, y)
return this
}
public multiply(child: IMatrixData): IMatrix {
M.multiply(this, child)
return this
}
public multiplyParent(parent: IMatrixData): IMatrix {
M.multiplyParent(this, parent)
return this
}
public divide(child: IMatrixData): IMatrix {
M.divide(this, child)
return this
}
public divideParent(parent: IMatrixData): IMatrix {
M.divideParent(this, parent)
return this
}
public invert(): IMatrix {
M.invert(this)
return this
}
public invertWith(): IMatrix {
M.invert(this)
this.scaleX = 1 / this.scaleX
this.scaleY = 1 / this.scaleY
return this
}
public toOuterPoint(inner: IPointData, to?: IPointData, distance?: boolean): void {
M.toOuterPoint(this, inner, to, distance)
}
public toInnerPoint(outer: IPointData, to?: IPointData, distance?: boolean): void {
M.toInnerPoint(this, outer, to, distance)
}
public setLayout(data: ILayoutData, origin?: IPointData, around?: IPointData,): IMatrix {
M.setLayout(this, data, origin, around)
return this
}
public getLayout(origin?: IPointData, around?: IPointData, firstSkewY?: boolean): ILayoutData {
return M.getLayout(this, origin, around, firstSkewY)
}
public withScale(scaleX?: number, scaleY?: number): IMatrixWithScaleData {
return M.withScale(this, scaleX, scaleY)
}
public reset(): void {
M.reset(this)
}
}
export const tempMatrix = new Matrix()