找回密码
 点一下
查看: 1453|回复: 19

如何选取离某个点最近的单位

[复制链接]
发表于 2012-11-6 12:46:43 | 显示全部楼层 |阅读模式
本帖最后由 liuhongyuan000 于 2012-11-12 17:56 编辑

在GA里找了很久没找到演示图,求各路大仙指个路…………急,在线等答案        2012年11月6日   12点46分开始等……
发表于 2012-11-6 13:21:55 | 显示全部楼层
不清楚我的思路好不好,算是抛砖引玉吧:

设置L=0
清空单位组
选取距离目标点距离小于等于L的单位加入单位组
if单位组内单位数目=0
设置L=L+1
else
设置unit=单位组内第一个单位

大体写写,回来自己试试行不行
回复

使用道具 举报

发表于 2012-11-6 14:01:27 | 显示全部楼层
本帖最后由 lo 于 2012-11-6 14:02 编辑

ls的思路没问题,不过触发写法问题大……

设置location=指定点
设置单位组group=可用地图区域内所有单位
for循环整数A从1到(group内单位数量)做动作
    设置单位Unit=group内随机单位
    设置点point=Unit的位置
    如果所有条件成立做动作1,否则做动作2
        if
            distance大于location到point的距离
        then
            设置实数distance=location到point的距离
        else
            无动作
    清除点point
   从单位组group中移除Unit
删除单位组group

   
回复

使用道具 举报

发表于 2012-11-6 14:11:03 | 显示全部楼层
举个栗子
[trigger]Pick
    事件
        单位 - 任意单位 发动技能效果
    条件
        (施放技能) 等于 暴风雪
    动作
        设置 G = ((可用地图区域) 内的所有单位)
        设置 U = (G 中第一个单位)
        设置 T = (U 的位置)
        设置 L = (技能施放点)
        设置 D = (L 和 T 之间的距离)
        点 - 清除 T
        单位组 - 选取 G 内所有单位做动作
            Loop - 动作
                设置 T = ((选取单位) 的位置)
                设置 R = (L 和 T 之间的距离)
                点 - 清除 T
                如果所有条件成立则做动作1,否则做动作2
                    If - 条件
                        R 小于 D
                    Then - 动作
                        设置 U = (选取单位)
                        设置 D = R
                    Else - 动作
        点 - 清除 L
        单位组 - 删除 G
        单位 - 使 U 爆炸而死
[/trigger]
Pick.w3x (12.27 KB, 下载次数: 30)

点评

单位组中第一个单位确定就是最远的单位么= =  详情 回复 发表于 2012-11-12 17:32
回复

使用道具 举报

发表于 2012-11-6 16:15:19 | 显示全部楼层
你们用的方法是先选取所有单位,然后一点一点缩小选取距离,直到选取距离为半径的圆内只有一个单位;看来我的脑筋是反着长的,哈哈,我的方法是先选0距离内单位,,然后一点一点增大选取距离,直到选取距离为半径的圆内只有一个单位……
回复

使用道具 举报

发表于 2012-11-6 19:04:49 | 显示全部楼层
“取全图所有单位,计算距离,找到最近单位”是不是耗费运算资源有点大?
那么对地图分块,这样如何?
回复

使用道具 举报

发表于 2012-11-6 19:17:23 | 显示全部楼层
从逻辑上来说,希瓦的逻辑最正确。不过你的代码太特化了。帖子里还是写比较通用的代码比较好。

417948913你的方法问题在于,1并不是最小间隔。当两个单位都非常接近某点时,你的法子显然就有误差。而且没有考虑例外情况,也就是地图上一个单位也没有的时候。这样你的循环体会一直循环到超出最大执行次数。


至于lo,整个逻辑结构完全错了,难道你认为随机选择单位组里的单位,然后重复X(X为单位组里单位数量)次就可以把所有单位都枚举到了?

点评

lo
头目,lo在循环是时候已经把选过的单位清除出单位组了,这样还会有问题么……  详情 回复 发表于 2012-11-6 20:18
回复

使用道具 举报

发表于 2012-11-6 19:36:02 | 显示全部楼层
本帖最后由 希瓦 于 2012-11-6 19:43 编辑
四夕水草肃 发表于 2012-11-6 19:04
“取全图所有单位,计算距离,找到最近单位”是不是耗费运算资源有点大?
那么对地图分块,这样如何?

好吧...也许可以用“二分法”来求
不知道魔兽选取范围内单位的算法是什么
是选取全图单位然后判断是否在范围内,还是有单独的索引算法呢
如果是前者,那分块反而会变慢呢...

不过一般“选最近的单位”都会有一个范围
把“全地图单位”换成“范围内的单位”就不用担心资源耗费了
所以这还算是一个较为实用的算法吧~~
回复

使用道具 举报

发表于 2012-11-6 19:40:18 | 显示全部楼层
麦德三世 发表于 2012-11-6 19:17
从逻辑上来说,希瓦的逻辑最正确。不过你的代码太特化了。帖子里还是写比较通用的代码比较好。

41794891 ...


特化和通用是什么呢...
回复

使用道具 举报

