{"version":3,"file":"corner.min.cjs","sources":["../../../../../../src/in/packages/corner/src/helper.ts","../../../../../../src/in/packages/corner/src/PathCorner.ts","../../../../../../src/in/packages/corner/src/index.ts"],"sourcesContent":["import { BezierHelper } from '@leafer-ui/draw'\n\n\n// 获取圆角切线距离\nexport function getTangentDistance(r: number, x: number, y: number, lastX: number, lastY: number, nextX: number, nextY: number): number {\n    // 1. 构造入射向量 U (P -> lastP) 和出射向量 V (P -> nextP)\n    const ux = lastX - x, uy = lastY - y\n    const vx = nextX - x, vy = nextY - y\n\n    // 2. 计算向量长度（平方和开方）\n    const lenU = Math.sqrt(ux * ux + uy * uy)\n    const lenV = Math.sqrt(vx * vx + vy * vy)\n\n    // 3. 边界防御：若线段长度几乎为0，则不产生圆角\n    if (lenU < 0.001 || lenV < 0.001) return 0\n\n    // 4. 计算向量夹角余弦值 cos(θ) = (U·V) / (|U|*|V|)\n    const cosTheta = (ux * vx + uy * vy) / (lenU * lenV)\n\n    // 5. 精度钳位：防止浮点误差导致 cos 越界 [-1, 1]，避开分母为0的情况\n    const safeCos = Math.max(-0.99999, Math.min(0.99999, cosTheta))\n\n    // 6. 核心几何推导：d = r * sqrt((1 - cosθ) / (1 + cosθ))\n    let d = r * Math.sqrt((1 - safeCos) / (1 + safeCos))\n\n    // 7. 【关键性能与安全约束】：最大距离不得超过相邻边长的一半\n    // 这样可以确保相邻顶点的圆角不会发生几何重叠或路径自交。\n    const maxD = Math.min(lenU / 2, lenV / 2)\n    return Math.min(d, maxD)\n}\n\n// 精准定位贝塞尔曲线参数 t\nexport function getCorrectT(d: number, x: number, y: number, x1: number, y1: number, x2: number, y2: number, toX: number, toY: number): number {\n    if (d <= 0) return 0\n\n    // 1. 预估总弦长（起点到终点的直线距离）\n    const chordLen = Math.sqrt((toX - x) ** 2 + (toY - y) ** 2)\n\n    // 2. 边界保护：若要求的距离超过弦长，为了路径安全，强制限制在曲线 50% 处\n    if (d >= chordLen) return 0.5\n\n    // 3. 初始猜测值估算：利用 t=0 处的瞬时速度矢量 v(0) = 3*(P1 - P0)\n    const vx0 = 3 * (x1 - x)\n    const vy0 = 3 * (y1 - y)\n    let v0mag = Math.sqrt(vx0 * vx0 + vy0 * vy0)\n\n    // 【优化点】：若起点与控制点重合（初速度为0），降级使用弦长线性比例，防止 NaN\n    if (v0mag < 1e-6) v0mag = chordLen || 1\n\n    let t = Math.min(0.5, d / v0mag)\n    const tempP = { x: 0, y: 0 }\n\n    // 4. 牛顿迭代 (Newton-Raphson) 循环\n    for (let i = 0; i < 5; i++) {\n        // 获取当前参数 t 对应的坐标点\n        BezierHelper.getPointAndSet(t, x, y, x1, y1, x2, y2, toX, toY, tempP)\n\n        const dx = tempP.x - x\n        const dy = tempP.y - y\n        const currentDist = Math.sqrt(dx * dx + dy * dy)\n\n        // 数值稳定性检查：若当前点过于靠近起点，尝试向外探测\n        if (currentDist < 1e-6) {\n            t = t * 1.5\n            continue\n        }\n\n        // 计算当前 t 处的导数向量 (x', y')\n        const vxt = BezierHelper.getDerivative(t, x, x1, x2, toX)\n        const vyt = BezierHelper.getDerivative(t, y, y1, y2, toY)\n\n        // 计算目标函数的导数 f'(t) = (dx*x' + dy*y') / currentDist\n        const f_prime = (dx * vxt + dy * vyt) / currentDist\n\n        // 如果导数过小，说明进入平台期或计算异常，停止迭代\n        if (Math.abs(f_prime) < 1e-6) break\n\n        // 牛顿法公式：t_next = t - f(t) / f'(t)\n        const deltaT = (currentDist - d) / f_prime\n        const nextT = t - deltaT\n\n        // 【收敛域保护】：强制限制在 [0, 0.6] 范围内寻找最优解，防止迭代跳出贝塞尔曲线有效区间\n        const safeNextT = Math.max(0, Math.min(0.6, nextT))\n\n        // 精度满足 1e-5 (像素级精度) 提前退出\n        if (Math.abs(safeNextT - t) < 1e-5) {\n            t = safeNextT\n            break\n        }\n        t = safeNextT\n    }\n\n    // 最终返回结果，上限截断在 0.5 处，确保圆弧不会占据整条曲线导致形状崩坏\n    return Math.max(0, Math.min(0.5, t))\n}","import { IPathCommandData, IPathCommandDataWithRadius, IPointData } from '@leafer-ui/interface'\nimport { PathCorner, PointHelper, PathCommandMap as Command, PathNumberCommandLengthMap, isArray, isUndefined, PathCommandDataHelper, BezierHelper, PathConvert } from '@leafer-ui/draw'\n\nimport { getCorrectT, getTangentDistance } from './helper'\n\n\nconst { M, L, C, Z } = Command, { abs } = Math\nconst { getCenterX, getCenterY } = PointHelper\nconst { arcTo } = PathCommandDataHelper\n\nPathCorner.smooth = function smooth(data: IPathCommandData, cornerRadius: number, _cornerSmoothing?: number): IPathCommandData {\n\n    const radius = (data as any as IPathCommandDataWithRadius).radius // 独立圆角\n    if (isNeedConvert(data)) data = PathConvert.toCanvasData(data, true)\n    else data = [...data] // 防止C命令修改数据造成污染\n\n    let command: number, lastCommand: number, commandLen\n    let i = 0, countCommand = 0, x = 0, y = 0, startX = 0, startY = 0, startR = 0, secondX = 0, secondY = 0, lastX = 0, lastY = 0, r: number, x1: number, y1: number, x2: number, y2: number, toX: number, toY: number\n    if (isArray(cornerRadius)) cornerRadius = cornerRadius[0] || 0\n\n    const len = data.length, three = len === 9 // 3个点时可以加大圆角\n    const smooth: IPathCommandData = []\n\n    while (i < len) {\n        command = data[i]\n        r = radius ? (isUndefined(radius[countCommand]) ? cornerRadius : radius[countCommand]) : cornerRadius\n        switch (command) {\n            case M:  //moveto(x, y)\n                startX = lastX = data[i + 1]\n                startY = lastY = data[i + 2]\n                startR = r\n                i += 3\n                const end = findEndPoint(data, i)\n                switch (data[i]) { // next command\n                    case L: // lineTo()\n                        secondX = data[i + 1]\n                        secondY = data[i + 2]\n                        if (three) smooth.push(M, startX, startY)\n                        else {\n                            if (end) smooth.push(M, getCenterX(startX, secondX), getCenterY(startY, secondY))\n                            else smooth.push(M, startX, startY)\n                        }\n                        break\n                    case C: // bezierCurveTo()\n                        if (end) {\n                            const { left, right } = setAfterC(data, i, r, end.x, end.y, startX, startY, data[i + 1], data[i + 2], data[i + 3], data[i + 4], data[i + 5], data[i + 6])\n                            if (left && right) {\n                                smooth.push(M, secondX = left[4], secondY = left[5])\n                                break\n                            }\n                        }\n                    default:\n                        smooth.push(M, secondX = startX, secondY = startY)\n                }\n                break\n            case L:  //lineto(x, y)\n                x = data[i + 1]\n                y = data[i + 2]\n                i += 3\n                switch (data[i]) { // next command\n                    case L: // lineTo()\n                        arcTo(smooth, x, y, data[i + 1], data[i + 2], r, lastX, lastY, three) // use arcTo(x1, y1, x2, y2, radius)\n                        break\n                    case C: // bezierCurveTo()\n                        const { left, right } = setAfterC(data, i, r, lastX, lastY, x, y, data[i + 1], data[i + 2], data[i + 3], data[i + 4], data[i + 5], data[i + 6])\n                        if (left && right) arcTo(smooth, x, y, left[4], left[5], r, lastX, lastY, three)\n                        else smooth.push(L, x, y)\n                        break\n                    case Z: // closePath()\n                        arcTo(smooth, x, y, startX, startY, r, lastX, lastY, three) // use arcTo(x1, y1, x2, y2, radius)\n                        break\n                    default:\n                        smooth.push(L, x, y)\n                }\n                lastX = x\n                lastY = y\n                break\n            case C:\n                x1 = data[i + 1]\n                y1 = data[i + 2]\n                x2 = data[i + 3]\n                y2 = data[i + 4]\n                x = data[i + 5]\n                y = data[i + 6]\n                i += 7\n                switch (data[i]) { // next command\n                    case L: // lineTo()\n                        toX = data[i + 1], toY = data[i + 2]\n                        setBeforeC(smooth, r, lastX, lastY, x1, y1, x2, y2, x, y, toX, toY, three)\n                        break\n                    case C: //\n                        smooth.push(C, x1, y1, x2, y2, x, y)\n                        break\n                    case Z: // closePath()\n                        toX = startX, toY = startY\n                        setBeforeC(smooth, r, lastX, lastY, x1, y1, x2, y2, x, y, toX, toY, three)\n                        break\n                    default:\n                        smooth.push(C, x1, y1, x2, y2, x, y)\n                }\n                lastX = x\n                lastY = y\n                break\n            case Z:  //closepath()\n                if (lastCommand !== Z) { // fix: 重复的 Z 导致的问题\n                    arcTo(smooth, startX, startY, secondX, secondY, startR, lastX, lastY, three) // use arcTo(x1, y1, x2, y2, radius)\n                    smooth.push(Z)\n                }\n                i += 1\n                break\n            default:\n                commandLen = PathNumberCommandLengthMap[command]\n                for (let j = 0; j < commandLen; j++) smooth.push(data[i + j])\n                i += commandLen\n        }\n        lastCommand = command\n        countCommand++\n    }\n\n    return smooth\n}\n\n\nfunction isNeedConvert(data: IPathCommandData): boolean {\n    let command: number, i = 0\n    const len = data.length\n    while (i < len) {\n        command = data[i]\n        switch (command) {\n            case M:  //moveto(x, y)\n                i += 3\n                break\n            case L:  //lineto(x, y)\n                i += 3\n                break\n            case C: // bezierCurveTo()\n                i += 7\n                break\n            case Z:  //closepath()\n                i += 1\n                break\n            default:\n                return true\n        }\n    }\n    return false\n}\n\nfunction findEndPoint(data: IPathCommandData, i: number): IPointData {\n    let command: number, commandLen: number, x: number, y: number\n    const len = data.length\n    while (i < len) {\n        command = data[i]\n        switch (command) {\n            case M:  //moveto(x, y)\n                return undefined\n            case L:  //lineto(x, y)\n                x = data[i + 1]\n                y = data[i + 2]\n                i += 3\n                break\n            case C: // bezierCurveTo()\n                x = data[i + 5]\n                y = data[i + 6]\n                i += 7\n                break\n            case Z:  //closepath()\n                return { x, y }\n            default:\n                commandLen = PathNumberCommandLengthMap[command]\n                i += commandLen\n        }\n    }\n    return undefined\n}\n\n\nfunction setAfterC(data: IPathCommandData, i: number, cornerRadius: number, lastX: number, lastY: number, fromX: number, fromY: number, x1: number, y1: number, x2: number, y2: number, toX: number, toY: number) {\n    let targetX = x1, targetY = y1\n    if (isSame(x1, fromX) && isSame(y1, fromY)) {\n        targetX = x2; targetY = y2\n        if (isSame(x2, fromX) && isSame(y2, fromY)) {\n            targetX = toX; targetY = toY\n        }\n    }\n\n    const d = getTangentDistance(cornerRadius, fromX, fromY, lastX, lastY, targetX, targetY)\n    const t = getCorrectT(d, fromX, fromY, x1, y1, x2, y2, toX, toY)\n    const two = BezierHelper.cut(t, fromX, fromY, x1, y1, x2, y2, toX, toY)\n    const { left, right } = two\n\n    if (left && right) {\n        data[i + 1] = right[0]; data[i + 2] = right[1]\n        data[i + 3] = right[2]; data[i + 4] = right[3]\n    }\n\n    return two\n}\n\nfunction setBeforeC(smooth: IPathCommandData, cornerRadius: number, fromX: number, fromY: number, x1: number, y1: number, x2: number, y2: number, toX: number, toY: number, nextX: number, nextY: number, three: boolean) {\n    let targetX = x2, targetY = y2\n    if (isSame(targetX, toX) && isSame(targetY, toY)) {\n        targetX = x1; targetY = y1\n        if (isSame(targetX, toX) && isSame(targetY, toY)) {\n            targetX = fromX; targetY = fromY\n        }\n    }\n\n    const d = getTangentDistance(cornerRadius, toX, toY, targetX, targetY, nextX, nextY) // 反向\n    const t = getCorrectT(d, toX, toY, x2, y2, x1, y1, fromX, fromY) // 反向\n    const { left, right } = BezierHelper.cut(1 - t, fromX, fromY, x1, y1, x2, y2, toX, toY)\n\n    if (left && right) {\n        smooth.push(C, left[0], left[1], left[2], left[3], left[4], left[5])\n        arcTo(smooth, toX, toY, nextX, nextY, cornerRadius, left[4], left[5], three)\n    } else {\n        smooth.push(C, x1, y1, x2, y2, toX, toY)\n    }\n}\n\n\nfunction isSame(a: number, b: number): boolean {\n    return abs(a - b) < 0.01\n}","import { Plugin } from '@leafer-ui/draw'\nimport './PathCorner'\n\n\nPlugin.add('corner')"],"names":["getTangentDistance","r","x","y","lastX","lastY","nextX","nextY","ux","uy","vx","vy","lenU","Math","sqrt","lenV","cosTheta","safeCos","max","min","d","maxD","getCorrectT","x1","y1","x2","y2","toX","toY","chordLen","pow","vx0","vy0","v0mag","t","tempP","i","BezierHelper","getPointAndSet","dx","dy","currentDist","f_prime","getDerivative","abs","nextT","safeNextT","M","L","C","Z","Command","getCenterX","getCenterY","PointHelper","arcTo","PathCommandDataHelper","findEndPoint","data","command","commandLen","len","length","PathNumberCommandLengthMap","setAfterC","cornerRadius","fromX","fromY","targetX","targetY","isSame","two","cut","left","right","setBeforeC","smooth","three","push","a","b","PathCorner","_cornerSmoothing","radius","lastCommand","isNeedConvert","PathConvert","toCanvasData","countCommand","startX","startY","startR","secondX","secondY","isArray","isUndefined","end","j","Plugin","add"],"mappings":"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"}