更改

删除260字节 、 2015年12月12日 (六) 15:37
无编辑摘要
第1行: 第1行:  
== 大楼霓虹灯动画 ==
 
== 大楼霓虹灯动画 ==
−
你看过夜晚都市街头的霓虹灯么?它们是多么变幻莫测、色彩缤纷!然而你想没想过,这些霓虹灯的动画图案都是由很多单个的灯泡不停闪烁构成的,你不觉得奇怪么?让我们定睛观察其中的一个灯泡,它只会机械的闪烁变换几种不同的颜色,没有什么稀奇的;然而当你观察由这些小灯泡构成的集体的时候,霓虹灯整体的动画图案就会像变魔术一样突然表现出来。这意味着什么?不忙回答这个问题,让我们先来玩一个类似霓虹灯的游戏。<br />
+
:你看过夜晚都市街头的霓虹灯么?它们是多么变幻莫测、色彩缤纷!然而你想没想过,这些霓虹灯的动画图案都是由很多单个的灯泡不停闪烁构成的,你不觉得奇怪么?让我们定睛观察其中的一个灯泡,它只会机械的闪烁变换几种不同的颜色,没有什么稀奇的;然而当你观察由这些小灯泡构成的集体的时候,霓虹灯整体的动画图案就会像变魔术一样突然表现出来。这意味着什么?不忙回答这个问题,让我们先来玩一个类似霓虹灯的游戏。<br />
 
:设想你和你的朋友居住在一幢大楼里面,大楼的一个侧面有很多的窗户,他们整齐的排列成一个大方阵,就像下面的图一样:
 
:设想你和你的朋友居住在一幢大楼里面,大楼的一个侧面有很多的窗户,他们整齐的排列成一个大方阵,就像下面的图一样:
−
[[File:屏幕快照 2015-12-11 16.01.02.png]]
+
[[File:屏幕快照 2015-12-11 16.01.02.png]]<br />
−
这里黑色表示的是窗户,
+
 
−
灰色是窗户之间的隔断。
+
这里黑色表示的是窗户,灰色是窗户之间的隔断。为什么窗户是黑色的?太难看了吧?哦,这是晚上,而且屋子里都没有开灯。没关系,反正大楼里面住的都是自己的朋友,你可以让一些人把灯打开,下面的图表示的是有些屋子亮灯的图案(好看多了):
−
为什么窗户是黑色的?太难看了吧?
  −
哦,
  −
这是晚上,
  −
而且屋子里都没有开灯。
  −
没关系,
  −
反正大楼里面住的都是自己的朋友,
  −
你
  −
可
  −
以让一些人把灯打开,下面的图表示的是有些屋子亮灯的图案(好看多了)
  −
:
   
<gallery>
 
<gallery>
 
File:屏幕快照 2015-12-11 16.01.08.png|
 
File:屏幕快照 2015-12-11 16.01.08.png|
−
</gallery>
+
</gallery><br />
−
聪明的人已经想到了,
+
 
−
其实这就是一个简单的霓虹灯!
+
聪明的人已经想到了,其实这就是一个简单的霓虹灯!我们可以让不同的窗户开灯来组成不同的图案。比如要想用这种方法组合出一个“十”字图案,我们可以让第7列的窗户都开灯,并让第13行的窗户也都开灯
−
我们可以让不同的窗户开灯来组
  −
成不同的图案。
  −
比如要想用这种方法组合出一个
  −
“十”
  −
字图
  −
案,
  −
我们可以让第
  −
7
  −
列
  −
的窗户都
  −
开灯,并让第
  −
13
  −
行的窗户也都开灯
   
<gallery>
 
<gallery>
 
屏幕快照 2015-12-11 16.04.02.png|
 
屏幕快照 2015-12-11 16.04.02.png|
−
</gallery>
+
</gallery><br />
−
如果是复杂点的图案呢?我们仍然可以如法炮制,
+
 