发表于 2012-11-6 20:01:37 | 显示全部楼层
lo踢出了单位组的中选择的单位
不过用循环替代单位组动作貌似没意义吧

希瓦大约是从一堆单位中选择一个作为选取单位的半径
然后判断在此范围内的第一个最近单位
逐个比较

从效率角度来说,如果地图上的单位很稀薄
则采用希瓦的方法好些

否则采用一个递增的半径(比如100,根据可能的密度选择,不过至少也要50+目的是单次选出的单位要少,递增次数也要少)来说作为搜索
搜索结果加入单位组
如果单位组单位数量为0
递增半径搜索
直到不为0

然后如希瓦般的单位组单位动作
计算距离
初始距离记录给个任意最大值,如9999
只要计算结果小于当前记录
记录判定单位和计算距离

遍历完成后记录的单位就是结果了
回复

使用道具 举报

发表于 2012-11-6 20:15:27 | 显示全部楼层
本帖最后由 绯弹亚丝娜 于 2012-11-6 20:28 编辑

担心效率就用2分法来计算吧~~

不然增量的取值可不好决定呢

也就是从100%地图区域开始,如果区域内的单位数量大于0,则将范围折半,然后继续判断
直至找到只有一个单位的范围为止

不过还是需要先确定“魔兽选取范围内单位的算法”是什么
回复

使用道具 举报

发表于 2012-11-6 20:18:02 | 显示全部楼层
麦德三世 发表于 2012-11-6 19:17
从逻辑上来说,希瓦的逻辑最正确。不过你的代码太特化了。帖子里还是写比较通用的代码比较好。

41794891 ...

头目,lo在循环是时候已经把选过的单位清除出单位组了,这样还会有问题么……

点评

你这就是完全没必要的资源消耗了。随机出来一个明显比pick一个消耗的资源更多。  详情 回复 发表于 2012-11-6 22:33
我只记得用循环来代替选取使用“第一个单位”会有问题,会有选不到的情况 随机单位倒不确定,猫咪可以试试  详情 回复 发表于 2012-11-6 20:31
回复

使用道具 举报

发表于 2012-11-6 20:31:38 | 显示全部楼层
lo 发表于 2012-11-6 20:18
头目,lo在循环是时候已经把选过的单位清除出单位组了,这样还会有问题么……

我只记得用循环来代替选取使用“第一个单位”会有问题,会有选不到的情况
随机单位倒不确定,猫咪可以试试
回复

使用道具 举报

发表于 2012-11-6 22:33:51 | 显示全部楼层
lo 发表于 2012-11-6 20:18
头目,lo在循环是时候已经把选过的单位清除出单位组了,这样还会有问题么……

就算你没有遇到问题,你这已经是完全没必要的资源消耗了。随机出来一个明显比pick一个消耗的资源更多。
回复

使用道具 举报

发表于 2012-11-7 09:15:40 | 显示全部楼层
绯弹亚丝娜 发表于 2012-11-6 20:15
担心效率就用2分法来计算吧~~

不然增量的取值可不好决定呢

循环增值5次可比一下子圈出来一堆单位效率高呢

大范围圈定,如果地图上单位足够多的话

一下子圈进来100个单位

效率反而低呢

这主要还是看地图的情况

例如dota 还是小范围递增效率高

一般来说这个都有最大检测范围吧

10次递增消耗不了多少效率的
回复

使用道具 举报

发表于 2012-11-7 15:48:47 | 显示全部楼层
本帖最后由 417948913 于 2012-11-7 15:50 编辑

我突然有了个猜测,那个闪电链在弹射的时候,是不是默认的挑选的最近一个单位弹射?如果是,那么,可以这么做:
1,在目标点建一个敌方马甲,在施法者位置建一个自己的马甲
2,自己的马甲向敌方马甲释放闪电链。闪电链只能弹射1次,闪电链影响范围为99999999
3,选取伤害来源是自己马甲,但不是敌方马甲的单位做动作,将匹配单位设为要求的单位
……
回复

使用道具 举报

发表于 2012-11-12 01:22:17 | 显示全部楼层
417948913 发表于 2012-11-7 15:48
我突然有了个猜测,那个闪电链在弹射的时候,是不是默认的挑选的最近一个单位弹射?如果是,那么,可以这么 ...

不是选最近的一个。。是弹射范围内随机一个
回复

使用道具 举报

 楼主| 发表于 2012-11-12 17:29:15 | 显示全部楼层
我还在消化= =
回复

使用道具 举报

 楼主| 发表于 2012-11-12 17:32:21 | 显示全部楼层
希瓦 发表于 2012-11-6 14:11
举个栗子
[trigger]Pick
    事件

单位组中第一个单位确定就是最远的单位么= =

点评

lo
那句触发看来有相当的迷惑性……lz仔细看完吧……  详情 回复 发表于 2012-11-12 18:49
回复

使用道具 举报

发表于 2012-11-12 18:49:26 | 显示全部楼层
liuhongyuan000 发表于 2012-11-12 17:32
单位组中第一个单位确定就是最远的单位么= =

那句触发看来有相当的迷惑性……lz仔细看完吧……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-24 02:11 , Processed in 0.235920 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表