134 lines
3.7 KiB
JavaScript
134 lines
3.7 KiB
JavaScript
/*
|
||
* 抽取pathSegment中的关键点
|
||
* M,L,A,Q,H,V一个端点
|
||
* Q, S抽取一个端点,一个控制点
|
||
* C抽取一个端点,两个控制点
|
||
*/
|
||
function _getSegmentPoints(segment) {
|
||
var points = [];
|
||
switch (segment[0]) {
|
||
case 'M':
|
||
points.push([segment[1], segment[2]]);
|
||
break;
|
||
case 'L':
|
||
points.push([segment[1], segment[2]]);
|
||
break;
|
||
case 'A':
|
||
points.push([segment[6], segment[7]]);
|
||
break;
|
||
case 'Q':
|
||
points.push([segment[3], segment[4]]);
|
||
points.push([segment[1], segment[2]]);
|
||
break;
|
||
case 'T':
|
||
points.push([segment[1], segment[2]]);
|
||
break;
|
||
case 'C':
|
||
points.push([segment[5], segment[6]]);
|
||
points.push([segment[1], segment[2]]);
|
||
points.push([segment[3], segment[4]]);
|
||
break;
|
||
case 'S':
|
||
points.push([segment[3], segment[4]]);
|
||
points.push([segment[1], segment[2]]);
|
||
break;
|
||
case 'H':
|
||
points.push([segment[1], segment[1]]);
|
||
break;
|
||
case 'V':
|
||
points.push([segment[1], segment[1]]);
|
||
break;
|
||
default:
|
||
|
||
}
|
||
return points;
|
||
}
|
||
|
||
// 将两个点均分成count个点
|
||
function _splitPoints(points, former, count) {
|
||
var result = [].concat(points);
|
||
var index = void 0;
|
||
var t = 1 / (count + 1);
|
||
var formerEnd = _getSegmentPoints(former)[0];
|
||
for (var i = 1; i <= count; i++) {
|
||
t *= i;
|
||
index = Math.floor(points.length * t);
|
||
if (index === 0) {
|
||
result.unshift([formerEnd[0] * t + points[index][0] * (1 - t), formerEnd[1] * t + points[index][1] * (1 - t)]);
|
||
} else {
|
||
result.splice(index, 0, [formerEnd[0] * t + points[index][0] * (1 - t), formerEnd[1] * t + points[index][1] * (1 - t)]);
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
module.exports = function formatPath(fromPath, toPath) {
|
||
if (fromPath.length <= 1) {
|
||
return fromPath;
|
||
}
|
||
var points = void 0;
|
||
for (var i = 0; i < toPath.length; i++) {
|
||
if (fromPath[i][0] !== toPath[i][0]) {
|
||
// 获取fromPath的pathSegment的端点,根据toPath的指令对其改造
|
||
points = _getSegmentPoints(fromPath[i]);
|
||
switch (toPath[i][0]) {
|
||
case 'M':
|
||
fromPath[i] = ['M'].concat(points[0]);
|
||
break;
|
||
case 'L':
|
||
fromPath[i] = ['L'].concat(points[0]);
|
||
break;
|
||
case 'A':
|
||
fromPath[i] = [].concat(toPath[i]);
|
||
fromPath[i][6] = points[0][0];
|
||
fromPath[i][7] = points[0][1];
|
||
break;
|
||
case 'Q':
|
||
if (points.length < 2) {
|
||
if (i > 0) {
|
||
points = _splitPoints(points, fromPath[i - 1], 1);
|
||
} else {
|
||
fromPath[i] = toPath[i];
|
||
break;
|
||
}
|
||
}
|
||
fromPath[i] = ['Q'].concat(points.reduce(function (arr, i) {
|
||
return arr.concat(i);
|
||
}, []));
|
||
break;
|
||
case 'T':
|
||
fromPath[i] = ['T'].concat(points[0]);
|
||
break;
|
||
case 'C':
|
||
if (points.length < 3) {
|
||
if (i > 0) {
|
||
points = _splitPoints(points, fromPath[i - 1], 2);
|
||
} else {
|
||
fromPath[i] = toPath[i];
|
||
break;
|
||
}
|
||
}
|
||
fromPath[i] = ['C'].concat(points.reduce(function (arr, i) {
|
||
return arr.concat(i);
|
||
}, []));
|
||
break;
|
||
case 'S':
|
||
if (points.length < 2) {
|
||
if (i > 0) {
|
||
points = _splitPoints(points, fromPath[i - 1], 1);
|
||
} else {
|
||
fromPath[i] = toPath[i];
|
||
break;
|
||
}
|
||
}
|
||
fromPath[i] = ['S'].concat(points.reduce(function (arr, i) {
|
||
return arr.concat(i);
|
||
}, []));
|
||
break;
|
||
default:
|
||
fromPath[i] = toPath[i];
|
||
}
|
||
}
|
||
}
|
||
return fromPath;
|
||
}; |