摘要
命令M/m、L/m、H/h、V/v、C/c、S/s、Q/q、、T/t、A/a的坐标乘以比例ratio
特殊命令A/a(rx,ry,xr,laf,sf,x,y)
唯有A/a需要特殊处理,处理方式看代码
A/a(rx,ry,xr,laf,sf,x,y)因为xr是弧度,缩放比例,弧度不变,laf,sf是控制参数不需要缩放比例
代码举例:
function scalePath(pathD, scale) {
pathD = pathD.replace(/-/g, ' -')
pathD = pathD.replace(/[a-zA-Z][\s]/g, (match) => {
return match.replace(' ', '')
})
let pathCommandArr = pathD.match(/[A-Za-z][^A-Za-z]*/g);
let scaledPathD = pathCommandArr.map(command => {
let commandLetter = command.match(/[A-Za-z]/)[0];
let commandParams = command.match(/[^A-Za-z]+/g);
if (commandLetter === 'A' || commandLetter === 'a') {
let flag = /[ ,]+/
commandParams = commandParams[0].split(flag)
commandParams = commandParams.filter(num => num)
// 处理A命令的参数
let rx = parseFloat(commandParams[0]) * scale;
let ry = parseFloat(commandParams[1]) * scale;
let xAxisRotation = parseFloat(commandParams[2]);
let largeArcFlag = parseFloat(commandParams[3]);
let sweepFlag = parseFloat(commandParams[4]);
let x = parseFloat(commandParams[5]) * scale;
let y = parseFloat(commandParams[6]) * scale;
// 重新构建A命令的参数
return `${commandLetter}${rx},${ry},${xAxisRotation},${largeArcFlag},${sweepFlag},${x},${y}`;
} else {
if (!commandParams) return commandLetter
let flag = /[ ,]+/
commandParams = commandParams[0].split(flag)
commandParams = commandParams.filter(num => num)
// 处理其他命令的参数
let translatedParams = commandParams.map(param => {
return parseFloat(param) * scale;
});
return commandLetter + translatedParams.join(',');
}
}).join('');
// let move = getMove(scaledPathD)
return getPath(scaledPathD, pathD)
// return scaledPathD
}