一番端详之后,准备挑出其中Processing和Prefuse两位大将出来一展雄威!
?
(备注:上次和此次“solo show”都未提及gephi,并不是说它不入流,不上档次,恰恰它是一款高大上、优秀的可视化工具,只是这两篇都是在笔者继初探gephi
源码绊脚后对一些工具的探讨对比,所以没有将其入列。)
?
?
?
1.Processing:
?
Processing 的最初目标是开发图形的 sketchbook 和环境,用来形象地教授计算机科学的基础知识。之后,它逐渐演变成了可用于创建图形可视化专业项目的一种环境。
?
Processing 是用 Java
编程语言写的。
?
Processing的API地址:http://processing.org/reference/ 有如何着色、画线、呈现图形图像等介绍。
?
http://processing.org/reference/javadoc/core/
?
官网地址:http://www.processing.org/
?
Processing开发的是Java Applet应用程序。Java小程序,也就是Java Applet,可以在Web
浏览器中运行。
Java Applet必须以
?
但是Java Applet有自己的短处,效率低,需要JVM支持,没有成型的IDE工具。Java小程序,也就是Java Applet,可以在Web浏览器中运行。Java Applet必须以
?
下面简要介绍Processing API的一部分:
?
Processing 应用程序是有一定结构的,这一点在开发能够持续运行且随时更改显示窗口的图形应用程序(比动画)时非常重要。在这种情况下,就凸显了 setup 和 draw 这两个函数的重要性。
?
setup() 函数用于初始化,由 Processing 运行时执行一次。通常,setup() 函数包含 size ()函数(用于定义窗口的边界)以及在操作期间要使用的变量的初始化。Processing 运行时会不断执行 draw ()函数。每次 draw() 函数结束后,就会在显示窗口绘制一个新的画面,并且 draw() 函数也会被再次调用。默认的绘制速度是每秒 60 个画面,但是您也可以通过调用 frameRate() 函数来更改这个速度。
?
此外,还可以使用 noLoop() 和 draw() 来控制在何时绘制画面。noLoop() 函数会导致绘制停止,而使用 loop ()函数则可以重新开始绘制。通过调用redraw() 可以控制 draw 在何时调用。
?
size() 关键字指定显示窗口的 X 和 Y 坐标。 size ()接受可选的第三个参数 mode。 mode 用来定义要使用的呈现引擎并支持 PDF(直接呈现为 Adobe? PDF 文档)、OPENGL (利用一个可用的 Open-GL 图形适配器)、P3D(为了迅速的 3-D 呈现)等。默认的是 JAVA2D,它最适合于高质量的 2-D 成像。
?
可以使用 get() 操作来读取显示中的一个给定像素点的颜色。虽然 set() 很简单,但它不是操做显示的最快方式。要想快速访问,可以使用pixels 数组(与 loadPixels 和 updatePixels 函数一致)。
?
在 Processing 内使用单个函数绘制形状十分简单。要设置在绘制形状时使用何种颜色,可以利用 stroke ()函数。此函数可接受一个单独的灰度参数或三个 RGB 参数。此外,还可以用 fill 命令定义这个形状的填充色。
?
line() 函数接受四个参数,代表的是要在其间绘制线条的点。rect ()函数可绘制一个矩形,并且前两个点定义位置,而后面两个点则分别定义宽度和高度。ellipse ()函数也接受四个参数,分别定义位置和宽/高度。当宽和高相等时,就是一个圆形。还可以使用 ellipseMode() 函数定制椭圆,它指定 x,y 位置是否代表了椭圆的角(CORNER)或中心(CENTER)。
?
? quad() 可以很容易地绘制有四个边的多边形。四边形接受八个参数,代表的是这个四边形的四个顶点。
?
Processing支持对于键盘和鼠标的事件监听,如keyPressed()、keyRealeased()、mousePressed()、mouseMoved()等。
?
?
但是Processing不像下面要介绍的Prefuse已经集成有布局算法了。
?
参考资料:http://www.ibm.com/developerworks/cn/opensource/os-datavis/
?
下面是在Processing客户端运行的一个demo(当然也可以在Eclipse/Myeclipse中运行,需要安装Processing的插件):
?
复制代码
?1 void setup() {
?2 ? size(640, 360, P3D);
?3 ? noStroke();
?4 }
?5?
?6 void draw() {
?7 ? background(0);
?8 ? translate(width / 2, height / 2);
?9 ??
10 ? // Orange point light on the right
11 ? pointLight(150, 100, 0, // Color
12 ? ? ? ? ? ? ?200, -150, 0); // Position
13?
14 ? // Blue directional light from the left
15 ? directionalLight(0, 102, 255, // Color
16 ? ? ? ? ? ? ? ? ? ?1, 0, 0); // The x-, y-, z-axis direction
17?
18 ? // Yellow spotlight from the front
19 ? spotLight(255, 255, 109, // Color
20 ? ? ? ? ? ? 0, 40, 200, // Position
21 ? ? ? ? ? ? 0, -0.5, -0.5, // Direction
22 ? ? ? ? ? ? PI / 2, 2); // Angle, concentration
23 ??
24 ? rotateY(map(mouseX, 0, width, 0, PI));
25 ? rotateX(map(mouseY, 0, height, 0, PI));
26 ? box(150);
27 }