---恢復內容開始---
Hi,今天我又來日更了!恩,已經三天了,不知道哪天就要結束了.......我還是盡量多持久。話說,博客園上的博客基本
都是屬於大體量但是數量少的,大部分人的數量都小於10篇......看來我已經打敗了30%以上(自己瞎猜的)博客了!
值得慶賀的第十一篇博客,那么我就開個新坑好了。
這一次我要開的坑是processing。雖然之前做of時就說過要做processing了,不過這一次還是比我預定要早的,不過,
有需求就會有產出,反正遲早都要做,不如現在就做!所以,今天開始processing的坑!of那邊也會做的,不過要過
幾天......而且要出java基礎的教程了,還有processing成品(demo等級的)的教程,還要把網絡部分的教程繼續下去。
話說,上次我clone processing沒成功......學校網坑死人。我打算再開新的教程講講別的用法還有別的好網站什么的。
那么,雖然今天廢話比較多,還是開始教學了。
Processing溯源
其實,人類有一種本能——制造工具。更准確的說,是制造自己最順手的工具。現在看來,這一習慣無疑是極其適合
人類發展的,因為從舊石器到新石器,再到銅器鐵器,很明顯工具的變化不僅是科技進步的成果,更是造成科技進步
的一大原因。

(我就盜圖了,百度你來揍我啊!!^_^話說這表情還是真專注)
所以我扯了這么多是想干啥呢?其實,在程序員的世界中也是有着兩種人的,其中一種就是制造成品的人,另一種是
制造工具的人。不過制作工具有另一種專門的稱呼:造輪子。為什么?因為輪子是一種已經存在了的人造品,而且被
證明很有效。但是,你仍可以造各種各樣的輪子:大的小的、粗的細的、有花紋的帶刺的等等。
編程的工具更是如此:不同項目對於編程工具的要求往往千差萬別——但是,每個工具之間雖然十分相像卻又有着很大
的差距,學習使用一個新的工具總是要花費很多時間和精力。而且,對於初學者來說,有些工具就顯得過於強大而難於
學習了。所以,processing就誕生了。它就是一個專注於展示與原型開發的工具;適於快速開發和算法效果展示。
of其實可以算是processing的C++翻版,不過我認為,of還是要更難一些——畢竟C++。而且processing還用自己的
ide,可以允許一些Java原生情況下不可能產生的寫法,可以減少很多時間,對於Java來說簡直是救急(笑)。
首先先感謝凱西 瑞思和本 弗萊兩位mit的革命老前輩給我們這些懶懶的偽程序員提供了這樣易用的工具,然后,開始
我們的第一個processing程序吧!
No,we'll not use “Hello world”!
很多的編程語言上來的第一個示范程序都長得一個樣子,比如:
C:
#include <stdio.h> int main() { printf("Hello world!"); return 0; }
C++:
#include <iostream> int main() { std::cout<<"Hello world?"<<endl; return 0; }
Java:
public static void main(String[] args) { System.out.println("Hello world!"); return; }
那么效果是什么呢?就是在又黑又小的控制台里輸出一行文字:Hello world!這玩意有什么用啊!!!咱們學processing的肯定
不會這樣!processing是以顯示界面為前提的,不畫圖還玩個毛!好的,寫個processing類的hello world!
ellipse(50,50,20,20);
對,就一行,你把這個輸入到processing里面就好了。等下,你說你沒有裝Java?沒有下processing?我這次不管。每次都要從
環境搭建開始講簡直浪費時間——交給Java的教程來說好了!就是這么簡單粗暴。(不過以后會翻譯processing官方的教程,里面
應該會有)
如果你點擊一下開始按鈕,你就會發現出現了一個四四方方的小窗口,里面有一個小圓。

