开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 164|回复: 3
收起左侧

[完成] 请教lua两组数组如何合并然后判断最近xy距离

 关闭 [复制链接]
结帖率:100% (4/4)
发表于 7 天前 | 显示全部楼层 |阅读模式   河北省廊坊市
25精币
@xjdgs
昨天老哥帮忙解决了,问题,原帖子地址https://bbs.125.la/forum.php?mod ... 14845819&extra=


但是我发现了一个问题更难受脑子更不够用了,在懒人精灵开发环境中的找图函数,虽然有支持多图的,但是并不能一次性返回所有图片所有坐标。
比如想找boss1,boss2,即使boss 1和2同时存在,也只返回一种类型的boss坐标
之前老哥帮忙解决了,但是现在需要处理两组坐标,所以我有个思路就是能不能boss1和boss2两组坐标获取后,从新加入到一个数组里面,然后用新的数组对比自己的xy坐标计算出最近距离。。
大神们或者xjdgs老哥能否帮忙完善下代码,然后进行研究学习,谢谢各位了!


下面是代码
local myX=100  
local myY=100  myX,Y是自己的坐标
下面获得了两种类型boss所有的坐标
local arrboss1 = findPicAllPoint(0, 0, 1280, 768, "boss1.png" , 0.85)
local arrboss2 = findPicAllPoint(0, 0, 1280, 768, "boss2.png" , 0.85)
if arrboss1 ~= nil then
        for n = 1 , #arrboss1 do
                print("posXY:" , arrboss1[n].x , arrboss1[n].y)'-打印出所有BOSS1的坐标
        end
end


local arrboss2 = findPicAllPoint(0, 0, 1280, 768, "boss2.png" , 0.85)
if arrboss2 ~= nil then
        for n = 1 , #arrboss2 do
                print("posXY:" , arrboss2[n].x , arrboss2[n].y)'-打印出所有BOSS1的坐标
        end
end



这里是老哥计算方法,得到最近的坐标
-- 计算该坐标与自己的坐标之间的距离
        local distance = math.sqrt((posX - myX) ^ 2 + (posY - myY) ^ 2)

        -- 判断是否是距离最近的点
        if distance < closestDistance then
            closestDistance = distance -- 更新最近距离
            lastX = posX
            lastY = posY -- 更新最近坐标
        end
    end
end

-- 打印出距离自己最近的点
if lastX and lastY then
    print("Closest position:", lastX, lastY)
else
    print("No BOSS points found")
end


现在就是不知道怎么先将两组boss坐标数组  合并到一个数组里面,然后用新的数组坐标计算自己最近距离的坐标。。。新手请教,希望大神能够帮忙解决

最佳答案

查看完整内容

都说让你买个GPT了 一秒钟就能解决你得问题 问题分析 你目前的需求是: 分别获取到 boss1 和 boss2 的所有坐标; 将两组坐标合并到同一个数组; 在合并后的数组中,计算出距离自身 (myX, myY) 最近的那个坐标点。 稍复杂的地方在于如何合并两个数组以及对合并后的数组进行处理。以下是详情的代码和解释。 解决方案:完整代码 lua 复制代码 local myX = 100 local myY = 100 -- 自己的坐标 -- 初始化最终的最近点变量 local las ...
结帖率:92% (12/13)

签到天数: 12 天

发表于 7 天前 | 显示全部楼层   广西壮族自治区崇左市
都说让你买个GPT了 一秒钟就能解决你得问题 问题分析
你目前的需求是:

分别获取到 boss1 和 boss2 的所有坐标;
将两组坐标合并到同一个数组;
在合并后的数组中,计算出距离自身 (myX, myY) 最近的那个坐标点。
稍复杂的地方在于如何合并两个数组以及对合并后的数组进行处理。以下是详情的代码和解释。

解决方案:完整代码
lua
复制代码

local myX = 100
local myY = 100 -- 自己的坐标

-- 初始化最终的最近点变量
local lastX = nil
local lastY = nil
local closestDistance = math.huge -- 初始化为一个极大的数值

-- 获取 boss1 坐标数组
local arrboss1 = findPicAllPoint(0, 0, 1280, 768, "boss1.png", 0.85)
if arrboss1 ~= nil then
    for n = 1, #arrboss1 do
        print("Boss1 posXY:", arrboss1[n].x, arrboss1[n].y) -- 打印 boss1 所有坐标
    end
else
    arrboss1 = {} -- 如果没有找到 boss1,初始化为空数组
end

-- 获取 boss2 坐标数组
local arrboss2 = findPicAllPoint(0, 0, 1280, 768, "boss2.png", 0.85)
if arrboss2 ~= nil then
    for n = 1, #arrboss2 do
        print("Boss2 posXY:", arrboss2[n].x, arrboss2[n].y) -- 打印 boss2 所有坐标
    end
else
    arrboss2 = {} -- 如果没有找到 boss2,初始化为空数组
