{
  "version": 3,
  "sources": ["../../src/util/toPiecewiseBezier.ts"],
  "sourcesContent": ["import type { BezierResult, UtilPoint } from '../types/util-types'\nimport insertKnot from './insertKnot'\n\n/**\n * For a pinned spline, the knots have to be repeated k times\n * (where k is the order), at both the beginning and the end\n */\nexport const checkPinned = (k: number, knots: number[]): void => {\n  // Pinned at the start\n  for (let i = 1; i < k; ++i) {\n    if (knots[i] !== knots[0]) {\n      throw new Error(`not pinned. order: ${k} knots: ${knots}`)\n    }\n  }\n  // Pinned at the end\n  for (let i = knots.length - 2; i > knots.length - k - 1; --i) {\n    if (knots[i] !== knots[knots.length - 1]) {\n      throw new Error(`not pinned. order: ${k} knots: ${knots}`)\n    }\n  }\n}\n\nexport const multiplicity = (knots: number[], index: number): number => {\n  let m = 1\n  for (let i = index + 1; i < knots.length; ++i) {\n    if (knots[i] === knots[index]) {\n      ++m\n    } else {\n      break\n    }\n  }\n  return m\n}\n\n/**\n * https://saccade.com/writing/graphics/KnotVectors.pdf\n * A quadratic piecewise Be\u0301zier knot vector with seven control points\n * will look like this [0 0 0 1 1 2 2 3 3 3]. In general, in a\n * piecewise Be\u0301zier knot vector the first k knots are the same,\n * then each subsequent group of k-1 knots is the same,\n * until you get to the end.\n */\nexport const computeInsertions = (k: number, knots: number[]): number[] => {\n  const inserts: number[] = []\n  let i = k\n  while (i < knots.length - k) {\n    const knot = knots[i]\n    const m = multiplicity(knots, i)\n    for (let j = 0; j < k - m - 1; ++j) {\n      inserts.push(knot)\n    }\n    i = i + m\n  }\n  return inserts\n}\n\nexport default function toPiecewiseBezier(\n  k: number,\n  controlPoints: UtilPoint[],\n  knots: number[]\n): BezierResult {\n  checkPinned(k, knots)\n  const insertions = computeInsertions(k, knots)\n  return insertions.reduce(\n    (acc, tNew) => {\n      return insertKnot(k, acc.controlPoints, acc.knots, tNew)\n    },\n    { controlPoints, knots },\n  )\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,wBAAuB;AAMhB,MAAM,cAAc,CAAC,GAAW,UAA0B;AAE/D,WAAS,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG;AAC1B,QAAI,MAAM,CAAC,MAAM,MAAM,CAAC,GAAG;AACzB,YAAM,IAAI,MAAM,sBAAsB,CAAC,WAAW,KAAK,EAAE;AAAA,IAC3D;AAAA,EACF;AAEA,WAAS,IAAI,MAAM,SAAS,GAAG,IAAI,MAAM,SAAS,IAAI,GAAG,EAAE,GAAG;AAC5D,QAAI,MAAM,CAAC,MAAM,MAAM,MAAM,SAAS,CAAC,GAAG;AACxC,YAAM,IAAI,MAAM,sBAAsB,CAAC,WAAW,KAAK,EAAE;AAAA,IAC3D;AAAA,EACF;AACF;AAEO,MAAM,eAAe,CAAC,OAAiB,UAA0B;AACtE,MAAI,IAAI;AACR,WAAS,IAAI,QAAQ,GAAG,IAAI,MAAM,QAAQ,EAAE,GAAG;AAC7C,QAAI,MAAM,CAAC,MAAM,MAAM,KAAK,GAAG;AAC7B,QAAE;AAAA,IACJ,OAAO;AACL;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAUO,MAAM,oBAAoB,CAAC,GAAW,UAA8B;AACzE,QAAM,UAAoB,CAAC;AAC3B,MAAI,IAAI;AACR,SAAO,IAAI,MAAM,SAAS,GAAG;AAC3B,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,IAAI,aAAa,OAAO,CAAC;AAC/B,aAAS,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,GAAG;AAClC,cAAQ,KAAK,IAAI;AAAA,IACnB;AACA,QAAI,IAAI;AAAA,EACV;AACA,SAAO;AACT;AAEe,SAAR,kBACL,GACA,eACA,OACc;AACd,cAAY,GAAG,KAAK;AACpB,QAAM,aAAa,kBAAkB,GAAG,KAAK;AAC7C,SAAO,WAAW;AAAA,IAChB,CAAC,KAAK,SAAS;AACb,iBAAO,kBAAAA,SAAW,GAAG,IAAI,eAAe,IAAI,OAAO,IAAI;AAAA,IACzD;AAAA,IACA,EAAE,eAAe,MAAM;AAAA,EACzB;AACF;",
  "names": ["insertKnot"]
}