(如圖)
恭喜你,你已經做到了那些剛開始學C學半年都做不到的等級——圖形界面了!
我來解釋一下這行代碼——ellipse()這個函數是用來畫一個橢圓。你發現其中有四個參數,50,50,20,20前兩個用於確定橢圓的位置,
后兩個決定橢圓的寬度與高度。
如果繼續介紹這些api下去的話,我可以再寫個幾百行,很明顯那就不是一個教程了,所以我下面就進入我今天的整體:圖像顯示軟件了。
不過API什么的,我會在別的文章里面寫的。感興趣的同學不要錯過。
導入圖像就是這么簡單
首先講講一個比較有規模的processing程序的標准格式:
void setup() { //calls only once } void draw() { //calls per tick }
什么意思呢?setup函數和draw函數,這兩個函數,是你接入程序的入口,在setup里,你可以寫一些第一次進入程序時需要
做的東西,draw中寫那些每一幀要調用的東西。如果你看過我的of教程,就會發現,這與of中的setup函數和draw函數完全
一樣;不過of里面還有update函數,個人覺得只是好看,並沒有足夠的必要性。
那么,我們來說說怎么導入圖片。
在processing中,有一些預制好了的類型,比如XML,PFont,Pimage等等。其中,Pimage就是圖片的預制類,可以支持
很多的格式。而且用起來也非常方便——馬上就來試試。
你可以打開一下help里面的reference這一項,會召出一個網頁,里面是processing的參考文檔,是學習processing的第一手
資料,推薦大家多去查查。(這也是我使用pde的重要原因之一)找到里面的Pimage一項,你可以看到一個不錯的例子。
PImage photo; void setup() { size(100, 100); photo = loadImage("laDefense.jpg"); } void draw() { image(photo, 0, 0); }
你如果直接點開會報錯並且無法進行....畢竟沒有文件。所以,現在去找一張圖片來,然后把里面loadImage一句的“laDefense.jpg”
改成你選擇的圖片的名稱。比如我選擇了“chubbyTwo.jpg”這張圖片——對了,以防萬一,我說一下:圖片要放在程序路徑下。
然后你就可以看到如下圖(圖不一樣效果肯定不一樣)

好的,圖片瀏覽器就講到這里了!今天下課!
......我覺得這樣應該還不夠,算了,多講點,算是特惠!
Level UP
那具體怎么提升呢?
首先我們看看PImage的文檔,發現image函數有很多種參數,其中只有兩個參數的這個是不可以重新指定大小的,
需要寫四個參數的那個。加上的兩個參數是寬度和高度。
(窗口默認尺寸是100X100,可以通過size函數改變)

(選擇了二胖的照片,不知看到chubbyTwo時大家有沒有想到)
然后我們發現還是不爽,這個拉伸的好難看啊!
沒事,我們有法子!
介紹一個新函數map,它的作用是 映 射 。是不是覺得聽不懂?恩,看來我翻譯的不錯!其實就是把一個數
從一個范圍轉到另一個范圍。這里,我們打算把圖片以原本的寬高比顯示,空出來的用黑邊,然后居中顯示。
具體做法如下:
- 判斷是寬大還是高大(因為這里的顯示區域是寬高相等的,如果做不等的的話,就需要比寬高比)
- 把比較大的那個賦值為400,另一個用map映射為適應的大小
- 算出應該平移的大小
- 畫圖
然后,我直接貼代碼:
PImage photo; int photoWidth=0; int photoHeight=0; int startX=0; int startY=0; void setup() { size(400, 400); photo = loadImage("chubbyTwo.jpg"); photoWidth = photo.width; photoHeight = photo.height; if(photoWidth>photoHeight) { photoHeight = (int)map(photoHeight,0,photoWidth,0,400); photoWidth = 400; startX = 0; startY = (int)((400-photoHeight)/2.0); } else { photoWidth = (int)map(photoWidth,0,photoHeight,0,400); photoHeight = 400; startY = (int)((400-photoWidth)/2.0); startX = 400; } } void draw() { background(0); image(photo, startX, startY,photoWidth,photoHeight); }
(效果圖)

基本就是這樣,可以到這里看到它在github上的樣子,興許我以后還會更新呢?
總之,明天見!!
---恢復內容結束---
