2012-12-05 3 views
5

折れ線グラフを表す大きなSVGパス文字列を生成しています。ノード数を減らしてSVGパス文字列を簡略化する

グラフの下には、時間範囲スライスを選択するためのスライダがあります。スライダーの後ろには、折れ線グラフのミニプレビューがあります。

私は現在、プレビューを生成するためにパスを縮小していますが、そうすることで、ピクセルあたり数十のノードで終わってしまいます。したがって、もっと詳細が必要です。もちろんこれにより、ブラウザはそれ以上のレンダリングを行うことができます。

svg文字列(gzippingなど)の圧縮には多くの情報がありますが、実際にはノードを減らすことでパスを単純化するアルゴリズムはほとんどありません。

私はRaphaeljsを使用しており、javascriptベースのソリューションを探しています。何か案は?

+0

あなたはパス「D」属性の例がありますか?例: lostsource

+1

あなたはすでに大きな "resolution"パスを表示してロードしていますが、サムネイルに再度表示するとパフォーマンスが低下する経路を単純化するアルゴリズムを持つよりも。 – Duopixel

+0

@Duopixel:私はそれが本当であるとは思わない。同じパスがDOMに2回表示されます。私はブラウザがそれを最適化すれば非常に驚くだろう。また、私が理解しているように、ミニプレビューはフルパスと同じアスペクト比ではなく、ストロークの幅も異なる場合があります(フルサイズのチャートに対して少し重くするのが理にかなっています)。 –

答えて

11

Simplify.jsおそらくあなたが見ているものです。あなたの折れ線グラフが唯一の直線セグメントで構成さを考えると

(その定義により、それがなければならない)、あなたはこのようにそれを使用することができます:

var tolerance = 3 
    var pathSegArray = [] 
    for (var i=0; i<path.pathSegList.numberOfItems; i++) { 
    pathSegArray.push(path.pathSegList.getItem(i)) 
    } 
    var newPathArray = simplify(pathSegArray,tolerance) 
    var newD = "M"; 
    for (i=0; i<newPathArray.length; i++) { 
    newD += newPathArray[i].x + " " + newPathArray[i].y + " " 
    } 
    path.setAttribute("d",newD) 
+0

残念ながら、これはChromeではうまくいかないようです。 –

+3

Chromeで動作するようにコードを変更しました –

+0

カーブ、A、C、Q、T、Sコマンドなどには適していません。 – cuixiping

関連する問題