25. P5不仅可以分析来自URL的小块信息,还可以分析来自新闻feed、文章、演讲或整本书的大块文本。Daniel引用的txt网站估计是被和谐了,总之我这此时此刻是打不开,因此,我胡乱搜索了一个P5官方版本变更说明的txt作为下例引用的txt地址,同样的,如果你在阅读本笔记的时候无法打开我现在使用的这个在线txt地址的话,你也可以上网自己搜索一个来用: PFont f; // 字体变量 String[] revisions; // 承载所有文本的数组 int counter = 1509; // 我们在文本文档中的位置 // 把标点和符号用于分界符 String delimiters = ” ,.?!;:[]+/()\”-#=_”; void setup() { size(200,200); f = createFont(“Lucida Sans”, 16); // 将文本文档载入字符串数组 String url = “http://processing.org/download/revisions.txt”; String[] rawtext = loadStrings(url); // 将数组整合为一个巨长的字符串 String everything = join(rawtext, “” ); // 文本文档中的所有行先是组合成一个长字符串然后分解成一个独立单子的数组 // 注意我们使用splitTokens()将全部标点和符号作为分界符. revisions [...]
1. 方法indexOf()返回一个关键字(或词)在字符串中的位置,它有一个引数:关键字。例如下例将返回数值3: String search = “def”; String toBeSearched = “abcdefghi”; int index = toBeSearched.indexOf(search); 2. 逐一println()一下下边诸例,数一数(记住一个字符串的第一位是0而不是1,因为他是一个数组,所以你应当从0数起),你便会了解它的用法: String sentence = “The quick brown fox jumps over the lazy dog.” ; println(sentence.indexOf(“quick”)); println(sentence.indexOf(“fo”)); println(sentence.indexOf(“The”)); println(sentence.indexOf(“blah blah”)); 3. 是的,试到上边最后一个例子的时候,你会发现它返回的值是-1。这是一个很好的选择,因为在数组序号中不存在-1,因此,当indexOf()找不到一个关键字的时候,返回值-1来表述是再合适不过的。 4. 一个字符串的一部分被称为子串(substring),一个子串可以藉由substring()函数得到。它有两个引数:开始和结束的位置。比如下例的结果为“def”: String alphabet = “abcdefghi” ; String sub = alphabet.substring(3,6); 5. 通过上例我们发现,子串开始于给定的开始位置(3),却结束于给定的结束位置减一(6)。减一的好处是,如果你需要的子串结束于字符串末尾,你可以方便的使用thestring.length(),同时,你可以用结束位置减去起始位置来简单的计算子串的长度。 6. 你可以这样从整个字符串中获取到”quick brown fox jumps over [...]
1. 本课我们要学一个新的类,称为字符串(string)。对我们来说,这并不是一个全新的概念,之前我们也曾接触过它们: println(“printing some text to the message window!”); // 列印一个字符串 PImage img = loadImage(“filename.jpg”); // 为文件名使用一个字符串 这样看起来,我们似乎可以简单的将字符串理解为“在双引号内的内容”。 2. 字符串的核心其实是储存字母数组,如果没有string类,那么我们要写一行字的代码可能会变成: char[] sometext = { ‘H’, ‘e’, ‘l’, ‘l’ , ‘o’ , ‘ ‘, ‘W’ , ‘o’ , ‘r’, ‘l’ , ‘d’}; 这么搞绝对会被搞死,如果使用string对象,世界立马变得简单美好起来: String sometext = ” 如何做一个字符串? 在引号间输入字符!”; 3. 我们必须记住,一个string是一个伴随方法(method)的对象。类似于PImage对象可以在存储一个图像数据的同时,还可以使用方法copy(), loadPixels()等等。对于string来说,一个方法是 charAt(),它可以返回一个字符串里给定序号的字母。同数组一样,字符串的第一个字母同为第0号。 4. 通过Daniel随后出的一题我意外的发现,在一个字符串内,空格也算一个“字母”,也占序号,无论这个空格出现在字符串内的任何地方。 5. [...]
1. 本章的学习需要一个外部摄像头(如果你使用PC则还需安装版本7或以上的QuickTime播放机,并在自定义安装时勾选”QuickTime for Java“。另外,你还需安装vdig(数字视频转换机)在Win系统内捕捉视频)的参与配合。具体安装方式请查阅你自己的摄像头使用帮助。 2. 是的,现在你会发现比起PC,Mac真是轻松许多。Mac的本子自带iSight摄像头,预装QuickTime,Mac用户无需进行任何恼人步骤便可轻松进入下一步。 3. 要在p5内使用视频,遵循以下步骤: ◎ 导入video库: import processing.video.*; ◎ 申明一个捕捉对象: Capture video; ◎ 初始化捕捉对象: video = new Capture(this,320,240,30); ※ this — 自参考指令(self-referential statement),原书唧唧歪歪扯一大堆,暂不考试,记得这里放this就OK。 ※ 320 — 摄像头捕捉视频的宽度 ※ 240 — 摄像头捕捉视频的高度 ※ 30 — 帧速率 ◎ 从摄像头读取图像 4. 有两种方式从摄像头读取帧。两种方式遵循的基本原则都是:我们只在当一个新帧准备好被读取时,从摄像头读取一个图像。要查询一个图片是否可用,我们使用available()函数,它以是否有东西存在返回真或假。如果有,函数read()被呼叫并且摄像头的帧被读入内存。我们在draw()反复这么做,总是查询是否有新的图像可用。 void draw() { if (video.available()) { video.read(); } } 5. 第二种方式,使用”事件(event)“的方式,即某个事件发生的时候便执行。比如鼠标点击或键盘输入。在视频这里,我们可以选择使用函数captureEvent(),使得每当一个捕捉动作发生时被执行,即,来自摄像头的一个新帧可用了。 void [...]
1. 载入一张图片: Code // 申明一个PImage类型的变量, 一个我们可用的存储于p5核心库内的类. PImage img; void setup() { size(320,240); // 通过载入一个图片文件创建一个新的PImage实例 img = loadImage("fuckyoubaby.jpg"); } void draw() { background(0); //image()函数在一个位置显示图片-本例位于点(0,0). image(img,0,0); } 这里,手贱的我又发现一点:如果你将你的这个sketch命名为PImage的话,点击运行p5会返回你错误:”cannot convert from PImage to PImage”。。。直到你重命名后才能正常运行。 2. 在上例内放入一张比size大的图片,运行,它将以原尺寸从左上角开始显示图片,你的size有多大,他就显示多大,没有缩放。 3. 要显示的图片必须位于本sketch文件夹下的data文件夹内(这也是p5载入外部文件的统一规矩)。 4. 我们需要注意,从硬盘载入图片相对来说是较慢的,因此我们应当确保我们的程序仅执行其一次,因此,应当将它放到setup()而不是draw()里。 5. 一旦图片被载入,它将被image()函数显示出来,这个函数必备三个引数:被显示的图片、x位置和y位置,另外,后边还可接两个备选参数:图像的宽和高(全图缩放)。 6. 让图片动起来: Code PImage dick; // 为图片文件准备的变量 float x,y; // 图片位置变量 float rot; // 图片旋转变量 [...]
1. z轴指任意一点的深度。这貌似很抽象,这么理解吧,x轴和y轴分别代表萤幕的宽和高,那么z轴就位于你萤幕的背后(负值)或之前(正值)。 2. 用二维的方式也可以做出三维的效果,比如下例展示一个由小变大的矩形,看起来就像它从远处向我们走来: Code float r = 8; void setup() { size(200,200); } void draw() { background(255); // 在萤幕中央显示一个矩形 stroke(0); fill(175); rectMode(CENTER); rect(width/2,height/2,r,r); // 增大矩形 r++ ; // 反复开启矩形的动态 if (r > width) { r = 0; } } 3. 幸运的是,Processing懂得透视,并选取适宜的二维像素来创建三维效果。我们应当认识到,在我们进入3D像素坐标的同时,一部分的控制必须交由p5的渲染器来完成。你不在能像控制2D图形那样精确的控制它们的像素位置,因为XY位置将被调整用来计算3D透视。 4. 下图为笛卡尔3D系统的坐标图示: 5. 注意,这么写是错误的: rect(x, y, z, w, h); 6. [...]