@orca-fe/x-map
Version:
47 lines (46 loc) • 1.65 kB
JavaScript
// 二阶贝塞尔函数
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;
};
}