UNPKG

warp-grid

Version:

Create a complex grid, warped in 2D space and access data about its lines and cells

46 lines (37 loc) 1.6 kB
/*------------------------------------------------------------------------------ * All code in this file is based on work by Pomax on curve fitting, and all * credit is due to him. * * That work can be found here: https://pomax.github.io/bezierinfo/#curvefitting * ---------------------------------------------------------------------------*/ import matrix, { Matrix } from 'matrix-js' import { times } from './functional' import { binomial } from './math' // ----------------------------------------------------------------------------- // Exports // ----------------------------------------------------------------------------- export const getRatioMatrix = ( ratios: number[] ): { tMatrix: Matrix; tMatrixTransposed: Matrix } => { const ratioLength = ratios.length const data = times((i) => ratios.map((v) => v ** i), ratioLength) const tMatrix = matrix(data) const tMatrixTransposed = matrix(tMatrix.trans()) return { tMatrix, tMatrixTransposed } } export const getBasisMatrix = (numberOfPoints: number): Matrix => { let basisMatrix = matrix(matrix.gen(0).size(numberOfPoints, numberOfPoints)) for (let i = 0; i < numberOfPoints; i++) { const value = binomial(numberOfPoints - 1, i) const ret = basisMatrix.set(i, i).to(value) basisMatrix = matrix(ret) } for (let c = 0, r; c < numberOfPoints; c++) { for (r = c + 1; r < numberOfPoints; r++) { const sign = (r + c) % 2 === 0 ? 1 : -1 const value = binomial(r, c) * basisMatrix(r, r) basisMatrix = matrix(basisMatrix.set(r, c).to(sign * value)) } } return basisMatrix }