2013-02-04 38 views
4

是否有可能得到Raphael.transformPath()返回由線構成的路徑而不是由曲線構成的路徑?Raphaël - 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 

我需要的只有直線這條路!

回答

5

奇怪,不確定拉斐爾爲什麼選擇這樣做。但是不可過於用力要解決:如果您諮詢the source的.transformPath()方法

,你會看到,它是其他兩個實用方法的複合材料:

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

漂亮的直線前進:.toMatrix()將該變換字符串解析爲矩陣,mapPath將該矩陣應用於路徑字符串。

出於某種原因,mapPath包含對.path2curve() method的調用,這就是您遇到問題的原因。因此,我們需要grab the source該法並修改它:

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

+0

對不起,延遲。非常感謝你,這真的很好! – Rascar

+0

發現這非常有用,但是在某些情況下,需要使用.path2curve()方法。特別是嘗試「M100,100A100,100,0,1,0,101,100」,當你嘗試渲染時,你會得到NaN的結果和一個令人討厭的錯誤。 – Charles