|
发表于 2010-6-24 08:16:09
|
显示全部楼层
原帖由 bluse 于 2010-6-23 11:53 PM 发表
多行触发理论上可行,实际上你会被累死的,况且同名地点的小地图也有许多重复的,比如牙山驿道或者襄阳官道。
虚无还是不要用map推车了,文若的多行定位是一种办法,我看他的全自动推车就是这样的。
我做胡一刀机器人时画了比较全的map,但推车还是用遍历加固定路线的唯一点的方式。
不管用上面哪种方式,其实都有比较简单的解决重复地名的方法
其实首先要解决的误区是不要怕重复地点,有重复的地点没关系,要想想这些重复的是不是影响你的护镖路线。。。。
具体来说要区分的是地图上的重复地点,在你的推车路线上是否重复(更进一步说其实是推车的剩余路线),不重复就没关系了,这个观察一下路线就很容易做出来。
如果遇到实在连固定路线上都重复的无法定位的地点,就先选一个点试验(这和走迷宫有类似的地方,走到头撞了墙再折回),然后当走错位置(报这个方向过不去)的时候再当乱入处理
因为整个机器人post出来会给purge的,就简单贴几个上面思路的函数,其实这个不难做,不含地图数据,不含自动机制,犯规的吧,呵呵。
下面这个是每轮护镖取唯一点的函数
;; 生成护镖路上的唯一标志点位
unique_points={}
unique_points_pos={}
#FORALL %find(@address,unique_point,dbroute) {
#dbget %i
unique_points=%additem(&dbplace, @unique_points)
unique_points_pos=%additem(&dbstep, @unique_points_pos)
}
我比较懒,所以这些唯一点也不是手输入数据库的,是用下面的函数写入的,这个和自动画地图类似,你自己推车就写了
#var temp_step_route %concat("'",%concat(@go_num,@address))
#var temp_place_route %concat("'",%concat(@now_place,@address))
#var temp_db_cursor %find(@temp_step_route,ALL,step_route)
#IF (%null( @temp_db_cursor)) {
#new [email=dbroute=@address]dbroute=@address[/email] [email=dbstep=@go_num]dbstep=@go_num[/email] [email=dbplace=@now_place]dbplace=@now_place[/email] [email=step_route=@temp_step_route]step_route=@temp_step_route[/email] [email=place_route=@temp_place_route]place_route=@temp_place_route[/email]
#dbput [email={dbroute=@address|dbstep=@go_num|dbplace=@now_place|step_route=@temp_step_route|place_route=@temp_place_route]{dbroute=@address|dbstep=@go_num|dbplace=@now_place|step_route=@temp_step_route|place_route=@temp_place_route[/email]}
}
这是推车途中取下一个检查点的函数,因为我们只需要剩余路线上的唯一点
now_place=%1
//过了检查点时取下一个检查点,渡船的话暂停取一次
#if ((@go_num>@last_go_num) AND (@now_place!=渡船) ) {
temp_next_unique=%ismember(@last_place,@unique_points)
#if (@temp_next_unique >0) {
//唯一点是顺序排序的,取下一个。
#if (@temp_next_unique < %numitems(@unique_points)) {
#add temp_next_unique 1
}
last_place=%item(@unique_points,@temp_next_unique)
last_go_num=%item(@unique_points_pos,@temp_next_unique)
//从唯一点列表中删掉当前点之前的唯一点
#var temp_i (@temp_next_unique-1)
#loop 1,@temp_i {
unique_points=%delnitem(@unique_points,1)
unique_points_pos=%delnitem(@unique_points_pos,1)
}
}
} |
|