注册 登录
编程论坛 Matlab

[求助]对象平移怎么实现

biggun1860 发布于 2006-04-20 22:11, 1594 次点击

先定义好了如下一个二值矩阵
[0 1 1 0 0 1 0 1
0 1 0 0 0 1 0 0
1 1 0 0 1 0 0 1
0 0 0 1 1 0 0 0
1 1 0 0 0 1 0 0
0 1 0 0 0 1 1 1
0 0 1 1 0 1 0 0]
定义值为1的上下左右邻接成对象。如黑体即为一个对象
怎么实现这样的对象向上下左右中任一方向移动一格呢?

10 回复
#2
Genial2006-04-21 07:43
也就是说把1山下左右任意方向移动一格?
#3
biggun18602006-04-21 09:18
恩,把同一个对象里的1朝一个方向一起移动一格
#4
Genial2006-04-21 10:43
是“循环”方式么?被移出的怎么处理?
#5
biggun18602006-04-21 11:20
不是“循环”方式。如最左边的1不能再左移
所有对象同步移动
每个对象移动后新组成的对象在同一时间步里不能移动
#6
Genial2006-04-21 12:26
依然不明白,不能够平移的怎么处理?
#7
biggun18602006-04-21 12:43
举个例子说:
[0 1 1 0 0 1 0 1
0 1 0 0 0 1 0 0
1 1 0 0 1 0 0 1
0 0 0 1 1 0 0 0
1 1 0 0 0 1 0 0
0 1 0 0 0 1 1 1
0 0 1 1 0 1 0 0]
根据边界条件不能左移也不能上移
把黑体对象右移一格后得到
[0 0 1 1 0 1 0 1
0 0 1 0 0 1 0 0
0 1 1 0 1 0 0 1
0 0 0 1 1 0 0 0
1 1 0 0 0 1 0 0
0 1 0 0 0 1 1 1
0 0 1 1 0 1 0 0]
#8
biggun18602006-04-21 12:48
其实只要1的个数不变,怎么理解都行
#9
Genial2006-04-21 21:44

是四邻域不是八领域么?
另外,楼主自己问题还没有考虑清楚,很多地方可能都没有想到,
上面提了一种,另外一种,如果在移动的过程中出现与其他对象重合怎么处理?
感觉这个问题还有点儿意思,但是估计被楼主抽象的时候有些失真了~
能否给出你该问题的来源与原始需求?

#10
biggun18602006-04-22 16:37

是四邻域
这个问题起源于薄膜生长的模拟
先是原子沉积过程,得到前面说的二值矩阵
(实际的矩阵应该是200*200,原子数为5000,用1表示;无原子处用0表示)
按四邻域邻接的原子组成团簇,团簇不能再分离。
每一时间步里,以团簇为单位随机移动一格(方向可为上下左右,也可以静止),各团簇同步移动,组成新的团簇----当然在程序实现时是不可能真正同步并行移动的,可以自己变通一下,比如说每个团簇移动后若与其他团簇邻接则立即组成新的团簇,该新团簇在这个时间步里不能再移动,这样也就消除了重合问题(只要保持原子数--即1的个数--不变,这些规则可以自己改)
----前面表述不清,在次表示歉意,希望这次能说得明白一些

#11
Genial2006-04-22 22:27

给点提示,具体的你自己去实现吧。
程序中可能会用到的函数有:bwlabel,find,当然还有随机数函数。
一个简单的想法是,定义上下左右四个方面为[0,1]之间均分的一个区间范围,对每个对象产生一个服从均匀分布的[0,1]区间的随机数,然后根据随机数确定移动方向,不往某个方向移动的再采用其他策略确定移动方向。不过介于避免重叠,因此对每个对象每次操作后要进行重新标签。 整个程序估计运行起来效率不是很高哦。

1