−
不过麻烦了点,
+
如果是复杂点的图案呢?我们仍然可以如法炮制,不过麻烦了点,因为你需要告诉这幢大楼里的每一个同学是开灯还是关灯。<br />
−
因为你需要告诉这幢
+
如果要让霓虹灯图案动起来呢?比如每1秒钟就变换一下图案,那么你就需要给每个朋友编制一些指令,告诉他们在什么时刻是开灯还是关灯。我们不妨用0表示关灯,用1表示开灯,那么比如指令011011001指派给了住在第三行第4列的朋友,那么他应该在第1秒内关灯,在第二秒、第三秒都开灯,第四秒关...。汗,这恐怕太麻烦了,你算算,如果要展示一个10分钟的动画(600秒)那就需要为每个窗户后面的朋友编制长度600的指令。何况很可能这里有100扇窗户呢!<br />
−
大楼里的每一个同学是开灯还是关灯。
+
 
−
如果要让霓虹灯图案动起来呢?比如每
+
如果你够聪明,可以换一种方法来制作你的大楼霓虹灯动画。让居住在大楼里面的每个朋友密切观察他的邻居,根据上一秒内他邻居的开灯状况决定下一秒内该朋友的动作。显然每个窗户后的朋友都会有上、下、左、右、左上、右上、左下、右下八个邻居(如下图),那么每个人的开灯状态就会被他的邻居们以及他自己的上一时刻的开灯状态所影响,并且翻过来这位朋友是否开灯又会影响他的邻居们,整个大楼的各个窗户就会不停的闪烁,这也能达到动画的效果了。
−
1
  −
秒钟
  −
就变换一下图案,
  −
那么你就需要给每个朋
  −
友编制一些指令,
  −
告诉他们在什么时刻是开灯还是关灯。
  −
我们不妨用
  −
0
  −
表示关灯,
  −
用
  −
1
  −
表示
  −
开灯,
  −
那么比如指令
  −
01
  −
101
  −
1
  −
0
  −
0
  −
1
  −
指派给
  −
了住在第三行第
  −
4
  −
列的
  −
朋友,
  −
那么他应该在第
  −
1
  −
秒内
  −
关灯,
  −
在第
  −
二秒、
  −
第三
  −
秒都开
  −
灯,
  −
第
  −
四
  −
秒关
  −
....
  −
。
  −
汗
  −
,这
  −
恐怕
  −
太麻
  −
烦了
  −
,你
  −
算算
  −
,
  −
如果要
  −
展
  −
示一个
  −
10
  −
分
  −
钟的动画(
  −
60
  −
0
  −
秒)那就
  −
需要为每个窗户
  −
后
  −
面的朋友编制
  −
长度
  −
600
  −
的指
  −
令。
  −
何
  −
况
  −
很可
  −
能
  −
这里有
  −
100
  −
扇
  −
窗户呢!
  −
如果你
  −
够
  −
聪明,
  −
可以换一种方法来制
  −
作
  −
你的大楼霓虹灯动画。
  −
让居住在大楼里面的每个
  −
朋友
  −
密切
  −
观察他的
  −
邻
  −
居,
  −
根据
  −
上一秒内他
  −
邻
  −
居的开灯
  −
状况决
  −
定下一秒内该朋友的动
  −
作
  −
。
  −
显
  −
然
  −
每个窗户
  −
后
  −
的朋友都会
  −
有上、下、
  −
左
  −
、
  −
右
  −
、
  −
左
  −
上、
  −
右
  −
上、
  −
左
  −
下、
  −
右
  −
下
  −
八
  −
个
  −
邻
  −
居(
  −
如下图)
  −
,
  −
那么每个人的开灯
  −
状态
  −
就会
  −
被
  −
他的
  −
邻
  −
居们以
  −
及
  −
他自己的上一时刻的开灯
  −
状态所影响
  −
,
  −
并且
  −
翻
  −
过来这
  −
位
  −
朋友是
  −
否
  −
开灯
  −
又
  −
会
  −
影响
  −
他的
  −
邻
  −
居们,
  −
整个大楼的
  −
各
  −
个窗户就会不停的闪烁,
  −
这也
  −
能
  −
达
  −
到动画的
  −
效
  −
果了。
   
<gallery>
 
