2012-03-27 4 views
0

私はcanvascontextにいくつかの追加のdraw関数を書いています。下のコードは、破線または通常の線で丸い四角形を描くようにユーザーに知らせるべきです。これはほぼ完全に動作するコードですが、図の最後には丸みを帯びたコーナーに追加の線が描かれています(私はその問題の写真を含めました)。この問題は、破線の四角形を描画する場合にのみ発生し、他のバージョンは完全に機能することに注意してください。丸い四角の破線

if (window.CanvasRenderingContext2D && CanvasRenderingContext2D.prototype.lineTo){ 
     CanvasRenderingContext2D.prototype.dashedLine = function(pt1, pt2, dashLen) { 
       if (dashLen == undefined) dashLen = 6; 

       var dX = pt2.x - pt1.x; 
       var dY = pt2.y - pt1.y; 
       var dashes = Math.floor(Math.sqrt(dX * dX + dY * dY)/dashLen); 
       var dashX = dX/dashes; 
       var dashY = dY/dashes; 

       var q = 0; 
       while (q++ < dashes) { 
       pt1.x += dashX; 
       pt1.y += dashY; 
       this[q % 2 == 0 ? 'moveTo' : 'lineTo'](pt1.x, pt1.y); 
       } 
       this[q % 2 == 0 ? 'moveTo' : 'lineTo'](pt2.x, pt2.y); 
      }; 
     CanvasRenderingContext2D.prototype.roundRectangle = function(pt1, pt2, pt3, pt4, dashed, dashLen) { 
       function line(ctx, x1, y1, x2, y2, dashed) { 
       if (dashed) ctx.dashedLine({x:x1, y:y1}, {x:x2, y:y2}); 
       else { 
        ctx.lineTo(x2,y2);} 
       } 
       var radius = 8; 
       this.beginPath(); 
       line(this, pt1.x + radius, pt1.y, pt2.x - radius, pt2.y, dashed); 
       this.quadraticCurveTo(pt2.x, pt2.y, pt2.x, pt2.y + radius); 
       line(this, pt2.x, pt2.y + radius, pt3.x, pt3.y - radius, dashed); 
       this.quadraticCurveTo(pt3.x, pt3.y, pt3.x - radius, pt3.y); 
       line(this, pt3.x - radius, pt3.y, pt4.x + radius, pt4.y, dashed); 
       this.quadraticCurveTo(pt4.x, pt4.y, pt4.x, pt4.y - radius); 
       line(this, pt4.x, pt4.y - radius, pt1.x, pt1.y + radius, dashed); 
       this.quadraticCurveTo(pt1.x, pt1.y, pt1.x + radius, pt1.y); 

       this.closePath(); 
       this.stroke(); 
       this.fill(); 
     } 

}

enter image description here

誰もがここでの問題何ができるか知っていますか?

答えて

1

this.closePath();行は最後の直線を追加します。ただそれを削除します。

また、より良い結果を得るために、this.beginPath();行を削除し、代わりに、次のいずれかを追加します。

this.moveTo(pt1.x + radius, pt1.y); 

が変更されたコードを確認してください:http://jsfiddle.net/W8b3e/

+0

は、その問題を解決するためのありがとう、私はしたかったです背景が色付けされるように塗りつぶしオプションを追加します。私がこれをすると、二次曲線領域だけが着色されているので、私はその経路が必要です。私はここでコードを変更しました:http://jsfiddle.net/W8b3e/2/ – Consec

関連する問題