{"version":3,"sources":["jsdelivr-header.js","/npm/@thi.ng/geom-tessellate@3.0.82/tessellation.js","/npm/@thi.ng/geom-tessellate@3.0.82/tessellate.js","/npm/@thi.ng/geom-tessellate@3.0.82/earcut.js","/npm/@thi.ng/geom-tessellate@3.0.82/earcut-complex.js","/npm/@thi.ng/geom-tessellate@3.0.82/edge-split.js","/npm/@thi.ng/geom-tessellate@3.0.82/inset.js","/npm/@thi.ng/geom-tessellate@3.0.82/quad-fan.js","/npm/@thi.ng/geom-tessellate@3.0.82/rim-tris.js","/npm/@thi.ng/geom-tessellate@3.0.82/tri-fan.js","/npm/@thi.ng/geom-tessellate@3.0.82/tri-fan-boundary.js","/npm/@thi.ng/geom-tessellate@3.0.82/tri-fan-split.js"],"names":[],"mappings":"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","file":"/npm/@thi.ng/geom-tessellate@3.0.82/index.js/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/@thi.ng/geom-tessellate@3.0.82/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { KdTreeMap } from \"@thi.ng/geom-accel/kd-tree-map\";\nimport { distSq2, distSq3 } from \"@thi.ng/vectors/distsq\";\nclass ATessellation {\n  constructor(points = [], faces = []) {\n    this.points = points;\n    this.faces = faces;\n  }\n  addPoints(points) {\n    return points.map((p) => this.addPoint(p));\n  }\n  addFaces(faces) {\n    this.faces.push(...faces);\n    return this;\n  }\n  pointsForIDs(indices) {\n    return indices.map((i) => this.points[i]);\n  }\n  pointsForFaces(faces = this.faces) {\n    return faces.map((ids) => this.pointsForIDs(ids));\n  }\n}\nclass BasicTessellation extends ATessellation {\n  empty() {\n    return new BasicTessellation();\n  }\n  addPoint(p) {\n    return this.points.push(p) - 1;\n  }\n}\nclass MeshTessellation extends ATessellation {\n  constructor(dim, points = [], faces = [], eps = 1e-6) {\n    super(points, faces);\n    this.eps = eps;\n    this.tree = new KdTreeMap(\n      dim,\n      void 0,\n      dim === 2 ? distSq2 : distSq3\n    );\n    this.addPoints(points);\n  }\n  tree;\n  empty() {\n    return new MeshTessellation(this.tree.dim);\n  }\n  addPoint(p) {\n    const tree = this.tree;\n    let id = tree.get(p, this.eps);\n    if (id !== void 0) return id;\n    id = tree.size;\n    tree.set(p, id, this.eps);\n    this.points.push(p);\n    return id;\n  }\n}\nexport {\n  ATessellation,\n  BasicTessellation,\n  MeshTessellation\n};\n","import { isFunction } from \"@thi.ng/checks/is-function\";\nimport { repeat } from \"@thi.ng/transducers/repeat\";\nimport { BasicTessellation } from \"./tessellation.js\";\nfunction tessellate(points, ...args) {\n  return tessellateWith(\n    new BasicTessellation(),\n    points,\n    ...args\n  );\n}\nfunction tessellateWith(tessel, points, ...args) {\n  const fns = isFunction(args[0]) ? repeat(args[0], args[1] ?? 1) : args[0];\n  return tessellateFaces(tessel, [tessel.addPoints(points)], fns);\n}\nconst tessellateFaces = (tessel, faces, tessellators) => {\n  for (const fn of tessellators) {\n    let newFaces = [];\n    for (const face of faces) {\n      fn(tessel, newFaces, face);\n    }\n    faces = newFaces;\n  }\n  tessel.addFaces(faces);\n  return tessel;\n};\nexport {\n  tessellate,\n  tessellateFaces,\n  tessellateWith\n};\n","import { pointInTriangle2 } from \"@thi.ng/geom-isec/point\";\nimport { polyArea2 } from \"@thi.ng/geom-poly-utils/area\";\nimport { range } from \"@thi.ng/transducers/range\";\nimport { signedArea2 } from \"@thi.ng/vectors/signed-area\";\nconst earCut = (tess, faces, pids) => {\n  let n = pids.length;\n  const points = tess.pointsForIDs(pids);\n  const order = [\n    ...polyArea2(points) > 0 ? range(n) : range(n - 1, -1, -1)\n  ];\n  let count = 2 * n - 1;\n  let v = n - 1, u, w;\n  while (count > 0 && n > 2) {\n    u = n <= v ? 0 : v;\n    v = u + 1;\n    v = n <= v ? 0 : v;\n    w = v + 1;\n    w = n <= w ? 0 : w;\n    if (__snip(points, u, v, w, n, order)) {\n      faces.push([pids[order[u]], pids[order[v]], pids[order[w]]]);\n      order.splice(v, 1);\n      n--;\n      count = 2 * n;\n    } else {\n      count--;\n    }\n  }\n  return faces;\n};\nconst __snip = (points, u, v, w, n, ids) => {\n  const a = points[ids[u]];\n  const b = points[ids[v]];\n  const c = points[ids[w]];\n  if (signedArea2(a, b, c) > 0) {\n    for (let i = 0; i < n; i++) {\n      if (i !== u && i !== v && i !== w) {\n        if (pointInTriangle2(points[ids[i]], a, b, c)) {\n          return false;\n        }\n      }\n    }\n    return true;\n  }\n  return false;\n};\nexport {\n  earCut\n};\n","import { bounds2 } from \"@thi.ng/geom-poly-utils/bounds\";\nimport { sign } from \"@thi.ng/math/abs\";\nimport { mux2 } from \"@thi.ng/morton/mux\";\nconst earCutComplex = (holeIDs = [], hashThreshold = 80) => (tess, faces, pids) => {\n  let points = tess.pointsForIDs(pids);\n  const hasHoles = !!holeIDs.length;\n  const outerLen = hasHoles ? holeIDs[0] : points.length;\n  let scale = 0;\n  if (points.length >= hashThreshold) {\n    const [[minX, minY], [maxX, maxY]] = bounds2(points, 0, outerLen);\n    scale = Math.max(maxX - minX, maxY - minY);\n    if (scale > 0) {\n      scale = 65535 / scale;\n      points = points.map((p) => [\n        (p[0] - minX) * scale,\n        (p[1] - minY) * scale\n      ]);\n    }\n  }\n  let outerNode = __buildVertexList(points, pids, 0, outerLen, true);\n  if (!outerNode || outerNode.n === outerNode.p) return faces;\n  if (hasHoles) {\n    outerNode = __eliminateHoles(points, pids, holeIDs, outerNode);\n  } else {\n    outerNode = __removeColinear(outerNode);\n  }\n  __earcutLinked(outerNode, faces, scale > 0 ? __isEarHashed : __isEar);\n  return faces;\n};\nconst earCutComplexPrepare = (boundary, holes) => {\n  let points = boundary;\n  const holeIDs = [];\n  for (const hole of holes) {\n    holeIDs.push(points.length);\n    points = points.concat(hole);\n  }\n  return [points, holeIDs];\n};\nclass Vertex {\n  i;\n  x;\n  y;\n  p = null;\n  n = null;\n  pz = null;\n  nz = null;\n  z = -1;\n  s = false;\n  constructor(i, x, y) {\n    this.i = i;\n    this.x = x;\n    this.y = y;\n  }\n}\nconst __buildVertexList = (points, pids, start, end, clockwise) => {\n  let last;\n  if (clockwise === __signedArea(points, start, end) > 0) {\n    for (let i = start; i < end; i++)\n      last = __insertVertex(pids[i], points[i], last);\n  } else {\n    for (let i = end - 1; i >= start; i--)\n      last = __insertVertex(pids[i], points[i], last);\n  }\n  if (last && __equals(last, last.n)) {\n    __removeVertex(last);\n    last = last.n;\n  }\n  return last;\n};\nconst __insertVertex = (i, [x, y], last) => {\n  const v = new Vertex(i, x, y);\n  if (!last) {\n    v.p = v.n = v;\n  } else {\n    v.n = last.n;\n    v.p = last;\n    last.n = last.n.p = v;\n  }\n  return v;\n};\nconst __removeVertex = (v) => {\n  v.n.p = v.p;\n  v.p.n = v.n;\n  if (v.pz) v.pz.nz = v.nz;\n  if (v.nz) v.nz.pz = v.pz;\n};\nconst __earcutLinked = (ear, triangles, pred, pass = 0) => {\n  if (!ear) return;\n  if (!pass && pred === __isEarHashed) __indexZCurve(ear);\n  let stop = ear;\n  while (ear.p !== ear.n) {\n    const { p: prev, n: next } = ear;\n    if (pred(ear)) {\n      triangles.push([prev.i, ear.i, next.i]);\n      __removeVertex(ear);\n      ear = stop = next.n;\n      continue;\n    }\n    ear = next;\n    if (ear === stop) {\n      if (pass === 0) {\n        __earcutLinked(__removeColinear(ear), triangles, pred, 1);\n      } else if (pass === 1) {\n        ear = __cureLocalIntersections(\n          __removeColinear(ear),\n          triangles\n        );\n        __earcutLinked(ear, triangles, pred, 2);\n      } else if (pass === 2) {\n        __splitEarcut(ear, triangles, pred);\n      }\n      break;\n    }\n  }\n};\nconst __splitEarcut = (start, triangles, pred) => {\n  let a = start;\n  do {\n    let b = a.n.n;\n    while (b !== a.p) {\n      if (a.i !== b.i && __isValidDiagonal(a, b)) {\n        let c = __splitPolygon(a, b);\n        a = __removeColinear(a, a.n);\n        c = __removeColinear(c, c.n);\n        __earcutLinked(a, triangles, pred, 0);\n        __earcutLinked(c, triangles, pred, 0);\n        return;\n      }\n      b = b.n;\n    }\n    a = a.n;\n  } while (a !== start);\n};\nconst __splitPolygon = (a, b) => {\n  const a2 = new Vertex(a.i, a.x, a.y);\n  const b2 = new Vertex(b.i, b.x, b.y);\n  const an = a.n;\n  const bp = b.p;\n  a.n = b;\n  b.p = a;\n  a2.n = an;\n  an.p = a2;\n  b2.n = a2;\n  a2.p = b2;\n  bp.n = b2;\n  b2.p = bp;\n  return b2;\n};\nconst __isEdgeCentroidInside = (a, b) => {\n  const mx = (a.x + b.x) * 0.5;\n  const my = (a.y + b.y) * 0.5;\n  let v = a;\n  let inside = false;\n  do {\n    const { x: px, y: py, n: vn } = v;\n    if (vn.y !== py && py > my !== vn.y > my && mx < (vn.x - px) * (my - py) / (vn.y - py) + px)\n      inside = !inside;\n    v = vn;\n  } while (v !== a);\n  return inside;\n};\nconst __isLocallyInside = (a, b) => __area(a.p, a, a.n) < 0 ? __area(a, b, a.n) >= 0 && __area(a, a.p, b) >= 0 : __area(a, b, a.p) < 0 || __area(a, a.n, b) < 0;\nconst __intersectsPolygon = (a, b) => {\n  let v = a;\n  const ai = a.i;\n  const bi = b.i;\n  do {\n    if (v.i !== ai && v.i !== bi && v.n.i !== ai && v.n.i !== bi && __intersects(v, v.n, a, b))\n      return true;\n    v = v.n;\n  } while (v !== a);\n  return false;\n};\nconst __intersects = (p1, q1, p2, q2) => {\n  const o1 = sign(__area(p1, q1, p2));\n  const o2 = sign(__area(p1, q1, q2));\n  const o3 = sign(__area(p2, q2, p1));\n  const o4 = sign(__area(p2, q2, q1));\n  if (o1 !== o2 && o3 !== o4) return true;\n  if (o1 === 0 && __onSegment(p1, p2, q1)) return true;\n  if (o2 === 0 && __onSegment(p1, q2, q1)) return true;\n  if (o3 === 0 && __onSegment(p2, p1, q2)) return true;\n  if (o4 === 0 && __onSegment(p2, q1, q2)) return true;\n  return false;\n};\nconst __onSegment = ({ x: px, y: py }, { x: qx, y: qy }, { x: rx, y: ry }) => qx <= Math.max(px, rx) && qx >= Math.min(px, rx) && qy <= Math.max(py, ry) && qy >= Math.min(py, ry);\nconst __isValidDiagonal = (a, b) => a.n.i !== b.i && a.p.i !== b.i && !__intersectsPolygon(a, b) && (__isLocallyInside(a, b) && __isLocallyInside(b, a) && // locally visible\n__isEdgeCentroidInside(a, b) && // does not create opposite-facing sectors\n(__area(a.p, a, b.p) || __area(a, b.p, b)) || // special zero-length case\n__equals(a, b) && __area(a.p, a, a.n) > 0 && __area(b.p, b, b.n) > 0);\nconst __isPointInTriangle = ({ x, y }, ax, ay, bx, by, cx, cy) => (cx - x) * (ay - y) >= (ax - x) * (cy - y) && (ax - x) * (by - y) >= (bx - x) * (ay - y) && (bx - x) * (cy - y) >= (cx - x) * (by - y);\nconst __isPointInRect = ({ x, y }, x0, y0, x1, y1) => x >= x0 && x <= x1 && y >= y0 && y <= y1;\nconst __findLeftmost = (start) => {\n  let left = start;\n  let v = start;\n  do {\n    if (v.x < left.x || v.x === left.x && v.y < left.y) left = v;\n    v = v.n;\n  } while (v !== start);\n  return left;\n};\nconst __sortLinked = (list) => {\n  let numMerges;\n  let inSize = 1;\n  do {\n    let p = list;\n    let tail = list = null;\n    let q, e;\n    numMerges = 0;\n    while (p) {\n      numMerges++;\n      q = p;\n      let pSize = 0;\n      for (let i = 0; i < inSize; i++) {\n        pSize++;\n        q = q.nz;\n        if (!q) break;\n      }\n      let qSize = inSize;\n      while (pSize > 0 || qSize > 0 && q) {\n        if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n          e = p;\n          p = p.nz;\n          pSize--;\n        } else {\n          e = q;\n          q = q.nz;\n          qSize--;\n        }\n        if (tail) tail.nz = e;\n        else list = e;\n        e.pz = tail;\n        tail = e;\n      }\n      p = q;\n    }\n    tail.nz = null;\n    inSize *= 2;\n  } while (numMerges > 1);\n  return list;\n};\nconst __indexZCurve = (start) => {\n  let v = start;\n  do {\n    if (v.z < 0) v.z = mux2(v.x, v.y);\n    v.pz = v.p;\n    v = v.nz = v.n;\n  } while (v !== start);\n  v.pz.nz = v.pz = null;\n  __sortLinked(v);\n};\nconst __sectorContainsSector = (m, p) => __area(m.p, m, p.p) < 0 && __area(p.n, m, m.n) < 0;\nconst __findHoleBridge = (hole, outer) => {\n  const { x: hx, y: hy } = hole;\n  let v = outer;\n  let qx = -Infinity;\n  let px, py;\n  let pnx, pny;\n  let m;\n  do {\n    ({ x: px, y: py } = v);\n    ({ x: pnx, y: pny } = v.n);\n    if (hy <= py && hy >= pny && pny !== py) {\n      const x = px + (hy - py) * (pnx - px) / (pny - py);\n      if (x <= hx && x > qx) {\n        qx = x;\n        m = px < pnx ? v : v.n;\n        if (x === hx) return m;\n      }\n    }\n    v = v.n;\n  } while (v !== outer);\n  if (!m) return null;\n  const stop = m;\n  const { x: mx, y: my } = m;\n  let tanMin = Infinity;\n  let tan;\n  v = m;\n  do {\n    ({ x: px, y: py } = v);\n    if (hx >= px && px >= mx && hx !== px && __isPointInTriangle(\n      v,\n      hy < my ? hx : qx,\n      hy,\n      mx,\n      my,\n      hy < my ? qx : hx,\n      hy\n    )) {\n      tan = Math.abs(hy - py) / (hx - px);\n      if (__isLocallyInside(v, hole) && (tan < tanMin || tan === tanMin && (px > m.x || px === m.x && __sectorContainsSector(m, v)))) {\n        m = v;\n        tanMin = tan;\n      }\n    }\n    v = v.n;\n  } while (v !== stop);\n  return m;\n};\nconst __eliminateHole = (hole, outerNode) => {\n  const bridge = __findHoleBridge(hole, outerNode);\n  if (!bridge) return outerNode;\n  const bridgeReverse = __splitPolygon(bridge, hole);\n  __removeColinear(bridgeReverse, bridgeReverse.n);\n  return __removeColinear(bridge, bridge.n);\n};\nconst __eliminateHoles = (points, pids, holeIndices, outerNode) => {\n  const queue = [];\n  for (let i = 0, num = holeIndices.length - 1; i <= num; i++) {\n    const start = holeIndices[i];\n    const end = i < num ? holeIndices[i + 1] : points.length;\n    const list = __buildVertexList(points, pids, start, end, false);\n    if (list === list.n) list.s = true;\n    queue.push(__findLeftmost(list));\n  }\n  queue.sort((a, b) => a.x - b.x);\n  for (let i = 0, n = queue.length; i < n; i++) {\n    outerNode = __eliminateHole(queue[i], outerNode);\n  }\n  return outerNode;\n};\nconst __cureLocalIntersections = (start, triangles) => {\n  let v = start;\n  do {\n    const a = v.p;\n    const b = v.n.n;\n    if (!__equals(a, b) && __isLocallyInside(a, b) && __isLocallyInside(b, a) && __intersects(a, v, v.n, b)) {\n      triangles.push([a.i, v.i, b.i]);\n      __removeVertex(v);\n      __removeVertex(v.n);\n      v = start = b;\n    }\n    v = v.n;\n  } while (v !== start);\n  return __removeColinear(v);\n};\nconst __isEar = (ear) => {\n  const { p: a, n: c } = ear;\n  const b = ear;\n  if (__area(a, b, c) >= 0) return false;\n  const { x: ax, y: ay } = a, { x: bx, y: by } = b, { x: cx, y: cy } = c;\n  const [x0, y0, x1, y1] = __triBounds(ax, ay, bx, by, cx, cy);\n  let v = c.n;\n  while (v !== a) {\n    if (__isPointInRect(v, x0, y0, x1, y1) && __isPointInTriangle(v, ax, ay, bx, by, cx, cy) && __area(v.p, v, v.n) >= 0)\n      return false;\n    v = v.n;\n  }\n  return true;\n};\nconst __isEarHashed = (ear) => {\n  const { p: a, n: c } = ear;\n  const b = ear;\n  if (__area(a, b, c) >= 0) return false;\n  const { x: ax, y: ay } = a;\n  const { x: bx, y: by } = b;\n  const { x: cx, y: cy } = c;\n  const [x0, y0, x1, y1] = __triBounds(ax, ay, bx, by, cx, cy);\n  const minZ = mux2(x0, y0);\n  const maxZ = mux2(x1, y1);\n  const check = (v) => v !== a && v !== c && __isPointInRect(v, x0, y0, x1, y1) && __isPointInTriangle(v, ax, ay, bx, by, cx, cy) && __area(v.p, v, v.n) >= 0;\n  let { pz: p, nz: n } = ear;\n  while (p && p.z >= minZ && n && n.z <= maxZ) {\n    if (check(p) || check(n)) return false;\n    p = p.pz;\n    n = n.nz;\n  }\n  while (p && p.z >= minZ) {\n    if (check(p)) return false;\n    p = p.pz;\n  }\n  while (n && n.z <= maxZ) {\n    if (check(n)) return false;\n    n = n.nz;\n  }\n  return true;\n};\nconst __removeColinear = (start, end = start) => {\n  if (!start) return start;\n  let v = start;\n  let repeat;\n  do {\n    repeat = false;\n    if (!v.s && (__equals(v, v.n) || sign(__area(v.p, v, v.n)) === 0)) {\n      __removeVertex(v);\n      v = end = v.p;\n      if (v === v.n) break;\n      repeat = true;\n    } else {\n      v = v.n;\n    }\n  } while (repeat || v !== end);\n  return end;\n};\nconst __area = (a, { x: bx, y: by }, c) => (by - a.y) * (c.x - bx) - (bx - a.x) * (c.y - by);\nconst __signedArea = (points, start, end) => {\n  let sum = 0;\n  for (let i = start, j = end - 1; i < end; j = i, i++) {\n    const a = points[j];\n    const b = points[i];\n    sum += (a[0] - b[0]) * (a[1] + b[1]);\n  }\n  return sum;\n};\nconst __triBounds = (ax, ay, bx, by, cx, cy) => [\n  ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx,\n  ay < by ? ay < cy ? ay : cy : by < cy ? by : cy,\n  ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx,\n  ay > by ? ay > cy ? ay : cy : by > cy ? by : cy\n];\nconst __equals = (pa, b) => pa.x === b.x && pa.y === b.y;\nexport {\n  earCutComplex,\n  earCutComplexPrepare\n};\n","import { centroid } from \"@thi.ng/geom-poly-utils/centroid\";\nimport { addmN } from \"@thi.ng/vectors/addmn\";\nconst edgeSplit = (tess, faces, pids) => {\n  const points = tess.pointsForIDs(pids);\n  const c = tess.addPoint(centroid(points));\n  const n = pids.length - 1;\n  for (let i = 0; i <= n; i++) {\n    const j = i < n ? i + 1 : 0;\n    const m = tess.addPoint(addmN([], points[i], points[j], 0.5));\n    faces.push([c, pids[i], m], [c, m, pids[j]]);\n  }\n  return faces;\n};\nexport {\n  edgeSplit\n};\n","import { centroid } from \"@thi.ng/geom-poly-utils/centroid\";\nimport { mixN } from \"@thi.ng/vectors/mixn\";\nconst inset = (inset2 = 0.5, keepInterior = false) => (tess, faces, pids) => {\n  const points = tess.pointsForIDs(pids);\n  const c = centroid(points);\n  const insets = tess.addPoints(points.map((p) => mixN([], p, c, inset2)));\n  const n = pids.length - 1;\n  for (let i = 0; i <= n; i++) {\n    const j = i < n ? i + 1 : 0;\n    faces.push([pids[i], pids[j], insets[j], insets[i]]);\n  }\n  if (keepInterior) faces.push(insets);\n  return faces;\n};\nexport {\n  inset\n};\n","import { centroid } from \"@thi.ng/geom-poly-utils/centroid\";\nimport { addmN } from \"@thi.ng/vectors\";\nconst quadFan = (tess, faces, pids) => {\n  const points = tess.pointsForIDs(pids);\n  const c = tess.addPoint(centroid(points));\n  const n = pids.length - 1;\n  let m0 = tess.addPoint(addmN([], points[n], points[0], 0.5));\n  let mprev = m0;\n  for (let i = 0; i <= n; i++) {\n    const m = i < n ? tess.addPoint(addmN([], points[i], points[i + 1], 0.5)) : m0;\n    faces.push([c, mprev, pids[i], m]);\n    mprev = m;\n  }\n  return faces;\n};\nexport {\n  quadFan\n};\n","import { addmN } from \"@thi.ng/vectors/addmn\";\nconst rimTris = (tess, faces, pids) => {\n  const points = tess.pointsForIDs(pids);\n  const n = pids.length - 1;\n  const mids = [\n    tess.addPoint(addmN([], points[n], points[0], 0.5))\n  ];\n  let mprev = mids[0];\n  for (let i = 0; i <= n; i++) {\n    let m;\n    if (i < n) {\n      m = tess.addPoint(addmN([], points[i], points[i + 1], 0.5));\n      mids.push(m);\n    } else {\n      m = mids[0];\n    }\n    faces.push([mprev, pids[i], m]);\n    mprev = m;\n  }\n  faces.push(mids);\n  return faces;\n};\nexport {\n  rimTris\n};\n","import { centroid } from \"@thi.ng/geom-poly-utils/centroid\";\nconst triFan = (tess, faces, pids) => {\n  const c = tess.addPoint(centroid(tess.pointsForIDs(pids)));\n  const n = pids.length - 1;\n  for (let i = 0; i <= n; i++) {\n    faces.push([c, pids[i], pids[i < n ? i + 1 : 0]]);\n  }\n  return faces;\n};\nexport {\n  triFan\n};\n","const triFanBoundary = (_, faces, pids) => {\n  const c = pids[0];\n  const n = pids.length - 1;\n  for (let i = 1; i < n; i++) {\n    faces.push([c, pids[i], pids[i + 1]]);\n  }\n  return faces;\n};\nexport {\n  triFanBoundary\n};\n","import { centroid } from \"@thi.ng/geom-poly-utils/centroid\";\nimport { addmN } from \"@thi.ng/vectors/addmn\";\nconst triFanSplit = (tess, faces, pids) => {\n  const points = tess.pointsForIDs(pids);\n  const c = centroid(points);\n  const cid = tess.addPoint(c);\n  const n = pids.length - 1;\n  for (let i = 0; i <= n; i++) {\n    const j = i < n ? i + 1 : 0;\n    const a = points[i];\n    const b = points[j];\n    const mab = tess.addPoint(addmN([], a, b, 0.5));\n    const mac = tess.addPoint(addmN([], a, c, 0.5));\n    const mbc = tess.addPoint(addmN([], b, c, 0.5));\n    faces.push(\n      [pids[i], mab, mac],\n      [mab, pids[j], mbc],\n      [mac, mab, mbc],\n      [mac, mbc, cid]\n    );\n  }\n  return faces;\n};\nexport {\n  triFanSplit\n};\n"]}