{
  "version": 3,
  "sources": ["../../src/util/bSpline.ts"],
  "sourcesContent": ["import round10 from './round10'\n\n/**\n * Copied and ported to code standard as the b-spline library is not maintained any longer.\n * Source:\n * https://github.com/thibauts/b-spline\n * Copyright (c) 2015 Thibaut S\u00E9guy <thibaut.seguy@gmail.com>\n */\nexport default function bSpline(\n  t: number,\n  degree: number,\n  points: number[][],\n  knots?: number[],\n  weights?: number[]\n): number[] {\n  const n = points.length // points count\n  const d = points[0].length // point dimensionality\n\n  if (t < 0 || t > 1) {\n    throw new Error('t out of bounds [0,1]: ' + t)\n  }\n  if (degree < 1) throw new Error('degree must be at least 1 (linear)')\n  if (degree > n - 1)\n    throw new Error('degree must be less than or equal to point count - 1')\n\n  let actualWeights = weights\n  if (!actualWeights) {\n    // build weight vector of length [n]\n    actualWeights = []\n    for (let i = 0; i < n; i++) {\n      actualWeights[i] = 1\n    }\n  }\n\n  let actualKnots = knots\n  if (actualKnots === null || actualKnots === undefined) {\n    // build knot vector of length [n + degree + 1]\n    actualKnots = []\n    for (let i = 0; i < n + degree + 1; i++) {\n      actualKnots[i] = i\n    }\n  } else if (actualKnots.length !== n + degree + 1) {\n    throw new Error('bad knot vector length')\n  }\n\n  const domain = [degree, actualKnots.length - 1 - degree]\n\n  // remap t to the domain where the spline is defined\n  const low = actualKnots[domain[0]]\n  const high = actualKnots[domain[1]]\n  let tMapped = t * (high - low) + low\n\n  // Clamp to the upper &  lower bounds instead of\n  // throwing an error like in the original lib\n  // https://github.com/bjnortier/dxf/issues/28\n  tMapped = Math.max(tMapped, low)\n  tMapped = Math.min(tMapped, high)\n\n  // find s (the spline segment) for the [t] value provided\n  let s\n  for (s = domain[0]; s < domain[1]; s++) {\n    if (tMapped >= actualKnots[s] && tMapped <= actualKnots[s + 1]) {\n      break\n    }\n  }\n\n  // convert points to homogeneous coordinates\n  const v: number[][] = []\n  for (let i = 0; i < n; i++) {\n    v[i] = []\n    for (let j = 0; j < d; j++) {\n      v[i][j] = points[i][j] * actualWeights[i]\n    }\n    v[i][d] = actualWeights[i]\n  }\n\n  // l (level) goes from 1 to the curve degree + 1\n  let alpha: number\n  for (let l = 1; l <= degree + 1; l++) {\n    // build level l of the pyramid\n    for (let i = s; i > s - degree - 1 + l; i--) {\n      alpha = (tMapped - actualKnots[i]) / (actualKnots[i + degree + 1 - l] - actualKnots[i])\n\n      // interpolate each component\n      for (let j = 0; j < d + 1; j++) {\n        v[i][j] = (1 - alpha) * v[i - 1][j] + alpha * v[i][j]\n      }\n    }\n  }\n\n  // convert back to cartesian and return\n  const result: number[] = []\n  for (let i = 0; i < d; i++) {\n    result[i] = round10(v[s][i] / v[s][d], -9)\n  }\n  return result\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AAQL,SAAR,QACL,GACA,QACA,QACA,OACA,SACU;AACV,QAAM,IAAI,OAAO;AACjB,QAAM,IAAI,OAAO,CAAC,EAAE;AAEpB,MAAI,IAAI,KAAK,IAAI,GAAG;AAClB,UAAM,IAAI,MAAM,4BAA4B,CAAC;AAAA,EAC/C;AACA,MAAI,SAAS,EAAG,OAAM,IAAI,MAAM,oCAAoC;AACpE,MAAI,SAAS,IAAI;AACf,UAAM,IAAI,MAAM,sDAAsD;AAExE,MAAI,gBAAgB;AACpB,MAAI,CAAC,eAAe;AAElB,oBAAgB,CAAC;AACjB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,oBAAc,CAAC,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,cAAc;AAClB,MAAI,gBAAgB,QAAQ,gBAAgB,QAAW;AAErD,kBAAc,CAAC;AACf,aAAS,IAAI,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK;AACvC,kBAAY,CAAC,IAAI;AAAA,IACnB;AAAA,EACF,WAAW,YAAY,WAAW,IAAI,SAAS,GAAG;AAChD,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AAEA,QAAM,SAAS,CAAC,QAAQ,YAAY,SAAS,IAAI,MAAM;AAGvD,QAAM,MAAM,YAAY,OAAO,CAAC,CAAC;AACjC,QAAM,OAAO,YAAY,OAAO,CAAC,CAAC;AAClC,MAAI,UAAU,KAAK,OAAO,OAAO;AAKjC,YAAU,KAAK,IAAI,SAAS,GAAG;AAC/B,YAAU,KAAK,IAAI,SAAS,IAAI;AAGhC,MAAI;AACJ,OAAK,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,KAAK;AACtC,QAAI,WAAW,YAAY,CAAC,KAAK,WAAW,YAAY,IAAI,CAAC,GAAG;AAC9D;AAAA,IACF;AAAA,EACF;AAGA,QAAM,IAAgB,CAAC;AACvB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,MAAE,CAAC,IAAI,CAAC;AACR,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QAAE,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,cAAc,CAAC;AAAA,IAC1C;AACA,MAAE,CAAC,EAAE,CAAC,IAAI,cAAc,CAAC;AAAA,EAC3B;AAGA,MAAI;AACJ,WAAS,IAAI,GAAG,KAAK,SAAS,GAAG,KAAK;AAEpC,aAAS,IAAI,GAAG,IAAI,IAAI,SAAS,IAAI,GAAG,KAAK;AAC3C,eAAS,UAAU,YAAY,CAAC,MAAM,YAAY,IAAI,SAAS,IAAI,CAAC,IAAI,YAAY,CAAC;AAGrF,eAAS,IAAI,GAAG,IAAI,IAAI,GAAG,KAAK;AAC9B,UAAE,CAAC,EAAE,CAAC,KAAK,IAAI,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,EAAE,CAAC;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAGA,QAAM,SAAmB,CAAC;AAC1B,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,WAAO,CAAC,QAAI,eAAAA,SAAQ,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE;AAAA,EAC3C;AACA,SAAO;AACT;",
  "names": ["round10"]
}
