日更第11期-2015-3-27-processing教程-API篇-第一讲-map(),Table,loadTable(),norm(),lerp()

hI!!今天上线发现我多了一个粉丝!!哇,好高兴!

不过我昨天食言了,没有继续日更......希望不会掉粉。。。。。

不过那是有原因的,我昨天一直在找数据,终于今天给整理好了,我打算这个周末整一整。然后就可以出真正厉害的教程啦!!

我先说一下我接下来会出的教程,然后说说今天发的这个到底是什么。

接下来:

1,美国失业数据可视化

2,地图数据可视化案例教学(案例来自processing教学书visualizing data)

3,中国高考分地域分析

4,API教程

然后说说今天这是干啥。

简单来说,就是读书笔记一样的东西。我在阅读visualizaing data这本书的例子(其实是processing里附带的)时,发现

作者用了一下我完全没用过的函数,就是map,norm,lerp等等,这些是一些很好用的数学函数——之前都是靠自己傻算......

然后我参考着reference基本搞懂了,又自己试验了一下,就翻译成中文收拾了起来。

不过如果真是想看api文档,我并不建议直接使用我的这个:一来,我这只是初稿,精华版才比较有意义,现在只是照搬而已

;而来,只是翻译的话,以及有人做了——我这个API文档其实是为了我的教程同步出的;比如上次processing的第一个例子,

里面就用了map,如果不懂怎么回事就可以参考我的这个文档。

另外我也发现了一个人的个人网站,上面有很多已经翻译好了的API,可以去看一看:

http://hiprocessing.net/

不过这个网站也有一些坏的地方——第一,假装是官方的processing中文站,还提供下载;

第二,翻译水平有限,而且还不配图(怎么感觉是在说我自己.....T_T)

还有一些适合学习processing的网站,我下次再说。

大家先看着啊。

001
-------------------------------------------------------------------------------------------------------------
map()
-------------------------------------------------------------------------------------------------------------
案例

size(200, 200);
float value = 25;
float m = map(value, 0, 100, 0, width);
ellipse(m, 200, 10, 10);
void setup() {
size(200, 200);
noStroke();
}

-------------

float value = 110;
float m = map(value, 0, 100, -20, -10);
println(m); // Prints "-9.0"

-------------

void setup() {
size(200, 200);
noStroke();
}

void draw() {
background(204);
float x1 = map(mouseX, 0, width, 50, 150);
ellipse(x1, 75, 50, 50);
float x2 = map(mouseX, 0, width, 0, 200);
ellipse(x2, 125, 50, 50);
}

-------------------------------------------------------------------------------------------------------------
描述

将一个数字从一个范围映射到另外一个范围的函数。

在上面的第一个例子中,25这个数从0到100这个范围转换到了0到width(屏幕宽度:200)的范围。

而如第二个例子所示,超出原指定范围的数字,不会被最大值最小值所限制住,这是因为越界的值是很常见并且相当有用的。

-------------------------------------------------------------------------------------------------------------
语法

map(value,start1,stop1,start2,stop2)

-------------------------------------------------------------------------------------------------------------
参数

value float: 将要被转换的数值
start1 float: 当前范围的下限
stop1 float: 当前范围的上限
start2 float: 目标范围的下限
stop2 float: 目标范围的上限
-------------------------------------------------------------------------------------------------------------
返回值

float

-------------------------------------------------------------------------------------------------------------
相关

norm()
lerp()

-------------------------------------------------------------------------------------------------------------

002
-------------------------------------------------------------------------------------------------------------
Table
-------------------------------------------------------------------------------------------------------------
案例

Table table;

void setup() {

table = new Table();

table.addColumn("id");
table.addColumn("species");
table.addColumn("name");

TableRow newRow = table.addRow();
newRow.setInt("id", table.lastRowIndex());
newRow.setString("species", "Panthera leo");
newRow.setString("name", "Lion");

saveTable(table, "data/new.csv");
}

// 这个程序会创建一个叫做 "new.csv"的表格,里面的内容是:
// id,species,name
// 0,Panthera leo,Lion

-------------------------------------------------------------------------------------------------------------

描述

