2016-12-09 2 views
0

私はRailsアプリケーションでSVG piechartを作成しようとしています。私はほとんどの時間で動作するメソッドを書いたことがありますが、時には奇妙な結果を生じることがあります。このパイチャートでSVGパスが間違って描画されるのはなぜですか?

enter image description here

このチャートは、1つのセグメントを除き、正しく構築されています!

セグメントは

<path d='M0,0 L99.99949084376563,0.3191096796332688 A100,100 0 **0,0** 99.99893303088741,0.46194445996738664 Z' fill='#136F7F' /> 

であると私は問題の原因は、私は**に包まれてきた値であってもよいと思うことを作成するSVGコード(星は実際のコードには存在しません!)。

次の方法でチャートを作成しています。ここでは、キー値ペアのハッシュとしてdataを指定しています。

svg = "<svg viewBox='-100 -100 200 200'>" 
data.each do |d| 
svg += "<path d='M0,0 L#{previous_x},#{previous_y} A100,100 0 #{x <= 0 ? 1 : 0},#{y <= 0 ? 1 : 0} #{x},#{y} Z' fill='#{col[i]}' fill-opacity='1' />" 
end 
svg += "</svg>" 

xyは100

乗じ、ラジアンセグメントの角度の余弦および正弦いる私は正しいlarge-arc-flagsweep-flag値を設定し、これらはに時々セグメントを引き起こしているものであるアム失敗します?

+0

を決定しますsreeenshot ...開始点はエンドポイントとほぼ同じです... –

+0

ありがとう@Holger私はハッキングしているので、これをチェックするコードを再生成する必要があります。私は質問を編集します。その間、私の理解が正しいことを確認することができます。パイのセグメントが> 50%の場合、large-arc-flagは1になります。それ以外の場合は0になります。しかし、私は自分の問題がスイープフラッグにあると思う。どのような条件で旗の変化を掃除する必要がありますか?私は仕様を完全に理解していません!私が見ることのできるところから見ると、パイは4つの組み合わせのうちの2つ、つまり> 50%の円弧に応じて1,0または0,1のうちの2つしか必要としません。しかし、これは事実ではないようですか? –

+1

心配しないで!私はセグメント%を計算していたやり方で愚かな間違いを犯しました。すべて今働いている! –

答えて

0

2点を結ぶ円弧には4つの解決策があります。ブルーアークが小さな青いアーチが緑色の円の中心

  • 大周りに反時計回りに描かれている反時計回り、時計回りグリーンアーク(スイープフラグ)
  • に描かれ

    • 次の画像に 青いアーチは、青い丸の中心の周りに反時計回りに描かれている。
    • 小さな緑色アーチが大きい緑色アーチが 暗いアークが小さい円弧である緑色の円の中心の周りcclockwiseに描かれ
    • 青色の円の中心の周りに時計方向に描かれ、ライターアークは大きな弧は(大きいです-arcフラグ)

    どのアークをレンダリングするかを指示するには、大きな円弧と掃引フラグの組み合わせを使用します。スイープフラグを使用すると、投稿セグメントは、セグメントに等しくない方向(時計回り、反時計回り)に大きなアークフラグのサイズ(大アーチ、小円弧)deteremines

    <svg width="200" height="200" viewBox="-150 -250 400 400"> 
     
    
     
    
     
        <g fill="none" stroke="black" stroke-width="5"> 
     
        <path d="M25.88 -96.59 A100 100 0 0 0 96.59 -25.88" stroke="darkblue" /> 
     
        <path d="M25.88 -96.59 A100 100 0 1 0 96.59 -25.88" stroke="lightblue" /> 
     
        <path d="M25.88 -96.59 A100 100 0 0 1 96.59 -25.88" stroke="darkgreen" /> 
     
        <path d="M25.88 -96.59 A100 100 0 1 1 96.59 -25.88" stroke="lime" /> 
     
        </g> 
     
        <g fill="red" stroke="red"> 
     
        <circle cx="25.88" cy="-96.59" r="5" /> 
     
        <circle cx="96.59" cy="-25.88" r="5" /> 
     
        </g> 
     
    </svg> 
     
    <br/> 
     
    <ul> 
     
        <li> 
     
        the blue arcs are drawn counter clockwise, the green arcs clockwise (sweep flag) 
     
        </li> 
     
        <li> 
     
        the small blue arch is drawn counter clockwise around the center of the green circle 
     
        </li> 
     
        <li> 
     
        the large blue arch is drawn counter clockwise around the center of the bleu circle. 
     
        </li> 
     
        <li> 
     
        the small green arch is drawn clockwise around the center of the blue circle 
     
        </li> 
     
        <li> 
     
        the large green arch is drawn cclockwise around the center of the green circle 
     
        </li> 
     
        <li>the darker arcs are small arcs, the lighter arcs are large arcs (large-arc flag)</li> 
     
    </ul>

  • 関連する問題