2016-09-17 10 views
0

この質問は、私がsvgとd3.jsを学ぶために書いているSnakes and Laddersゲームです。現在SVG/d3.jsのパスを正しく閉じる方法がわからない

http://codepen.io/geewhizbang/full/YGWZWv

私はいくつかの素晴らしいsnakyヘビの代わりに、私が前に描いた太い実線を持っています。しかし、私はそれらを適切に閉じさせる方法を知らない。

var path = gameBoard.append('path') 
    .attr("id", "snake" + snakeIndex) 
    .attr("d", cardinalInterpolator(data)) 
    .attr('stroke-width', 0) 
    .attr('fill', 'none'); 

    hotSpots[snake[0]] = { path: "snake" + snakeIndex, xOffset: 0, yOffset: 0, endPosition: parseInt(snake[snake.length-1]) }; 

    var pathNode = path.node(); 

    setSeededRandom(snake); 

    var odd = true; 
    var dataDown = []; 
    var dataUp = []; 

    for (var i = 0; i < snake.length - 1; i++) { 
     var width = snakeStroke * (10 + (odd ? (1 + getSeededRandom(4)) : getSeededRandom(4)))/6; 
     var point = data[i]; 

     var tangentPoints = getTangentPoints(pathNode, getClosestPositionInfo(pathNode, point).length, width); 
     var rotatedPoints = rotatePoints(tangentPoints.p1, tangentPoints.p2, Math.PI/2); 

     dataDown.push(rotatedPoints.p1); 
     dataUp.push(rotatedPoints.p2); 
    } 
    var lastPoint = data[data.length - 1]; 
    dataDown.push(lastPoint); 
    dataUp.push(lastPoint); 
    dataUp.reverse(); 

    var dDown = cardinalInterpolator(dataDown); 
    var dUp = cardinalInterpolator(dataUp); 
    var connector = linearInterpolator([dataUp[dataUp.length - 1], dataDown[0]]); 

問題はここにある:めちゃめちゃヘビのいずれかの

gameBoard.append('path') 
     .attr("d", dDown + dUp + connector + "Z") 
     .attr('stroke-width', 1) 
     .attr('fill', config.snakeColor) 
     .attr('stroke', config.snakeOutlineColor); 

} 

"D" 属性は次のとおりです。

M154.59472020467123,30.816396077473968Q151.03003730773926,47.616497294108065,147.703857421875、 53.25049845377603C142.71458759307862,61.70150019327799,121.74338811238607,79.31515172322591,121.33292134602864,87.15640767415364S140.6673505147298,96.09899927775064,144.9674123128255,105.5255381266276Q147.83412017822263,111.80989735921223,150,150M150,150Q140.52832641601563,116。 41847635904949,136.79989115397137,110.04224141438803C131.20723826090497,100.47788899739584,112.20209986368816,95.41289850870768,112.7156473795573,86.23765055338542S135.3200963973999,57.4320287068685,140.22354125976562,48.87392171223959Q143.49250450134278,43.16851704915365,145.40527979532877,29.183603922526032M145.40527979532877,29.183603922526032L154.59472020467123,30.816396077473968Z

+0

エラーメッセージはありません。 – GeeWhizBang

+0

'Z'はあなたのパスの最後のポイントから最初のものまで' lineTo'を実行します。きれいな形をしたい場合は、逆ベジェ曲線を使って出発点に戻る必要があります。 – Kaiido

+0

最後のセグメントに行を挿入します。私は上に描画する最後の円でアーティファクトを隠すことができます。私はちょうど適切な場所で曲線を閉じる方法が必要です。しかし、それは最後の要素として指定された幾何学的に正確な線でもパスを閉じるためにベースに線を描画します – GeeWhizBang

答えて

1

私がしなければならなかったことは、前のパスの最後のポイントを削除し、次のパスマイナス最初の文字 "M"を追加することでした。私も最後の点を追加しました。繰り返された点は、私が第二の経路から単に「M」を取り除いたときの問題でした。

.attr("d", dDown.replace(/([0-9\.]*\,[0-9\.]*$)/, "") 
    + dUp.substr(1) + "L" + dataDown[0].x + "," + dataDown[0].y + "Z") 

他の誰かが最後の点にQパラメータを持っている可能性があり、それをキャッチするためにいくつかのより洗練された正規表現を行う必要があります場合、私は知りません。しかし、私の道のりはどれもありません。

関連する問題