UNPKG

@orca-fe/x-map

Version:
47 lines (46 loc) 1.65 kB
// 二阶贝塞尔函数 export function bezier2(start, c, end) { return function (t) { return (1 - t) * (1 - t) * start + 2 * t * (1 - t) * c + t * t * end; // return start - (2 * (start - c)) * t - (2 * c - start - end) * t ** 2; }; } // 二阶贝塞尔函数的面积公式 export function bezier2Area(start, c, end) { return function (t) { return start * t - (start - c) * Math.pow(t, 2) - ((2 * c - start - end) / 3) * Math.pow(t, 3); }; } // 三阶贝塞尔函数 export function bezier3(start, c1, c2, end) { return function (t) { return (start * (1 - t) * (1 - t) * (1 - t) + 3 * c1 * t * (1 - t) * (1 - t) + 3 * c2 * t * t * (1 - t) + end * t * t * t); }; } // 专为地图组合的 zoom 参数变化函数 export function bezierMapZoom(startZoom, middleZoom, endZoom) { const bezierFrom = bezier2(startZoom, middleZoom, middleZoom); const bezierTo = bezier2(middleZoom, middleZoom, endZoom); return function (t) { if (t < 0.5) { return bezierFrom(t * 2); } return bezierTo(t * 2 - 1); }; } // 专为地图组合的 其他viewport 参数变化函数 export function bezierMapPan() { const bezierFromArea = bezier2Area(0, 1, 1); const bezierToArea = bezier2Area(1, 1, 0); const maxArea = bezierFromArea(1) + bezierToArea(1); return function (t) { let area = 0; if (t <= 0.5) { area = bezierFromArea(t * 2); } else { area = bezierFromArea(1) + bezierToArea(t * 2 - 1); } return area / maxArea; }; }