假期的時候,偶然間獲知了Processing這門語言,在瞭解了它簡單的語法,和通用的編程規則後,我進行了一些嘗試。前端
頗有意思的一個編程環境。以簡化了的Java來實現圖像繪製和設計的工做。其中蘊含着的數學物理知識,讓我感覺到了不一樣學科之間關聯的一條如有若無的連線。java
爲了更爲熟悉改語言的內容和規則,我特地找了兩本書來看。一本書至關基礎的《愛上processing》(密碼: kdg3),這本書,只要是有點編程基礎的同窗,基本上是三四個小時就能夠看完的。我很快就翻完了。以後便找到了今天的主角——《Processing權威指南》。這本書能夠說是很是之厚了。將近七百頁,我花了兩週纔看完,固然,也是「有選擇性的通讀」。編程
看完以後,作個記錄,畢竟,這本書的內容除了介紹Processing語言自己的技巧規則外,更多的是引導讀者去了解、接觸到一些新潮藝術家們的藝術創做旅程中。書中有不少訪談,記錄許多傑出的藝術創做者們關於靈感與技術等方面的思考,值得一看。數組
並且這本書,從頭至尾提到了不少編程語言的基礎概念,也基本上說清楚了一門面向對象的語言的基本概念。甚至能夠當作是一個對於Java語言學習的前奏。只不過這個前奏可能更歡快輕鬆些。網絡
固然,這本書也爲讀者更進一步的參與到創做中,實現本身的靈感提供了一些技術上的引導,介紹了不少關於2D&3D圖像、聲音、視頻、網絡、電子&移動設備、打印格式等其餘屬於Processing自己具有或者是第三方支持功能領域的知識。爲咱們更進一步的瞭解到Processing創做的可能性提供了一個更爲全面的認知。less
歸根到底,創意終究是最重要的。dom
其餘的都只是裝飾而已。編程語言
可是,若是連起碼的裝飾都沒有的話,那麼,絢爛的創意也是一片蒼白。函數
Processing語言其實是一個Java的子集。因此不少方面均可以看到Java的影子。工具
好比說下面這個稍微複雜點的例子
import gifAnimation.*; GifMaker gifExport; // 聲明對象 int [][] grid, futureGrid; void setup() { size(940, 500); frameRate(8); grid = new int [width][height]; // 目前的圖像像素數組 futureGrid = new int [width][height]; // 下一刻狀態數組 // 設定初始狀態 float density = 0.3 * width * height; for (int i = 0; i < density; i++) { grid[int(random(width))][int(random(height))] = 1; } background(0); // 設定gif導出相關參數 gifExport = new GifMaker(this, "2D_CA.gif"); gifExport.setRepeat(0); // make it an "endless" animation gifExport.setTransparent(0,0,0); // black is transparent } void draw() { for (int x = 1; x < width - 1; x++) { for (int y = 1; y < height - 1; y++) { // 「活着的」相鄰細胞數目 int nb = neighbors(x, y); if ((grid[x][y] == 1) && (nb < 2)) { futureGrid[x][y] = 0; set(x, y, color(0)); } else if ((grid[x][y] == 1) && (nb > 3)) { futureGrid[x][y] = 0; set(x, y, color(0)); } else if ((grid[x][y] == 0) && (nb == 3)) { futureGrid[x][y] = 1; set(x, y, color(255)); } else { futureGrid[x][y] = grid[x][y]; } } } int [][] temp = grid; grid = futureGrid; futureGrid = temp; gifExport.setDelay(1); gifExport.addFrame(); } // 統計「活着的」相鄰細胞數目 int neighbors (int x, int y) { int north = (y + height - 1) % height; int south = (y + 1) % height; int east = (x + 1) % width; int west = (x + width - 1) % width; return grid[x][north] + grid[east][north] + grid[east][y] + grid[east][south] + grid[x][south] + grid[west][south] + grid[west][y] + grid[west][north]; } void mousePressed() { gifExport.finish(); // write file noLoop(); }
這是一個二維的細胞自動機的例子。只不過在書中原有基礎上添加了點生成gif圖的部分。利用了第三方庫 —— gifAnimathion
import gifAnimation.*;
庫的導入,對象的聲明
GifMaker gifExport;
都和Java是一致的。相似於Processing的姊妹項目Arduino的編程,是由兩個主要的函數 void setup(){}
,void draw(){}
構成了程序基本的初始化和自動循環。全局變量須要在外部開頭聲明。
變量聲明,流程控制(書中例程多用循環與條件,可見,循環判斷纔是關鍵)與Java基本一致。
下面說說Processing的簡化後的優點之處。
書中在附錄詳細比對了設計們經常使用的幾種語言的關於使用時的簡介程度,固然,Processing天然是最簡單的。畢竟自己就是一門簡化後的語言。基本上全部的編寫核心都是圍繞繪圖控制圖像來的。
從最基本的繪製直線,圓,矩形,多邊形等簡單基本圖形,到複雜的改變座標系,以及利用循環條件結構進行稍複雜運動的表現,再到經過模仿物理規律從而展示出更爲靈活多變的複雜情形,都是能夠經過簡單的幾句代碼來實現的。並且參數的設置也是頗有規律的。
好比說這個例子
void setup() { size(100, 100); } void draw() { background(204); diagonals(40, 90); diagonals(60, 62); diagonals(20, 40); } void diagonals(int x, int y) { line(x, y, x+20, y-40); line(x+10, y, x+30, y-40); line(x+20, y, x+40, y-40); }
這段代碼主要是利用了自定義的函數diagonals()
實現了劃線的功能,能夠看到,這裏使用的劃線函數line()
,用法是極其簡單明晰的。前兩點爲起點座標,後兩點爲終點座標。兩點定義線段,多麼直接,明確。其餘的相似的基礎函數都是差很少的結構與使用方法,因此說,上手的話,看《愛上processing》(密碼: kdg3)基本就夠了。
哦,對,要注意,最基本的是使用二維直角座標系,默認原點爲窗口左上角,x軸向右,y軸向下。
相較其餘語言,Processing設計出來就是爲了提供給藝術家們一門簡單直接,又足夠強大的工具來進行創造設計。因此說,註定了它會有不少的擴展與延伸。
對的,它有不少功能庫,實現了不少方面的功能。官方有一個庫列表,在其主頁上能夠找到。可是使用各類庫的時候,要注意版本。可能會有不兼容。
各類各樣的庫實現了各方面的功能。在開頭我提到的2D&3D圖像、聲音、視頻、網絡、電子&移動設備等等都有相關的支持。
你甚至能夠用它做爲Arduino的數據處理前端,由於它能夠處理端口的數據。
雖然,它只有一百多個庫,可是,少而精纔是現狀,不用擔憂社區的力量,只需創意便可。
利用工具實現靈感的關鍵仍是在於用工具的規則去不斷的貼合你的想法。
可是難點就在於如何將腦子裏抽象的靈感,或者是動態的複雜的場景用規則化的,流程化的語言構造出來。這些都是在你實際上手的時候所須要關注的。
就像以前個人一個小嚐試。
float num_lines; // 連線的數目 float x_0, y_0; // 連線的起始點 void setup() { size(500, 500); smooth(); } void draw() { frameRate(10); // 下降幀率 background(255); // 白色背景 num_lines = random(0, 10); // 隨機連線數目 for(int i = 0; i < 1000; i++) { point(random(0, 500), random(0, 500)); // 背景隨機點繪製 } for(int i = 0; i < num_lines; i++) { x_0 = mouseX + random(-50, 50); y_0 = mouseY + random(-50, 50); line(x_0, y_0, mouseX, mouseY); // 鼠標連線 noFill(); // 無填充 ellipse(mouseX, mouseY, x_0, y_0);// 繪製隨機高寬的圓 } }
就是爲了實如今背景上週圍隨機出現點,而後令鼠標附近的幾個點隨機的與鼠標連線,相似於一些網站頁面裏利用Js實現的那種花哨的顯示效果,但是最後只能作成這個樣子。爲了更「花哨」,我又加了一堆隨機的圓。(^__^) 嘻嘻……
前面所說,都是我這段時間來學習的一個小的想法的彙總。
實際上,我感受本身接觸到的只是皮毛,由於語言的使用是要切合實際的應用的,不然也只是空中樓臺,毫無用處。
在這本書裏,後面介紹了一些比較複雜的設計思路,也就是利用了物理數學知識來實現一些更爲美妙規律的視覺效果。
實際上,這本書讓我對於這門語言的使用的關鍵——須要結合更爲有力,更爲邏輯的知識,來實現更爲美妙魔幻的構思——有了更爲切實的瞭解。而其餘的,都是手冊知識而已,總覽全局後,會查手冊就好。