Raphaël - transformPath()返回行而不是曲线

Ras*_*car 4 javascript svg raphael

是否有可能让Raphael.transformPath()返回由行组成的路径而不是曲线构成的路径?

                var path = "M10,20L30,40";
                var trans = "t100,100s2,2";
                var trpath = Raphael.transformPath(path, trans);
                console.log('trpath: ' + trpath);
Run Code Online (Sandbox Code Playgroud)

将输出:

trpath: M100,110C100,110,140,150,140,150 
Run Code Online (Sandbox Code Playgroud)

我只用直线需要这条路!

Chr*_*son 5

很奇怪,不知道拉斐尔选择这样做的原因.但不是太难以解决:

如果您查阅.transformPath()方法的源代码,您将看到它是两个其他实用程序方法的组合:

transformPath = R.transformPath = function (path, transform) {
    return mapPath(path, toMatrix(path, transform));
}
Run Code Online (Sandbox Code Playgroud)

非常简单:.toMatrix()解析将字符串转换为矩阵,mapPath将该矩阵应用于路径字符串.

出于某种原因,mapPath包含对.path2curve()方法的调用,这就是您遇到问题的原因.所以我们需要获取该方法的源并修改它:

var mapPathStraight = function (path, matrix) {
    if (!matrix) {
        return path;
    }
    var x, y, i, j, ii, jj, pathi;
    //replace following line with .parsePathString(), which also parses path string into an array without adding curves
    //path = path2curve(path);
    path = Raphael.parsePathString(path);
    for (i = 0, ii = path.length; i < ii; i++) {
        pathi = path[i];
        for (j = 1, jj = pathi.length; j < jj; j += 2) {
            x = matrix.x(pathi[j], pathi[j + 1]);
            y = matrix.y(pathi[j], pathi[j + 1]);
            pathi[j] = x;
            pathi[j + 1] = y;
        }
    }
    return path;
};
Run Code Online (Sandbox Code Playgroud)

现在我们可以像这样实现一条直线:

var trpath = mapPathStraight(path, Raphael.toMatrix(path, trans));
Run Code Online (Sandbox Code Playgroud)

这给了我一个输出:

trpath: M100,110L140,150 
Run Code Online (Sandbox Code Playgroud)

这是jsFiddle