Table对象就像传统的表格一样,是通过多行多列来存储数据的。其中的数据既可以是动态生成的,
也可以是已有的数据。如上面的案例所示,Table对象还可以存储在硬盘中,成为永久数据。

-------------------------------------------------------------------------------------------------------------

方法

addColumn() 在表格里新增加一列
removeColumn() 在表格里删去一列
getColumnCount() 得到表格列数
getRowCount() 得到表格行数
clearRows() 去除所有行的数据
addRow() 在表格中新增加一行
removeRow() 在表格中删去一行
getRow() 得到表格中的一行
rows() 得到表格中的许多行
getInt() 从表格中特定的位置上得到一个整数
setInt() 在表格中特定的位置上存储一个整数
getFloat() 从表格中特定的位置上得到一个浮点数
setFloat() 在表格中特定的位置上存储一个浮点数
getString() 从表格中特定的位置上得到一个字符串
setString() 在表格中特定的位置上存储一个字符串
getStringColumn() 得到某一列的所有值
findRow() 找到有特定值的某一行
findRows() 找到有特定值的所有行
matchRow() 得到满足特定表达式的某一行
matchRows() 得到满足特定表达式的所有行
removeTokens() 从表格中去除字
trim() 从值中去除空白值

-------------------------------------------------------------------------------------------------------------

构造函数

Table()
Table(rows)

-------------------------------------------------------------------------------------------------------------

相关

loadTable()
saveTable()
TableRow

-------------------------------------------------------------------------------------------------------------

003
-------------------------------------------------------------------------------------------------------------
loadTable()
-------------------------------------------------------------------------------------------------------------

案例

//本程序中要使用的mammals.csv是一个短小的CSV文件
//它必须包含于"data"文件夹下或者与源文件同路径
// 它的内容如下
//
// id,species,name
// 0,Capra hircus,Goat
// 1,Panthera pardus,Leopard
// 2,Equus zebra,Zebra

Table table;

void setup() {

table = loadTable("mammals.csv", "header");

println(table.getRowCount() + " total rows in table");

for (TableRow row : table.rows()) {

int id = row.getInt("id");
String species = row.getString("species");
String name = row.getString("name");

println(name + " (" + species + ") has an ID of " + id);
}

}

// 程序输出:
// 3 total rows in table
// Goat (Capra hircus) has an ID of 0
// Leopard (Panthera pardus) has an ID of 1
// Zebra (Equus zebra) has an ID of 2

-------------------------------------------------------------------------------------------------------------

描述

从指定的文件路径或者URL读取内容并且用其中的值创建一个Table对象。如果这个文件是指定的,
那么它就必须在“data”这个文件夹里(或者制定好了的位置),文件路径亦可以使用URL来引用网络
上的文件。

默认情况下,Table对象读取数据时使用的是“逗号分隔格式”(comma-separated version,csv),
如果想使用用空格分隔的数据,请使用tsv格式(tab-separated version,tsv)并在可选参数上声明
(不声明也可使用)

如果文件包含有标题行,请在备选参数上使用“header”。如果文件中并没有标题行,就无视这个参数好了。

当你需要同时声明文件格式以及标题行时,你需要把这些可选参数用逗号分隔开,比如:
loadTable("data.csv","header,tsv")

所有文件的读取和存储都是通过processing的api进行UTF-8编码的。

-------------------------------------------------------------------------------------------------------------

语法

loadTable(filename)
loadTable(filename, options)

-------------------------------------------------------------------------------------------------------------

参数

filename String类型: 文件路径名或者URL

-------------------------------------------------------------------------------------------------------------

返回值

Table

-------------------------------------------------------------------------------------------------------------

相关

Table
saveTable()
loadBytes()
loadStrings()
loadXML()

-------------------------------------------------------------------------------------------------------------

004
-------------------------------------------------------------------------------------------------------------
norm()
-------------------------------------------------------------------------------------------------------------

案例

float value = 20;
float n = norm(value, 0, 50);
println(n); // 打印 "0.4"

-------------

float value = -10;
float n = norm(value, 0, 100);
println(n); // 打印 "-0.1"

