作者 主题: [ 课件 ] DAY3 - Processing Workshop @ xinchejian  (阅读 5575 次)

RavenKwok

  • Sr. Member
  • ****
  • 帖子: 277
  • Artist/ Animator/ Coder/ Cynical Asshole
[ 课件 ] DAY3 - Processing Workshop @ xinchejian
« 于: 十月 30, 2011, 08:06:22 下午 »
pdf 下载链接。

http://vdisk.weibo.com/s/Y0-W/1319965426

内容涉及按钮的制作(条件句的应用),循环的概念与应用,函数的概念与应用。

欢迎下载,交流。

——————————分割线——————————

需要在论坛回帖里慢慢补充的内容涉及返回值的详细说明,Loop的嵌套。(俺标记一下用来提醒自个儿)

RavenKwok

  • Sr. Member
  • ****
  • 帖子: 277
  • Artist/ Animator/ Coder/ Cynical Asshole
Return Type 返回值类型
« 回复 #1 于: 十月 31, 2011, 11:23:36 上午 »
Return Type 返回值类型
————————————————————

还记得dist() 函数么,它可以计算两点之间的距离,并直接以值的形式给其他变量赋值。举第一节课提到的例子。

float mouseSpeed = dist(mouseX,mouseY,pmouseX,pmouseY);

可以看到我们声明了一个变量(名为mouseSpeed),该变量的数据类型为小数,而后把鼠标当前点到鼠标上一点之前的距离赋值给mouseSpeed 这个变量。

显然dist()是一个函数,mouseX,mouseY,pmouseX,pmouseY 是其中的参数,为何它能直接像值一样赋给mouseSpeed 呢?

原因就是因为返回值的存在。dist() 函数具有返回值,它的返回值数据类型同样为浮点小数float。
————————————————————

现在,我们来假设Processing 内部并不存在dist() 函数,这样的话,每次需要得到两个点之间的距离时,我们就需要用勾股定理来计算,比较好的方式自然是我们自己来定义一个功能和dist() 一样的函数,而把具体的勾股定理的运算作为这个新定义的函数的内部逻辑。

OK,我们开始定义一个新函数ravenDist()。

既然是测距,我们自然要告诉ravenDist() 要测哪两个点之间的距离,换而言之,也就是某一点的x坐标y坐标和另一点的x坐标y坐标。如何告诉呢,我们可以把两点的坐标写入ravenDist() 的() 内以参数的形式告诉ravenDist(),既然如此,我们在定义ravenDist() 的时候就要把参数的位置预留出来,并指定这个位置的参数对应的数据类型。很显然,数据类型必须是数字(整数/小数),所以我们定义ravenDist() 的时候要告诉它,参数位置写入数字时才能执行内部逻辑,如果写入“春哥”则无法执行。

便于大家理解,我先写个Pseudocode。

ravenDist( [必须是数字] 第一个点的x坐标, [必须是数字] 第一个点的y坐标, [必须是数字] 第二个点的x坐标, [必须是数字] 第二个点的y坐标)

OK,我们来把它变为Processing 代码。

void ravenDist( float input01x, float input01y, float input02x, float input02y)

然后我们来看一下测距的内部逻辑。



其实也就是简单的勾股定理的应用。这里我觉得就没有解释的必要了吧,我们来把这张图变为代码吧。

void ravenDist( float input01x, float input01y, float input02x, float input02y){
   float distance = sqrt(sq(input02y-input01y)+sq(input01x-input02x));
}

上述的sq() 与sqrt() 请各位童鞋自行查阅官方Reference。

到这里为止,ravenDist() 基本的测距功能已经完成了。但是,现在如果你在写Processing 代码的时候调用ravenDist() 发现还是无法像Processing 内置的dist() 那样获取你写入的那两个点之间的距离,为什么?

仔细看一下ravenDist 的前面是什么?对,void。void 指的是当前被定义的这个函数不返回任何值,也就是说ravenDist() 内部确实测量了两个点之间的距离,并把距离值赋给了变量distance,但我们却无法使用到这个值。因为ravenDist() 的返回类型为void,它不会将这个距离值告诉我们(返回给我们)。所以我们现在要做的是让ravenDist() 把这个值告诉我们(返回给我们),以便我们能够直接使用它(像dist() 一样)。返回的距离值的数据类型依然是数字,所以我们可以这样指定,如下。

float ravenDist( float input01x, float input01y, float input02x, float input02y){
   float distance = sqrt(sq(input02y-input01y)+sq(input01x-input02x));
}

把void 改为float ,让ravenDist() 返回值,值的类型为小数。

不过还是有问题。ravenDist() 已经知道它自己执行完后需要告诉我们(返回给我们)一个小数结果,但是,是什么结果呢,我们还没定义它返回哪个数值给我们。所以我们现在需要它把distance 的结果值告诉我们。代码如下:

float ravenDist( float input01x, float input01y, float input02x, float input02y){
   float distance = sqrt(sq(input02y-input01y)+sq(input01x-input02x));
   return distance;
}

好了,现在我们定义的ravenDist() 和Processing 自带的dist() 的功能完全一样了,可以完全像用dist() 一样调用ravenDist() 。希望这个补充例子能更好地帮助大家理解函数的返回值。

吃饭去了,有问题的童鞋可以跟帖提出。 8)
« 最后编辑时间: 十月 31, 2011, 01:40:04 下午 作者 RavenKwok »

calvinhuang

  • Newbie
  • *
  • 帖子: 8
Re: [ 课件 ] DAY3 - Processing Workshop @ xinchejian
« 回复 #2 于: 十月 31, 2011, 02:50:18 下午 »
应该是float distance = sqrt(sq(input02y-input01y)+sq(input02x-input01x));吧哈哈

RavenKwok

  • Sr. Member
  • ****
  • 帖子: 277
  • Artist/ Animator/ Coder/ Cynical Asshole
Re: [ 课件 ] DAY3 - Processing Workshop @ xinchejian
« 回复 #3 于: 十月 31, 2011, 02:59:45 下午 »
应该是float distance = sqrt(sq(input02y-input01y)+sq(input02x-input01x));吧哈哈

无论谁减谁,平方之后不都一样嘛。 ::)

calvinhuang

  • Newbie
  • *
  • 帖子: 8
Re: [ 课件 ] DAY3 - Processing Workshop @ xinchejian
« 回复 #4 于: 十月 31, 2011, 10:56:43 下午 »
看样子我看问题不仔细太肤浅了 哈哈