我使用此在线工具http://www.professorcloud.com/svg-to-canvas/将SVG图像转换为canvas js命令

现在,我向您展示该代码的一部分:

...
ctx.beginPath();
ctx.moveTo(1080.756,172.244);
ctx.lineTo(1077.382,175.618);
ctx.lineTo(1079.223,177.458);
ctx.lineTo(1081.677,175.004);
ctx.lineTo(1082.903,171.63);
ctx.lineTo(1080.756,172.244);
ctx.closePath();
ctx.fill();
ctx.stroke();



ctx.beginPath();
ctx.moveTo(1089.039,169.79);
ctx.lineTo(1091.492,169.79);
ctx.quadraticCurveTo(1091.492,169.79,1091.492,169.79);
ctx.lineTo(1091.492,171.32399999999998);
ctx.quadraticCurveTo(1091.492,171.32399999999998,1091.492,171.32399999999998);
ctx.lineTo(1089.039,171.32399999999998);
ctx.quadraticCurveTo(1089.039,171.32399999999998,1089.039,171.32399999999998);
ctx.quadraticCurveTo(1089.039,169.79,1089.039,169.79);
ctx.lineTo(1089.039,169.79);
ctx.closePath();
ctx.fill();
ctx.stroke();
...


代码的每个beginPath-closePath段都在画布上绘制单独的对象。
当我想对该对象做进一步的操作时,我需要将以下命令列表转换为紧凑的结构:

a = [
    {
        name: 'name1',
        coords: [
            ['m',21,22],
            ['l',[1,2], [3,4], [5,6]],
            ['b',7,8,9,10],
            ['l',[11,12],[13,14]]
        ]
    },
    {
        name: 'name2',
        coords: [
            ['m',21,22],
            ['l',[21,22], [23,4], [5,6]],
            ['b',[27,28,9,10], [11,12,13,14]],
            ['l',[211,212],[213,214]]
        ]
    }
];


我想将每个单独的对象转换为js对象{}。并且在该对象中,'coords'属性将具有所有js画布函数并以数组方式进行协调。其中第一个字母表示功能(moveTolineTo等),然后是-该功能的参数。但是这里还有一点是,如果我有多行lineTo函数,我想将它们组合到一个数组中。所以当我有这样的代码时:

ctx.lineTo(1,2);
ctx.lineTo(3,4);


我希望将其转化为

['l',[1,2], [3,4]]


而不是

['l',[1,2]],
['l',[3,4]]


我应该怎么做?
无法看到使用php regex的方法。
我看到了循环中的解决方案以及多个preg_match es和if子句,但我确实希望看到一个更简单的解决方案。

最佳答案

Underscore.js[ ['l',[1,2]],...,['l',[3,4]] ]转换为['l',[1,2],...,[3,4]]的魔法

function compact_arr(data) { // helper function
  return _.union(data[0][0], _.pluck(data, [1]))
}

接下来,扫描coords:将连续的“ l”(或“ b”或“ m”)集分组,并在每个组上调用compact_arr()

09-30 14:20
查看更多