2011-06-16 191 views
7

我想繪製一個可調整大小的垂直線(基於頁面內容),但似乎是手繪的,而不是筆直的。如何使用svg/canvas繪製不規則/手繪線條?

我目前正在考慮使用SVG或Canvas來實現這一點。該行將在我的網頁側面運行,因此需要在容器的頂部和底部之間進行縮放。我怎樣才能做到這一點?

+0

聽起來很棘手。你確定你不能使用repeat-y背景圖片嗎? – nkorth 2011-06-16 13:47:38

+0

只要重複y,就意味着會出現線條沒有對齊的點,除非您在該圖案的末端着陸。 – Jeepstone 2011-06-16 14:10:56

+0

好吧,這只是用觸控板繪製的,但是我能夠使用它在GIMP中的剪切工具中工作:http://jsfiddle.net/nkorth/K6r3u/embedded/result/ – nkorth 2011-06-16 14:29:03

回答

10

所以你想畫一條線抖動?

嘗試繪製一串連續的貝塞爾曲線,所有的Y軸點部分均勻間隔,並隨機化x值一定量。

下面是一個例子,讓你開始:

var can = document.getElementById('canvas1'); 
 
var ctx = can.getContext('2d'); 
 

 
function addJitteryBezier(fromx, fromy, tox, toy) { 
 
var diffx = tox - fromx; 
 
var diffy = toy - fromy; 
 
    
 
var neg = Math.random()*diffy/5; // so the x value can go positive or negative from the typical 
 
    
 
    
 
ctx.bezierCurveTo(
 
-neg + fromx + 2*(Math.random()*diffy/8), fromy + .3*diffy, 
 
-neg + fromx + 2*(Math.random()*diffy/8), fromy + .6*diffy, 
 
tox, toy 
 
); 
 
} 
 

 
ctx.beginPath(); 
 
ctx.moveTo(50,0); 
 

 
var i = 0; 
 
while (i < 500) { 
 
    addJitteryBezier(50, i, 50, i+50); 
 
    i+= 50; 
 
} 
 

 
ctx.stroke();
<canvas id="canvas1" width="500" height="500"></canvas>

http://jsfiddle.net/GfGVE/9/

+0

正是我剛剛開始嘗試,但我沒有編碼畫布一段時間。 – nkorth 2011-06-16 13:57:37

+1

完美的例子西蒙。非常感謝。我也發現http://29a.ch/2010/2/10/hand-drawn-lines-algorithm-javascript-canvas-html5這沒問題。唯一的問題是線條有時會與曲線形成峯值。 – Jeepstone 2011-06-16 14:10:10

+0

是的,有辦法解決這個問題......如果曲線的最後控制點有一些真正的負X值,你會希望下一條曲線的FIRST控制點具有正值。所以你可以做一些額外的檢查,並確保第二條曲線的第一個控制點始終是相反的標誌。如果這聽起來令人困惑,我可以修改我的示例以顯示 – 2011-06-16 14:36:39