end

-- 合并 arrboss1 和 arrboss2 到一个新数组
local allBossPoints = {}
for i = 1, #arrboss1 do
    table.insert(allBossPoints, arrboss1[i]) -- 添加 boss1 的所有点
end
for i = 1, #arrboss2 do
    table.insert(allBossPoints, arrboss2[i]) -- 添��� boss2 的所有点
end

-- 遍历合并后的数组,找到距离 (myX, myY) 最近的点
for n = 1, #allBossPoints do
    local posX = allBossPoints[n].x
    local posY = allBossPoints[n].y

    -- 计算与自己的距离
    local distance = math.sqrt((posX - myX) ^ 2 + (posY - myY) ^ 2)

    -- 判断是否是最近点
    if distance < closestDistance then
        closestDistance = distance -- 更新最近距离
        lastX = posX
        lastY = posY -- 更新最近点的坐标
    end
end

-- 输出最近的点
if lastX and lastY then
    print("Closest position:", lastX, lastY)
else
    print("No BOSS points found")
end
详细解析
1. 获取 boss1 和 boss2 的坐标
通过 findPicAllPoint 函数,分别获取两类 BOSS 的坐标,并存储在 arrboss1 和 arrboss2 中。如果某一类 BOSS 的坐标未找到,则将其初始化为空数组(避免后续处理时报错)。

lua
复制代码

if arrboss1 ~= nil then
    for n = 1, #arrboss1 do
        print("Boss1 posXY:", arrboss1[n].x, arrboss1[n].y)
    end
else
    arrboss1 = {} -- 初始化为空数组
end
2. 合并两个数组
Lua 中可以使用 table.insert 将一个数组的元素逐一插入到另一个数组中。这里将 arrboss1 和 arrboss2 合并到新数组 allBossPoints 中。

lua
复制代码

local allBossPoints = {}
for i = 1, #arrboss1 do
    table.insert(allBossPoints, arrboss1[i])
end
for i = 1, #arrboss2 do
    table.insert(allBossPoints, arrboss2[i])
end
3. 寻找最近点
遍历合并后的数组,使用欧几里得距离公式计算各点与自身的距离,找出最近点。

lua
复制代码

local closestDistance = math.huge -- 初始化最近距离为一个很大的值
for n = 1, #allBossPoints do
    local posX = allBossPoints[n].x
    local posY = allBossPoints[n].y

    -- 计算与自己的距离
    local distance = math.sqrt((posX - myX) ^ 2 + (posY - myY) ^ 2)

    -- 判断并更新最近点
    if distance < closestDistance then
        closestDistance = distance
        lastX = posX
        lastY = posY
    end
end
4. 输出最近点
如果最终找到距离最近的点,则打印结果;若未找到任何点,则提示未找到 BOSS。

lua
复制代码

if lastX and lastY then
    print("Closest position:", lastX, lastY)
else
    print("No BOSS points found")
end
示例流程
假设返回的坐标如下:

arrboss1 = {{x=300, y=400}, {x=200, y=300}}
arrboss2 = {{x=150, y=250}, {x=400, y=500}}
合并结果:
allBossPoints = {{x=300, y=400}, {x=200, y=300}, {x=150, y=250}, {x=400, y=500}}

计算距离 (100, 100) 最近的点为:
{x=150, y=250}。

最终输出:

复制代码

Closest position: 150 250
总结
通过合并多个坐标数组,解决了限制返回单一类型的坐标问题,并能有效找到最近的目标。这种结构化的代码方便扩展和维护,适合 Lua 新手学习。如果需要进一步优化或调整,请继续交流!

评分

参与人数 1精币 +1 收起 理由
lucky8899 + 1 YYDS~!我去研究下GPT

查看全部评分

回复

使用道具 举报

结帖率:100% (18/18)

签到天数: 19 天

发表于 7 天前 | 显示全部楼层   山东省青岛市
function 数组合并(a, b)
    local result = {}
    for i = 1, #a do
        result = a
    end
    local len = #a
    for i = 1, #b do
        result[len + i] = b
    end
    return result
end

这个应该就可以吧。。

补充内容 (2025-1-12 08:49):
local Newarray = 数组合并(boss1,boss2)
回复

使用道具 举报

结帖率:100% (18/18)

签到天数: 19 天

发表于 7 天前 | 显示全部楼层   山东省青岛市
veryhigh2014 发表于 2025-1-12 08:46
function 数组合并(a, b)
    local result = {}
    for i = 1, #a do

function 数组合并(a, b)
    local result = {}
    for i = 1, #a do
        result = a
    end
    local len = #a
    for i = 1, #b do
        result[len + i] = b
    end
    return result
end


local Newarray = 数组合并(boss1,boss2)

补充内容 (2025-1-12 08:57):
发的内容 把数组下标给过滤- - 需要加上数组下标。。
result=a  result[len + i] = b
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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