2014-12-05 291 views
0

SVG /帆布草圖如何使用JavaScript使用JavaScript來創建漫畫風格/手抖動

我知道xkcd風格JS繪圖儀和this文章的創建與漫畫風格/手抖動SVG /帆布草圖。 請注意,我不是要求重複繪製,而是繪製任何類型的素描,線條,形狀,文字等等。

使用JS有什麼更多的方法/技術?

編輯:經過思考並閱讀了一些關於此的內容之後,我決定實現我自己的JS庫,爲SVG和HTML5畫布提供卡通風格繪畫。 它被稱爲comic.js,可以找到here

+0

像鉛筆工具? – 2014-12-05 17:15:38

+0

不 - 我的意思是以編程方式繪製使用命令,如「線」,「圓」,... – 2014-12-05 17:20:07

+3

你見過這篇文章?它走過了幾個畫布技術http://perfectionkills.com/exploring-canvas-drawing-techniques/ – Ghan 2014-12-05 17:25:24

回答

1

我會使用Canvas庫來做到這一點,只是爲了簡化操作圖形。

我會尋找的是Paper.jsFabric.js。 但是,我將專注於Paper.js,因爲它是我一起工作的人。


所以,你必須形狀,現在該怎麼辦?

  • 可以flatten他們(它們細分成段,增加更多的 頂點其幾何形狀)。您可以增加細分 區間,這會導致每個 路徑的頂點/節點數量較多。細分間隔是 flatten函數的參數maxDistance

  • 然後,您可以沿着每個路徑/形狀的頂點行走,並將每個 移動一定程度(例如,摹1-2像素隨機方向),通過使用position.xposition.y

如果這是你的意思是:

Jittered Shape through Curve Subdivision. a jsFiddle screenshot

那麼這裏是代碼

//STEP 1 -- create shapes, a circle and rectangle in this example 

var myCircle = new Path.Circle(new Point(100, 70), 50); 
myCircle.strokeColor = 'white'; 
myCircle.strokeWidth = 2; 

var mySquare = new Rectangle(new Point(350, 250), new Point(190, 100)); 
var square = new Path.Rectangle(mySquare); 
square.strokeColor = 'white'; 
square.strokeWidth = 2; 

//STEP 2 -- Subdivide the shapes into segments. Parameter here is the max distance we walk along-the-path before adding a new vertex 

myCircle.flatten(5); 
square.flatten(4); 


//STEP 3 -- Loop through the segment points of the path and move each to a random value between 1 and 4 

for (var i = 0; i < myCircle.segments.length; i++) { //loop for circle 
    myCircle.segments[i].point.x += getRandomInt(1,3); 
    myCircle.segments[i].point.y += getRandomInt(1,3); 
}; 

for (var i = 0; i < square.segments.length; i++){ //loop for square 
    square.segments[i].point.x += getRandomInt(1,3); 
    square.segments[i].point.y += getRandomInt(1,3); 
}; 


//draw the paper view 
view.draw(); 


//Utility function that returns a random integer within a range 
function getRandomInt(min, max) { 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
} 

,這是jsFiddle


這個方案的問題是你的畫布上的每個「點」是一個對象和大量的點/節點/頂點是有點重了瀏覽器來處理。所以如果你的設計很複雜並且/或者你想讓用戶與你的圖畫交互(這種交互可能會遲緩),這可能是一個障礙。

或者您可以使用普通老式帆布要做到這一點,沒有任何庫,但我不會那麼做,因爲我聞到了需要算法手動繪製形狀,然後在這些算法產生抖動。就計算時間而言,這會更快,,但實現起來會比較困難,因爲Canvas是一種低級別的東西 - 它只記住像素,並且需要自己滾動數據結構要記住形狀,他們的位置等等。

+0

由於我的問題被封鎖,這是我接受它的唯一答案。感謝你寫這篇文章,我同意這是一種可能的方式。然而,我認爲如果使用現有的圖形庫,那麼應該考慮將「漫畫」從任何特定的lib中抽象出來:編寫一個採用通用格式的節點並引入漫畫噪聲並將其返回的庫。 – 2014-12-07 17:47:20

+0

是的,這聽起來很酷。如果我有更多的時間,我會寫一個函數來擴展路徑的開始/結束部分,以便使用您的術語來查看更多*通用*。如果您正在使用'SVG路徑',那麼該庫很容易構建,因爲它們已經包含節點,並且確實是矢量形狀。但是,如果我們正在討論類似於上面提出的解決方案的解決方案,那麼畫布會需要一個已經模仿矢量形狀基礎的庫,比如節點,這很難構建。 – 2014-12-07 18:53:42

+0

所以基本上我實現了我們一直在談論的 - 看看我上面的鏈接:) – 2014-12-16 16:34:20