-------------------------------------------------------------------------------------------------------------

描述

把一个数从某个范围映射到0-1的范围中,使之标准化。
在实际使用上和map(vale,low,high,0,1)完全相同,并且和map相同,出界的数值并不会被截断,
因为很多时候那些数值仍是很有用的。

-------------------------------------------------------------------------------------------------------------

语法

norm(value, start, stop)

-------------------------------------------------------------------------------------------------------------

参数

value float: the incoming value to be converted
start float: lower bound of the value‘s current range
stop float: upper bound of the value‘s current range

-------------------------------------------------------------------------------------------------------------

返回值

float

-------------------------------------------------------------------------------------------------------------

相关

map()
lerp()

-------------------------------------------------------------------------------------------------------------

005
-------------------------------------------------------------------------------------------------------------
lerp()
-------------------------------------------------------------------------------------------------------------

案例

float a = 20;
float b = 80;
float c = lerp(a, b, .2);
float d = lerp(a, b, .5);
float e = lerp(a, b, .8);
beginShape(POINTS);
vertex(a, 50);
vertex(b, 50);
vertex(c, 50);
vertex(d, 50);
vertex(e, 50);
endShape();

-------------

int x1 = 15;
int y1 = 10;
int x2 = 80;
int y2 = 90;
line(x1, y1, x2, y2);
for (int i = 0; i <= 10; i++) {
float x = lerp(x1, x2, i/10.0) + 10;
float y = lerp(y1, y2, i/10.0);
point(x, y);
}

-------------------------------------------------------------------------------------------------------------

描述

可以算出两数之间处于特殊比例上的值。其中amt这个参数就是比例,在0到1之间,
0.1就是这段距离的十分之一,0.5就是一半。lerp()函数在计算一条直线上的缓动时
或者绘制由点构成的线时非常方便。

-------------------------------------------------------------------------------------------------------------

语法

lerp(start, stop, amt)

-------------------------------------------------------------------------------------------------------------

参数

start float: 起点值
stop float: 终点值
amt float: 0.0 到 1.0 的比例(实际上没有取值范围限制)

-------------------------------------------------------------------------------------------------------------

相关

curvePoint()
bezierPoint()
lerp()
lerpColor()

-------------------------------------------------------------------------------------------------------------

时间: 2024-12-23 01:31:47

日更第11期-2015-3-27-processing教程-API篇-第一讲-map(),Table,loadTable(),norm(),lerp()的相关文章

日更第13期-2015-4-9-processing教程-API篇-第二讲-lerpColor()、nfp()、

于是隔了十天来更新了.然后今天更新的是Processing的api,其实这算是我学习Processing途中的一种副产品:反正凑够数了, 我今天就拿出来看看.其实只是api文档的话,并没有什么存在的必要性.但如果只是讨论存在的必要性的话,我的博客本身也没有 存在的必要性.比较也没有记载什么高深或者特别有用的东西.我之前写博客的目的只是因为想写,而因为想写而写,自然就会导致 中断,毕竟人是会善变的动物. 那么,我接下来要做的事就是改变. 我打算写些真正有用的文章. 下一篇进入Processing实

日更第2期-2015-1-15-openFrameworks系列第一讲-手把手制作openFrameworks上的第一个程序!

恩,今天和朋友打球来着,于是今天的案例程序就做一个球吧!O(∩_∩)O哈哈~ 首先,没有看过上一篇教程的同学,还有还没有下载好VS和OpenFrameworks的同学,都去下一下. 传送地址:http://www.cnblogs.com/linongbo/p/4227552.html 那么,开始今天的日更啦! Hello OpenFrameworks! VS的安装部分我就不说了,不过我个人建议——默认是安装在C盘的,不过你要是手动改到别的盘上的话,C盘上 依然会有6G左右的内容.......Σ(

日更第4期-2015-1-19-openFrameworks系列第三讲-面向对象的小球们