<gallery>
−
File:屏幕快照 2015-12-11 23.06.21.png|一个窗户和它的
+
File:屏幕快照 2015-12-11 23.06.21.png|一个窗户和它的八个邻居,分别是左上、上、右上、左、右、左下、右下
−
八
+
</gallery><br />
−
个
+
:具体邻居的开灯与否如何影响该朋友是否开灯呢?这仍然需要我们为该朋友定义规则,比如“只有当八个邻居的灯都亮了我才能开灯”,这就是一条规则,“只要我这个时刻亮着灯,那么下一时刻无论邻居们什么情况我仍然亮灯”也是一
−
邻
+
条规则......另外,还有一个初始状态的问题,也就是在一开始第一秒内哪些窗户应该开灯,那些应该关灯呢?我们
−
居,
+
完全可以让窗户后面的每个朋友自己随便决定,也就是初始时刻窗户的开灯状态是随机的。
−
分别
  −
是
  −
左
  −
上、上、
  −
右
  −
上、
  −
左
  −
、
  −
右
  −
、
  −
左
  −
下、
  −
右
  −
下
  −
</gallery>
  −
具
  −
体
  −
邻
  −
居的开灯
  −
与否
  −
如
  −
何影响
  −
该朋友是
  −
否
  −
开灯呢?这仍然需要我们为该朋友定
  −
义规则
  −
,
  −
比如
  −
“只有当
  −
八
  −
个
  −
邻
  −
居的灯都亮了我
  −
才能
  −
开灯”
  −
,
  −
这就是一
  −
条规则
  −
,
  −
“只要我这个时刻亮
  −
着
  −
灯,
  −
那么下一时刻
  −
无论邻
  −
居们什么
  −
情况
  −
我仍然亮灯”
  −
也是一
  −
条规则......
  −
。
  −
另外
  −
,
  −
还
  −
有一个
  −
初
  −
始状态
  −
的问题,
  −
也就是在一开
  −
始
  −
第一秒内
  −
哪
  −
些窗户应该开灯,
  −
那些应该关灯呢?我们
  −
完全
  −
可
  −
以让窗户
  −
后
  −
面的每个朋友自己
  −
随便决
  −
定,也就是
  −
初始
  −
时刻窗户的开灯
  −
状态
  −
是
  −
随
  −
机的。
   
== 生命游戏 ==
 
== 生命游戏 ==
−
好了,
+
:好了,上面基本讲清楚了大楼霓虹灯的工作原理了,下面我们开始设计一个切实的动画。按照刚才讲到的聪明的霓虹灯动画设计方法,我们为每个窗户后面的朋友设计规则如下:<br />
−
上面
+
规则1.如果我现在开着灯,只要八个邻居中有2个或者3个人开灯了,那么下一时刻我才开灯,否则邻居亮灯数超过3个或者少于2个,我都会把灯关掉;<br />
−
基本讲清楚
+
 
−
了大楼霓虹灯的
+
规则2:如果我现在关着灯,那么当邻居中有3个人开灯,那么下一个时刻我就把灯打开。比如某个窗户和他邻居窗户的开灯状态如下图示:
−
工作原理
  −
了,
  −
下面我们开
  −
始
  −
设
  −
计
  −
一个
  −
切
  −
实的动画。
  −
按照刚才讲
  −
到的聪明的霓虹灯动画设
  −
计
  −
方法,我们为每个窗户
  −
后
  −
面的朋友设
  −
计规则
  −
如下:
  −
规则
  −
1
  −
:
  −
如果我现在开着灯,
  −
只要
  −
八
  −
个
  −
邻
  −
居中有
  −
2
  −
个
  −
或者
  −
3
  −
个
  −
人开灯了,
  −
那么下一时刻
  −
我
  −
才
  −
开灯,
  −
否则邻
  −
居亮灯
  −
数超
  −
过
  −
3
  −
个
  −
或者少于
  −
2
  −
个,我都会把灯关
  −
掉
  −
;
  −
规则
  −
2
  −
:
  −
如果我现在关着灯,
  −
那么当
  −
邻
  −
居中有
  −
3
  −
个人开灯,
  −
那么下一个时刻我就把灯打
  −
开。
  −
比如
  −
某
  −
个窗户和他
  −
邻
  −
居窗户的开灯
  −
状态
  −
如下图示:
   
<gallery>
 
<gallery>
 
File:屏幕快照 2015-12-11 23.08.20.png|
 
File:屏幕快照 2015-12-11 23.08.20.png|
−
</gallery>
+
</gallery><br />
 +
 
 
其中中
 
其中中
 
心位置
 
心位置