4

Raphael.transformPath()に、曲線で構成されたパスではなく、線で構成されたパスを返すようにすることは可能ですか?

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

出力します:

trpath: M100,110C100,110,140,150,140,150 

直線だけのこの道が必要です!

4

1 に答える 1

5

奇妙なことに、なぜラファエルがこれを選択したのかわかりません。しかし、回避するのはそれほど難しくありません:

.transformPath()メソッドのソースを調べると、他の2つのユーティリティメソッドの複合であることがわかります。

transformPath = R.transformPath = function (path, transform) {
    return mapPath(path, toMatrix(path, transform));
}

非常に簡単です。.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;
};

これで、次のような直線を作成できます。

var trpath = mapPathStraight(path, Raphael.toMatrix(path, trans));

これは私に次の出力を与えます:

trpath: M100,110L140,150 

これがjsFiddleです

于 2013-02-04T19:05:11.957 に答える