{
  "version": 3,
  "sources": ["../../src/util/insertKnot.ts"],
  "sourcesContent": ["import type { InsertKnotResult, UtilPoint } from '../types/util-types'\n\n/**\n * Knot insertion is known as \"Boehm's algorithm\"\n *\n * https://math.stackexchange.com/questions/417859/convert-a-b-spline-into-bezier-curves\n * code adapted from http://preserve.mactech.com/articles/develop/issue_25/schneider.html\n */\nexport default function insertKnot(\n  k: number,\n  controlPoints: UtilPoint[],\n  knots: number[],\n  newKnot: number\n): InsertKnotResult {\n  const x = knots\n  const b = controlPoints\n  const n = controlPoints.length\n  let i = 0\n  let foundIndex = false\n  for (let j = 0; j < n + k; j++) {\n    if (newKnot > x[j] && newKnot <= x[j + 1]) {\n      i = j\n      foundIndex = true\n      break\n    }\n  }\n  if (!foundIndex) {\n    throw new Error('invalid new knot')\n  }\n\n  const xHat: number[] = []\n  for (let j = 0; j < n + k + 1; j++) {\n    if (j <= i) {\n      xHat[j] = x[j]\n    } else if (j === i + 1) {\n      xHat[j] = newKnot\n    } else {\n      xHat[j] = x[j - 1]\n    }\n  }\n\n  let alpha: number\n  const bHat: UtilPoint[] = []\n  for (let j = 0; j < n + 1; j++) {\n    if (j <= i - k + 1) {\n      alpha = 1\n    } else if (i - k + 2 <= j && j <= i) {\n      if (x[j + k - 1] - x[j] === 0) {\n        alpha = 0\n      } else {\n        alpha = (newKnot - x[j]) / (x[j + k - 1] - x[j])\n      }\n    } else {\n      alpha = 0\n    }\n\n    if (alpha === 0) {\n      bHat[j] = b[j - 1]\n    } else if (alpha === 1) {\n      bHat[j] = b[j]\n    } else {\n      bHat[j] = {\n        x: (1 - alpha) * b[j - 1].x + alpha * b[j].x,\n        y: (1 - alpha) * b[j - 1].y + alpha * b[j].y,\n      }\n    }\n  }\n  return { controlPoints: bHat, knots: xHat }\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQe,SAAR,WACL,GACA,eACA,OACA,SACkB;AAClB,QAAM,IAAI;AACV,QAAM,IAAI;AACV,QAAM,IAAI,cAAc;AACxB,MAAI,IAAI;AACR,MAAI,aAAa;AACjB,WAAS,IAAI,GAAG,IAAI,IAAI,GAAG,KAAK;AAC9B,QAAI,UAAU,EAAE,CAAC,KAAK,WAAW,EAAE,IAAI,CAAC,GAAG;AACzC,UAAI;AACJ,mBAAa;AACb;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAEA,QAAM,OAAiB,CAAC;AACxB,WAAS,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK;AAClC,QAAI,KAAK,GAAG;AACV,WAAK,CAAC,IAAI,EAAE,CAAC;AAAA,IACf,WAAW,MAAM,IAAI,GAAG;AACtB,WAAK,CAAC,IAAI;AAAA,IACZ,OAAO;AACL,WAAK,CAAC,IAAI,EAAE,IAAI,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,MAAI;AACJ,QAAM,OAAoB,CAAC;AAC3B,WAAS,IAAI,GAAG,IAAI,IAAI,GAAG,KAAK;AAC9B,QAAI,KAAK,IAAI,IAAI,GAAG;AAClB,cAAQ;AAAA,IACV,WAAW,IAAI,IAAI,KAAK,KAAK,KAAK,GAAG;AACnC,UAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG;AAC7B,gBAAQ;AAAA,MACV,OAAO;AACL,iBAAS,UAAU,EAAE,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AAAA,MAChD;AAAA,IACF,OAAO;AACL,cAAQ;AAAA,IACV;AAEA,QAAI,UAAU,GAAG;AACf,WAAK,CAAC,IAAI,EAAE,IAAI,CAAC;AAAA,IACnB,WAAW,UAAU,GAAG;AACtB,WAAK,CAAC,IAAI,EAAE,CAAC;AAAA,IACf,OAAO;AACL,WAAK,CAAC,IAAI;AAAA,QACR,IAAI,IAAI,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,QAAQ,EAAE,CAAC,EAAE;AAAA,QAC3C,IAAI,IAAI,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,QAAQ,EAAE,CAAC,EAAE;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,eAAe,MAAM,OAAO,KAAK;AAC5C;",
  "names": []
}