昨天的教程里,实在有太多想讲的东西了,所以反而什么都没有讲.一个很大的原因就是——我妄想让所有 水平的读者都能读懂.这其实是绝对不可能的.因为,每个人知识面不同,已经掌握的技能也不同,那么所 适应的学习轨迹其实也该不同. 以我个人来说,我其实是一个谨慎型的人,在学习的过程中一般不会冒进,这意味着我的基础知识会更加 扎实,但是进步的速度就会偏慢.我在这里写博客,其实就是一种学习方式,但无疑,这种学习方式其实很 效率低下(而且还没有人看).可是,对于我就是一个很好的补充......感觉有点跑题了,其

日更第6期-2015-1-29-如何科学地使用因特网-第一讲-总之先爬墙

哟哟,我又来日更了啊!O(∩_∩)O哈哈~不过,其实是隔了两天,不过比起上次,是要好了不少. 先说个好消息吧!我1月31日就要放假啦,然后就可以回家啦. 然后,回家之后,我就要正式的日更啦!现在为止我可是一直在隐藏实力哦.我要从几天一更进化为一天几更. 先试试一夜七次...... 恩,说点正经的:我接下来会更新些什么内容. 第一部分,OpenFrameworks的使用,即OpenFrameworks系列教程,里面包括example的解释,tutorial的 翻译,api的详解以及最新例子的展示.

日更第3期-2015-1-18-openFrameworks系列第二讲-规范学习函数式编程!

昨天周六,我休息了一次.今天感觉心情还不错,就干脆多更一点.恩,同学们,注意啦,今天的课程可是不仅长, 还非常的不轻松哦!我们主要要讲一下C++中继承于C的函数式编程,还有判断这种特殊结构:除此之外, OpenFrameworks的一些基础函数.概念,我也会悉数讲解. 总之,做好觉悟再上吧! 有问题可以发到我的邮箱:[email protected] 于是,开始今天的课程! C++中的函数式编程 于是,先把我下面的这些代码敲到你的编辑器里吧. 1 //ofApp.cpp 2 3 #include

【算法?日更?第八期】区间动态规划:1572:括号配对题解

废话不多说,直接上题: 题目测评链接:戳这里 其实什么GBE都没用,小编最开始看了半天不懂,看了看别人的博客才知道这段话没什么用处.其实就是给一段字符串,判断是否括号是配对的. 这道题一看就会想到区间动态规划(不会戳这里临时补一补),最开始先老老实实地写了一遍区间动态规划,后来觉得用栈也可以,于是写了一遍,代码如下: 1 #include<iostream> 2 #include<cstring> 3 #include<stack> 4 using namespace

【算法?日更?第十七期】信息奥赛一本通1598:【 例 2】最大连续和题解

废话不多说,直接上题: 1598:[ 例 2]最大连续和 时间限制: 1000 ms         内存限制: 524288 KB提交数: 303     通过数: 91 [题目描述] 给你一个长度为 n 的整数序列 {A1,A2,?,An},要求从中找出一段连续的长度不超过 m 的子序列,使得这个序列的和最大. [输入] 第一行为两个整数 n,m: 第二行为 n 个用空格分开的整数序列,每个数的绝对值都小于 1000. [输出] 仅一个整数,表示连续长度不超过 m 的最大子序列和. [输入样

【算法?日更?第二十期】构造分治

▎什么是分治? ?『定义』 分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.在计算机科学中,分治法就是运用分治思想的一种很重要的算法.分治法是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)等等.(copy自百度) 一句话总结:分治就是把大问题转化成若干小问题,小问题解决后,大问题自然就迎刃而解. ?『使用条件』 ①大问题分解成

[活动]开发者最佳实践日·第11期-HTML5与Native App应用技术实战

在移动互联网时代大放异彩的不止原生应用,最近一段时间HTML5火热发展一片繁荣,从大家认为HTML标准不需要升级到HTML5正式定稿.随着硬件的升级.OS厂商策略变化,软件技术的成熟,用户需求的不断推动,针对HTML5与Native App 孰胜孰劣之争也由此拉开. 产业在同步演进,作为开发者应该选用什么样的应用以适应自己的产品更快速地传播与迭代.如何实现APP构建和发布的极致效率?如何做跨平台设计?如何快速地创建HTML5类型的移动游戏? 开发者最佳实践日第11期,七牛云存储邀请了成都当地明星