Mr-haili/aaa-blog

矩阵相关模板代码汇总

Opened this issue · 0 comments

容我三思

https://github.com/Mr-haili/explode-simulate/blob/8990f3cd7d82effece71ee73ad92eb3f6d9de84a/src/particle-system/pvector2.ts#L9

// 矩阵相关模板代码
interface IVector {
  x: number,
  y: number
}
  
const Vect = (x: number, y: number): IVector => ({ x, y });

const addV = (a: IVector, b: IVector) => Vect(a.x + b.x, b.x + b.y);


type MatrixValFn<T> = (v: IVector, val?: T) => T;

type MatrixFn<T = number> = MatrixValFn<T> & {
  readonly maxX: number,
  readonly maxY: number,
  readonly matrix: number[][]
};

function Matrix<T = number>(
  maxX: number,
  maxY: number,
  initValFn: MatrixValFn<T>
): MatrixFn<T> {
  const matrix = Array(maxX).fill(null).map(
    (row, x) => Array(maxY).fill(null).map((v, y) => initValFn(Vect(x, y)))
  );
  const A = (v: IVector, val?: T) => {
    if(val !== undefined) {
      return matrix[v.x][v.y] = val;
    }
    return matrix[v.x][v.y];
  };
  A.maxX = maxX;
  A.maxY = maxY;
  A.matrix = matrix;
  return A;
}