Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ UO Pilot _ Поиск скученности пикселей

Автор: cirus 9.1.2017, 21:39

Скрипт позволяет находить объекты различной формы по нескольким цветам.
Файл с функцией распаковать и положить рядом с exe пилота.

find_heap_pixel, Версия 4.0
Прикрепленный файл  find_heap_pixel4.zip ( 2,58 килобайт ) Кол-во скачиваний: 472

Минимальная версия пилота 2.41 http://uopilot.uokit.com/. Запускать пилот от администратора.
Функция принимает таблицу с параметрами поиска.
Передаваемая таблица:
Код
find = {0, 0, 1920, 1080,      -- координаты поиска (через запятую можно указать шаг поиска, если требуется, по умолчанию шаг 1 1)
        radius = 10,    -- радиус разброса пикселей
        min_pixel_count = 15, max_pixel_count = 1000,   -- минимальное и максимальное количество всех пикселей в группе
        color = {63232, 4727553, 10213092},                  -- цвет или несколько цветов
        min_pixel_color = {0, 0, 0},             -- минимально количество пикселей каждого цвета (необязательный параметр, по умолчанию 0)
        deviation = {2, 0, 1},                       -- погрешность оттенка для каждого цвета (необязательный параметр, по умолчанию 0)
        min_color = 2}                        -- минимальное количество цветов, которые должны присутствовать в группе

Код
find = {0, 0, 1920, 1080,    
        x = 10, y = 15, deltaX = 0,      -- размер искомого объекта и смещение области поиска (необязательный параметр)
        min_pixel_count = 15, max_pixel_count = 1000,
        color = {63232,  "84235-86027", "R(11)+G(73-80)+B(1)"},                  
        min_pixel_color = {0, 0, 0},            
        deviation = {2, 0, 1},                    
        min_color = 2}

Функция возвращает 2 параметра: количество пикселей и массив с данными о группах.
Массив содержит:
Код
КоординатаX    КоординатаY    Всего_пикселей в группе_1    Количество_пикселей_первого_цвета    Второго_цвета и т. д
КоординатаX    КоординатаY    Всего_пикселей в группе_2    Количество_пикселей_первого_цвета    Второго_цвета и т. д

Координаты X и Y это центр группы.

Версия 4.0
1. Исправен баг.

Версия 3.0:
1. Исправлен небольшой баг. Возвращалась таблица даже если группа не найдена, теперь если группа пикселей найдена вторым аргументом возвращает таблицу, иначе nill.

Версия 2.0:
Добавлено:
1. Цвет можно указывать в виде диапазона "84235-86027" и по каналам "R(11)+G(73-80)+B(1)". Если какой-то канал не указан, то он не проверяется.
2. Погрешность в цвете (deviation) может быть не целым числом. Разделитель точка, например: 1.5 - погрешность 1.5%.
3. Вместо радиуса объекта можно указать его размеры X и Y.
4. Если указан размер объекта X и Y можно сместить область поиска. deltaX (необязательный параметр, по умолчанию 0) обозначает на сколько пикселей сместить область поиска по оси X относительно первого найденного пикселя. Максимальное смещение +-X / 2.
Картинка для пояснения
Прикрепленное изображение

Примеры использования (возможно цвета придётся указать свои, в разных браузерах цвет может отличаться):
Открыть картинку, запустить скрипт.
Пример 1
Прикрепленное изображение
Код
--lua
require("find_heap_pixel")  -- загрузка функции

-- таблица с параметрами поиска
local find = {0, 0, 1920, 1080,      -- координаты поиска
        radius = 10,                 -- радиус разброса пикселей
        min_pixel_count = 15, max_pixel_count = 1000,   -- минимальное и максимальное количество всех пикселей в группе
        color = {63232},                      -- цвет или несколько цветов
        min_pixel_color = {0},             -- минимально количество пикселей каждого цвета
        deviation = {2},                       -- погрешность оттенка для каждого цвета
        min_color = 1}                        -- минимальное количество цветов, которые должны присутствовать в группе

log ("clear") log ("mode compact") log ("open", 0, 700, 400, 300)
time = os.clock()
local a, group = find_heap_pixel(find)     -- вызов функции
log ("Всего найдено пикселей: " .. a)
log ("Затрачено времени: " .. string.format("%.3f", os.clock() - time) .. " мсек")
if group then
    for i = 1, #group do
        log (i .. "      " .. table.concat(group[i], " ", 1, 2))
        move (group[i][1], group[i][2])
        wait (500)
    end
end

Пример 2
Прикрепленное изображение
Код
--lua
require("find_heap_pixel")

local find = {0, 0, 1920, 1080,
        radius = 50,
        min_pixel_count = 20, max_pixel_count = 1000,
        color = {3289082},
        min_pixel_color = {0},
        deviation = {1},
        min_color = 1}

local find2 = {0, 0, 1920, 1080,
        radius = 50,
        min_pixel_count = 10, max_pixel_count = 100,
        color = {16183289, 11762371},
        deviation = {1, 1},
        min_color = 1}

log ("clear") log ("mode compact") log ("open", 0, 700, 400, 300)
time = os.clock()

local a, group = find_heap_pixel(find)
log ("Всего найдено пикселей: " .. a)
log ("Затрачено времени: " .. string.format("%.3f", os.clock() - time) .. " мсек")
if group then
    for i = 1, #group do
        log (i .. "      " .. table.concat(group[i], " ", 1, 2))
        move (group[i][1], group[i][2])
        wait (500)
    end
end

time = os.clock()
local b, group2 = find_heap_pixel(find2)
log ("Всего найдено пикселей: " .. b)
log ("Затрачено времени: " .. string.format("%.3f", os.clock() - time) .. " мсек")
if group2 then
    for i = 1, #group2 do
        log (i .. "      " .. table.concat(group2[i], " ", 1, 2))
        move (group2[i][1], group2[i][2])
        wait (500)
    end
end

Пример 3
Прикрепленное изображение
Код
--lua
require("find_heap_pixel")

local find = {0, 0, 1920, 1080,
        radius = 45,
        min_pixel_count = 50, max_pixel_count = 1000,
        color = {7590904, 14870765},
        min_pixel_color = {0, 0},
        deviation = {2,2},
        min_color = 2}

log ("clear") log ("mode compact") log ("open", 0, 700, 400, 300)
time = os.clock()

local a, group = find_heap_pixel(find)
log ("Всего найдено пикселей: " .. a)
log ("Затрачено времени: " .. string.format("%.3f", os.clock() - time) .. " мсек")
if group then
    for i = 1, #group do
        log ("Группа " .. i .. ", Координаты: " .. table.concat(group[i], " ", 1, 2) .. ", Пикселей в группе: " .. group[i][3])
        move (group[i][1], group[i][2])
        wait (500)
    end
end

Для подбора оптимальных цветов рекомендуется использовать https://forum.uokit.com/index.php?showtopic=20545

Старые версии (не актуальны):
find_heap_pixel, Версия 3.0
Прикрепленный файл  find_heap_pixel3.zip ( 2,56 килобайт ) Кол-во скачиваний: 465

find_heap_pixel, Версия 2.0
Прикрепленный файл  find_heap_pixel2.zip ( 2,54 килобайт ) Кол-во скачиваний: 404

find_heap_pixel, Версия 1.0
Прикрепленный файл  find_heap_pixel.zip ( 1,44 килобайт ) Кол-во скачиваний: 403

Этот же скрипт на языке пилота (работает медленно)
Код
set #r2 40          //радиус разброса точек
set #min 3       //минимальное количество всех пикселей в группе
set #max 500      //максимальное количество всех пикселей в группе
init_arr %xy (1) 0 0 1920 1080                            //область поиска
init_arr %color (1) 3466222 7138805 2209471 3399657                                                         //цвета для поиска (от 1 до 5 цветов)
init_arr %m (1) 0 0 0 0 0     //минимальное количество пикселей каждого цвета с учётом % отклонения (всегда должно быть 5 чисел)
init_arr %deviat (1) 1 1 1 1 0     // % отклонения для каждого цвета (всегда должно быть 5 чисел)
set #mincol 2          //минимальное количество любого из указанных цветов (от 1 до 5)
set #timeproc 0        // время для поиска, если 0 не выйдет из процедуры пока не найдётся хотя бы 1 цвет


set linedelay 0
log mode compact
while 1 = 1
    log clear
    set size(%result)      // уничтожить массив с прошлыми результатами поиска
    call heap %xy %color %m %deviat #r2 #min #max #mincol #timeproc
    if  size(%result) > 0                       // если найдено хотя бы 1 группа
        //save_array %result C:\resultarray.txt       // массив с результатами поиска
        log Всего найдено size(%result) групп из #pixel пикселей.
        log
        for #i 1 size(%result)
            log Группа #i --- из %result [#i 3] пикселей    %result [#i 4]  %result [#i 5]  %result [#i 6]  %result [#i 7] %result [#i 8]
            log Начальные координаты группы:   %result [#i 1] %result [#i 2]
            log
        end_for

        // Вывод в hint (можно убрать), если рабочее окно находится не в левом верхнем углу монитора будет отображать со смещением
        set #timeout 1000      // сколько времени отображать hint
        call hint %result size(%result) #size1 #group #timeout
        set #group 0
        set #size1 0
        proc hint %result #size #size1 #group #timeout
            set #size1 #size1 + 1
            set #group #group + 1
            if  #size = #size1
                while 1 = 1 and timer < #timeout
                    hint (16 clRed %result [#size1 1] %result [#size1 2] (#group))
                    wait 100
                end_while
            else
                hint (16 clRed %result [#size1 1] %result [#size1 2] (#group))
                call hint %result #size #size1 #group #timeout
            end_if
        end_proc
        //
    end_if
end_while
end_script

// процедура поиска
proc heap %xy %color %m %deviat #r2 #min #max #mincol #timeproc
    set #current_script current_script
    set delimiter ' '
    set #Xstart %xy[1 1]
    set #Ystart %xy[1 2]
    set #Xend %xy[1 3]
    set #Yend %xy[1 4]
    set #deviat maxx(%deviat[1])
    set #pix 0
    set #pix1 0
    set #g 0
    set size(%b)
    set size(%result)
    while size(%a) = 0 and (#timeproc > timer or #timeproc = 0)
        set #a findcolor(#Xstart #Ystart #Xend #Yend (%color[1]) %a 2 -1 #deviat)
        wait 10
    end_while
    set #pixel.#current_script #a
    if  #a > 0
        gosub rgb
        for #i 1 size(%a)
            set #g #g +1
            set #c1 0
            set #c2 0
            set #c3 0
            set #c4 0
            set #c5 0
            for #j #i size(%a)
                set #r round(point_distance(%a[#i 1] %a[#i 2] %a[#j 1] %a[#j 2]))
                if  #r < #r2
                    set #pixl #pix
                    if  %a[#j 3] >= %color[2 1] and %a[#j 3] <= %color[3 1]
                        set #c1 #c1 +1
                    else
                        if  %a[#j 3] >= %color[2 2] and %a[#j 3] <= %color[3 2]
                            set #c2 #c2 +1
                        else
                            if  %a[#j 3] >= %color[2 3] and %a[#j 3] <= %color[3 3]
                                set #c3 #c3 +1
                            else
                                if  %a[#j 3] >= %color[2 4] and %a[#j 3] <= %color[3 4]
                                    set #c4 #c4 +1
                                else
                                    if  %a[#j 3] >= %color[2 5] and %a[#j 3] <= %color[3 5]
                                        set #c5 #c5 +1
                                    end_if
                                end_if
                            end_if
                        end_if
                    end_if
                    set #pix #c1 +#c2 +#c3 +#c4 +#c5
                    if  #pixl != #pix
                        set %a[#j 4] #g
                    else
                        set %a[#j 4] 0
                    end_if
                end_if
            end_for
            init_arr %b (#g) %a[#i 1] %a[#i 2] #pix #c1 #c2 #c3 #c4 #c5
            for #i #i size(%a)
                if  %a[#i 4] = ""
                    set #i #i -1
                    break
                end_if
            end_for
        end_for
        set #z 0
        for #l 1 size(%b)
            if  %b[#l 3] >= #min and %b[#l 3] <= #max
                if  (%b[#l 4] >= %m[1 1] or %m[1 1] = 0) and (%b[#l 5] >= %m[1 2] or %m[1 2] = 0) and (%b[#l 6] >= %m[1 3] or %m[1 3] = 0) and (%b[#l 7] >= %m[1 4] or %m[1 4] = 0) and (%b[#l 8] >= %m[1 5] or %m[1 5] = 0)
                    set #z1 0
                    for #m 4 8
                        if  %b[#l #m] > 0
                            set #z1 #z1 +1
                        end_if
                    end_for
                    if  #z1 >= #mincol
                        set #z #z +1
                        init_arr %result (#z) %b[#l]
                    end_if
                end_if
            end_if
        end_for
        for #i 1 size(%result)
            for #j 1 size(%result[])
                set %result.#current_script [#i #j] %result [#i #j]
            end_for
        end_for
    end_if
    goto end

    :rgb
        for #n 1 size(%color[1])
            set #cvet %color[1 #n]
            set #a1 colortorgb(#cvet %rgb)
            set #dev 255*%deviat[1 #n]/100
            set #bmin %rgb[1 3]-#dev
            set #bmax %rgb[1 3]+#dev
            if  #bmax > 255
                set #bmax 255
            end_if
            if  #bmin < 0
                set #bmin 0
            end_if
            set #gmin %rgb[1 2]-#dev
            set #gmax %rgb[1 2]+#dev
            if  #gmax > 255
                set #gmax 255
            end_if
            if  #gmin < 0
                set  #gmin 0
            end_if
            set #rmin %rgb[1 1]-#dev
            set #rmax %rgb[1 1]+#dev
            if  #rmax > 255
                set #rmax 255
            end_if
            if  #rmin < 0
                set #rmin 0
            end_if
            set %color[2 #n] #bmin *256*256+#gmin *256+#rmin
            set %color[3 #n] #bmax *256*256+#gmax *256+#rmax
        end_for
    return

    :end
end_proc

Скрипт позволяет находить объекты различной формы по нескольким цветам. Указать можно от 1 до 5 цветов. Версия пилота 2.38 или выше.
https://youtu.be/zET6Qg9BROo

Результат из процедуры возвращается в массив %result. В первой строке массива информация по первой группе, во второй строке по второй и т. д.
%result [1 1] - координата X первой группы
%result [1 2] - координата Y первой группы
%result [1 3] - из скольких пикселей состоит первая группа
%result [1 4] - количество пикселей первого цвета
%result [1 5] - второго (если указан)
%result [1 6] - третьего
%result [1 7] - четвёртого
%result [1 8] - пятого
Количество найденных групп size(%result).
Количество найденных пикселей содержится в переменной #pixel.

set #r2 40 - радиус разброса точек, примерный размер искомого объекта в пикселях, лучше указать больше, чем меньше.
set #min 3 - минимальное количество всех пикселей в группе.
set #max 500 - максимальное количество всех пикселей в группе.
init_arr %xy (1) 0 0 1920 1080 - область поиска
init_arr %color (1) 3466222 7138805 2209471 3399657 - цвета для поиска (от 1 до 5 цветов)
init_arr %m (1) 0 0 0 0 0 - минимальное количество пикселей в группе каждого цвета с учётом deviation (всегда должно быть 5 чисел)
init_arr %deviat (1) 1 1 1 1 0 - погрешность оттенка в % для каждого цвета (всегда должно быть 5 чисел)
set #mincol 2 - минимальное количество любого из указанных цветов (от 1 до 5), например, в %color указано 4 цвета, чтобы пиксели считались одной группой, как минимум 2 цвета должны присутствовать.
set #timeproc 0 - время для поиска цветов (вычисления в это время не входят), если 0 не выйдет из процедуры пока не найдётся хотя бы 1 цвет.

Автор: DarkMaster 15.1.2017, 2:02

Цитата
Скрипт работает не слишком быстро. Нужно делать функцию.

Скоро будешь переписывать, чтобы работал быстро(тссс).

Автор: cirus 29.7.2017, 3:43

Перенесено в первый пост.

Автор: DarkMaster 15.8.2017, 11:01

Производительность сравнивал?

Автор: cirus 15.8.2017, 12:02

Цитата
Производительность сравнивал?

Сравнение не совсем корректное, т. к. изменён принцип поиска групп. Но все-таки, 57 секунд на языке пилота и тоже самое 180 мсек на lua.

Автор: rus2146 30.6.2018, 15:03

Здравствуйте ваш скрипт отлично работает но при попытки дописать к нему нажатие скилов и тюд выдает ошибку это возможно или нада писать 2й который который запускался после этого? тока после move прописал строчку на left работает нормального остальные дополнение выдают ошибку

Автор: cirus 30.6.2018, 15:34

Скрипт, который на луа или языке пилота?

Автор: rus2146 30.6.2018, 16:40

Цитата(cirus @ 30.6.2018, 15:34) *

Скрипт, который на луа или языке пилота?

на луа

Автор: cirus 30.6.2018, 17:45

Можно дописать нужные действия. Тут 2 варианта.
1. Дописать нужные действия в этом скрипте на луа.
2. Запускать другой скрипт, который можно написать хоть на луа, хоть на языке пилота.
http://uopilot.tati.pro/index.php?title=Введение_в_синтаксис_Lua
http://uopilot.tati.pro/index.php?title=Список_функций_(Lua)

Код
--lua
require("find_heap_pixel")  -- загрузка функции

-- таблица с параметрами поиска
find = {0, 0, 1920, 1080,      -- координаты поиска
radius = 100,                 -- радиус разброса пикселей
min_pixel_count = 5, max_pixel_count = 1000,   -- минимальное и максимальное количество всех пикселей в группе
color = {9896023, 35807},                      -- цвет или несколько цветов
min_pixel_color = {0, 0},             -- минимально количество пикселей каждого цвета
deviation = {5, 5},                       -- погрешность оттенка для каждого цвета
min_color = 2}                        -- минимальное количество цветов, которые должны присутствовать в группе

while 1 do  -- выполнять бесконечно
    local a, group = find_heap_pixel(find)     -- вызов функции

    if group and #group > 0 then   -- если моб найден
        kleft (group[1][1], group[1][2])     -- клик по нему

        -- тут нужные действия, например:
        start_script(1, "wait")    -- запустить скрипт 1 и ждать когда он завершит работу
    end
end

Скрипт найдет моба, кликнет по нему и запустит скрипт1 и будет ждать когда скрипт1 завершит работу, допустим убьёт моба.

Автор: rus2146 30.6.2018, 19:55

Цитата(cirus @ 30.6.2018, 17:45) *

Можно дописать нужные действия. Тут 2 варианта.
1. Дописать нужные действия в этом скрипте на луа.
2. Запускать другой скрипт, который можно написать хоть на луа, хоть на языке пилота.
http://uopilot.tati.pro/index.php?title=Введение_в_синтаксис_Lua
http://uopilot.tati.pro/index.php?title=Список_функций_(Lua)
Код
--lua
require("find_heap_pixel")  -- загрузка функции

-- таблица с параметрами поиска
find = {0, 0, 1920, 1080,      -- координаты поиска
radius = 100,                 -- радиус разброса пикселей
min_pixel_count = 5, max_pixel_count = 1000,   -- минимальное и максимальное количество всех пикселей в группе
color = {9896023, 35807},                      -- цвет или несколько цветов
min_pixel_color = {0, 0},             -- минимально количество пикселей каждого цвета
deviation = {5, 5},                       -- погрешность оттенка для каждого цвета
min_color = 2}                        -- минимальное количество цветов, которые должны присутствовать в группе

while 1 do  -- выполнять бесконечно
    local a, group = find_heap_pixel(find)     -- вызов функции

    if group and #group > 0 then   -- если моб найден
        kleft (group[1][1], group[1][2])     -- клик по нему

        -- тут нужные действия, например:
        start_script(1, "wait")    -- запустить скрипт 1 и ждать когда он завершит работу
    end
end

Скрипт найдет моба, кликнет по нему и запустит скрипт1 и будет ждать когда скрипт1 завершит работу, допустим убьёт моба.

все работает спасибо но с толкнулся с проблемой прописания кардинат чтоб перс не багал по всей локе как я понял он ищет с верхннего левого по низ право а с помощью ctrl+a вставляю карддинаты выдает ошибку или в луа как то подругому надо их определять

Автор: cirus 30.6.2018, 20:12

Цитата
или в луа как то подругому надо их определять

Разница только в том что параметры указываются в скобках, через запятую. Т. е. если было kleft 100 100, то в луа kleft (100, 100).
Если имеются ввиду координаты передаваемые в функцию, то следите чтоб везде были запятые.
Цитата
чтоб перс не багал по всей локе

Если координаты перса известны, то можно находить ближайшего моба.

Автор: rus2146 1.7.2018, 14:24

Цитата(cirus @ 30.6.2018, 20:12) *

Разница только в том что параметры указываются в скобках, через запятую. Т. е. если было kleft 100 100, то в луа kleft (100, 100).
Если имеются ввиду координаты передаваемые в функцию, то следите чтоб везде были запятые.

Если координаты перса известны, то можно находить ближайшего моба.

координаты локации поиска
find = {0, 0, 1920, 1080, -- координаты поиска
их когда меняю оштбку выдает как как сделать чтоб ближайщего убивал или он уже ближайщего гасит по тогму скрипту что выше в луа так поиск?

Автор: cirus 1.7.2018, 15:09

Цитата
когда меняю оштбку выдает

На какие меняете? И что за ошибку пишет?
Цитата
как сделать чтоб ближайщего убивал

Картинку скиньте, на которой есть перс и мобы.

Автор: rus2146 3.7.2018, 12:34

Цитата(cirus @ 1.7.2018, 15:09) *

На какие меняете? И что за ошибку пишет?

Картинку скиньте, на которой есть перс и мобы.

вот скрин



Прикрепленные файлы
Прикрепленный файл  2018_07_03_153211.bmp ( 1,12 мегабайт ) Кол-во скачиваний: 547

Автор: cirus 3.7.2018, 13:10

Обновил скрипт (в первом посте), исправлен небольшой баг. Скачайте его.
Прикрепленный файл  111.zip ( 2,5 мегабайт ) Кол-во скачиваний: 378
В архиве видео. Пример как найти координаты перса, найти координаты мобов и навести курсор на ближайшего к персу моба.
Файл с функцией распаковать и положить рядом с exe пилота, открыть картинку в пайнте и запустить скрипт. Прикрепленный файл  2018_07_03_153211.bmp ( 1,12 мегабайт ) Кол-во скачиваний: 618

Скрипт, найти ближайшего к персу моба
Код
--lua
require("find_heap_pixel")  -- загрузка функции

-- функция находит ближайшего к персу моба
-- принимает координаты перса и массив с координатами мобов
function min_distance(persX, persY, arr)
    local function distance(x1, y1, x2, y2)
       return math.sqrt((x1-x2)^2+(y1-y2)^2)
    end
    local min, minNum, dist = 9999999, -1
    for i=1, #arr do
        dist=distance(persX, persY, arr[i][1], arr[i][2])
        if dist < min then min=dist minNum=i end
    end
    return arr[minNum][1], arr[minNum][2]    -- возвращает координаты ближайшего моба
end
----------------

-- таблица с параметрами поиска мобов
local mob = {0, 0, 1920, 1080,      -- координаты поиска
radius = 100,                 -- радиус разброса пикселей
min_pixel_count = 30, max_pixel_count = 1000,   -- минимальное и максимальное количество всех пикселей в группе
color = {14122975},                      -- цвет или несколько цветов
min_pixel_color = {0},             -- минимально количество пикселей каждого цвета
deviation = {5},                       -- погрешность оттенка для каждого цвета
min_color = 1}                        -- минимальное количество цветов, которые должны присутствовать в группе

-- таблица с параметрами поиска перса
local pers = {0, 0, 1920, 1080,      -- координаты поиска
radius = 80,                 -- радиус разброса пикселей
min_pixel_count = 50, max_pixel_count = 1000,   -- минимальное и максимальное количество всех пикселей в группе
color = {4145143 , 1032191, 48127},                      -- цвет или несколько цветов
min_pixel_color = {0, 0, 0},             -- минимально количество пикселей каждого цвета
deviation = {5, 5, 5},                       -- погрешность оттенка для каждого цвета
min_color = 3}                        -- минимальное количество цветов, которые должны присутствовать в группе

local a, group = find_heap_pixel(mob)     -- вызов функции
local b, group2 = find_heap_pixel(pers)     -- вызов функции
--log (group, group2)  -- результат поиска, если nill - не найдено,  LuaTable - найдено

if group and group2 then   -- если моб и перс найдены
    local x, y = min_distance(group2[1][1], group2[1][2], group)  -- передаём в функцию координаты перса и массив с координатами мобов
    move (x, y)     -- навести курсор на моба
    -- тут нужные действия
end

Автор: rus2146 6.7.2018, 11:25

Цитата(cirus @ 3.7.2018, 13:10) *

Обновил скрипт (в первом посте), исправлен небольшой баг. Скачайте его.
Прикрепленный файл  111.zip ( 2,5 мегабайт ) Кол-во скачиваний: 378
В архиве видео. Пример как найти координаты перса, найти координаты мобов и навести курсор на ближайшего к персу моба.
Файл с функцией распаковать и положить рядом с exe пилота, открыть картинку в пайнте и запустить скрипт. Прикрепленный файл  2018_07_03_153211.bmp ( 1,12 мегабайт ) Кол-во скачиваний: 618

Скрипт, найти ближайшего к персу моба
Код
--lua
require("find_heap_pixel")  -- загрузка функции

-- функция находит ближайшего к персу моба
-- принимает координаты перса и массив с координатами мобов
function min_distance(persX, persY, arr)
    local function distance(x1, y1, x2, y2)
       return math.sqrt((x1-x2)^2+(y1-y2)^2)
    end
    local min, minNum, dist = 9999999, -1
    for i=1, #arr do
        dist=distance(persX, persY, arr[i][1], arr[i][2])
        if dist < min then min=dist minNum=i end
    end
    return arr[minNum][1], arr[minNum][2]    -- возвращает координаты ближайшего моба
end
----------------

-- таблица с параметрами поиска мобов
local mob = {0, 0, 1920, 1080,      -- координаты поиска
radius = 100,                 -- радиус разброса пикселей
min_pixel_count = 30, max_pixel_count = 1000,   -- минимальное и максимальное количество всех пикселей в группе
color = {14122975},                      -- цвет или несколько цветов
min_pixel_color = {0},             -- минимально количество пикселей каждого цвета
deviation = {5},                       -- погрешность оттенка для каждого цвета
min_color = 1}                        -- минимальное количество цветов, которые должны присутствовать в группе

-- таблица с параметрами поиска перса
local pers = {0, 0, 1920, 1080,      -- координаты поиска
radius = 80,                 -- радиус разброса пикселей
min_pixel_count = 50, max_pixel_count = 1000,   -- минимальное и максимальное количество всех пикселей в группе
color = {4145143 , 1032191, 48127},                      -- цвет или несколько цветов
min_pixel_color = {0, 0, 0},             -- минимально количество пикселей каждого цвета
deviation = {5, 5, 5},                       -- погрешность оттенка для каждого цвета
min_color = 3}                        -- минимальное количество цветов, которые должны присутствовать в группе

local a, group = find_heap_pixel(mob)     -- вызов функции
local b, group2 = find_heap_pixel(pers)     -- вызов функции
--log (group, group2)  -- результат поиска, если nill - не найдено,  LuaTable - найдено

if group and group2 then   -- если моб и перс найдены
    local x, y = min_distance(group2[1][1], group2[1][2], group)  -- передаём в функцию координаты перса и массив с координатами мобов
    move (x, y)     -- навести курсор на моба
    -- тут нужные действия
end


1 вопрос он выполняет действия 1 раз а фунции ю на повтор вставляю выдает ошибку как в пред скрипте
while 1 do -- выполнять бесконечно

Автор: cirus 6.7.2018, 11:33

Кроме while 1 do надо ещё end добавлять.

Код
while 1 do
    -- тут действия, которые выполняются в цикле
    wait (1)  -- пауза чтобы не грузить процесор
end

код
Код
--lua
require("find_heap_pixel")  -- загрузка функции

-- функция находит ближайшего к персу моба
-- принимает координаты перса и массив с координатами мобов
function min_distance(persX, persY, arr)
    local function distance(x1, y1, x2, y2)
       return math.sqrt((x1-x2)^2+(y1-y2)^2)
    end
    local min, minNum, dist = 9999999, -1
    for i=1, #arr do
        dist=distance(persX, persY, arr[i][1], arr[i][2])
        if dist < min then min=dist minNum=i end
    end
    return arr[minNum][1], arr[minNum][2]    -- возвращает координаты ближайшего моба
end
----------------

-- таблица с параметрами поиска мобов
local mob = {0, 0, 1920, 1080,      -- координаты поиска
radius = 100,                 -- радиус разброса пикселей
min_pixel_count = 30, max_pixel_count = 1000,   -- минимальное и максимальное количество всех пикселей в группе
color = {14122975},                      -- цвет или несколько цветов
min_pixel_color = {0},             -- минимально количество пикселей каждого цвета
deviation = {5},                       -- погрешность оттенка для каждого цвета
min_color = 1}                        -- минимальное количество цветов, которые должны присутствовать в группе

-- таблица с параметрами поиска перса
local pers = {0, 0, 1920, 1080,      -- координаты поиска
radius = 80,                 -- радиус разброса пикселей
min_pixel_count = 50, max_pixel_count = 1000,   -- минимальное и максимальное количество всех пикселей в группе
color = {4145143 , 1032191, 48127},                      -- цвет или несколько цветов
min_pixel_color = {0, 0, 0},             -- минимально количество пикселей каждого цвета
deviation = {5, 5, 5},                       -- погрешность оттенка для каждого цвета
min_color = 3}                        -- минимальное количество цветов, которые должны присутствовать в группе

while 1 do
    local a, group = find_heap_pixel(mob)     -- вызов функции
    local b, group2 = find_heap_pixel(pers)     -- вызов функции
    --log (group, group2)  -- результат поиска, если nill - не найдено,  LuaTable - найдено

    if group and group2 then   -- если моб и перс найдены
        local x, y = min_distance(group2[1][1], group2[1][2], group)  -- передаём в функцию координаты перса и массив с координатами мобов
        move (x, y)     -- навести курсор на моба

        -- тут нужные действия
        wait (3000)
    end
end

Автор: rus2146 6.7.2018, 12:36

Цитата(cirus @ 6.7.2018, 11:33) *

Кроме while 1 do надо ещё end добавлять.
Код
while 1 do
    -- тут действия, которые выполняются в цикле
    wait (1)  -- пауза чтобы не грузить процесор
end

код
Код
--lua
require("find_heap_pixel")  -- загрузка функции

-- функция находит ближайшего к персу моба
-- принимает координаты перса и массив с координатами мобов
function min_distance(persX, persY, arr)
    local function distance(x1, y1, x2, y2)
       return math.sqrt((x1-x2)^2+(y1-y2)^2)
    end
    local min, minNum, dist = 9999999, -1
    for i=1, #arr do
        dist=distance(persX, persY, arr[i][1], arr[i][2])
        if dist < min then min=dist minNum=i end
    end

    return arr[minNum][1], arr[minNum][2]    -- возвращает координаты ближайшего моба
end
----------------

-- таблица с параметрами поиска мобов
local mob = {0, 0, 1920, 1080,      -- координаты поиска
radius = 100,                 -- радиус разброса пикселей
min_pixel_count = 30, max_pixel_count = 1000,   -- минимальное и максимальное количество всех пикселей в группе
color = {14122975},                      -- цвет или несколько цветов
min_pixel_color = {0},             -- минимально количество пикселей каждого цвета
deviation = {5},                       -- погрешность оттенка для каждого цвета
min_color = 1}                        -- минимальное количество цветов, которые должны присутствовать в группе

-- таблица с параметрами поиска перса
local pers = {0, 0, 1920, 1080,      -- координаты поиска
radius = 80,                 -- радиус разброса пикселей
min_pixel_count = 50, max_pixel_count = 1000,   -- минимальное и максимальное количество всех пикселей в группе
color = {4145143 , 1032191, 48127},                      -- цвет или несколько цветов
min_pixel_color = {0, 0, 0},             -- минимально количество пикселей каждого цвета
deviation = {5, 5, 5},                       -- погрешность оттенка для каждого цвета
min_color = 3}                        -- минимальное количество цветов, которые должны присутствовать в группе

while 1 do
    local a, group = find_heap_pixel(mob)     -- вызов функции
    local b, group2 = find_heap_pixel(pers)     -- вызов функции
    --log (group, group2)  -- результат поиска, если nill - не найдено,  LuaTable - найдено

    if group and group2 then   -- если моб и перс найдены
        local x, y = min_distance(group2[1][1], group2[1][2], group)  -- передаём в функцию координаты перса и массив с координатами мобов
        move (x, y)     -- навести курсор на моба

        -- тут нужные действия
        wait (3000)
    end
end


ясно спсибо


Автор: Sts777 27.5.2019, 23:33

ФУНКЦИЯ ПЕРЕМЕЩАЕТ КУРСОР В ТОЧКУ 1,1 ЭКРАНА

Воспользовался данным скриптом, лог выдает

23:31:24 4 (autosaved_4.txt, 0): LuaTable LuaTable
23:31:40 4 (autosaved_4.txt, 0): LuaTable LuaTable

т.е. находит? но мышь в верхний левый угол экрана передвигает.



--lua
require("find_heap_pixel") -- загрузка функции

-- функция находит ближайшего к персу моба
-- принимает координаты перса и массив с координатами мобов
function min_distance(persX, persY, arr)
local function distance(x1, y1, x2, y2)
return math.sqrt((x1-x2)^2+(y1-y2)^2)
end
local min, minNum, dist = 9999999, -1
for i=1, #arr do
dist=distance(persX, persY, arr[i][1], arr[i][2])
if dist < min then min=dist minNum=i end
end
return arr[minNum][1], arr[minNum][2] -- возвращает координаты ближайшего моба
end
----------------

-- таблица с параметрами поиска мобов
local mob = {0, 0, 1920, 1080, -- координаты поиска
radius = 100, -- радиус разброса пикселей
min_pixel_count = 3, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {8286081}, -- цвет или несколько цветов
min_pixel_color = {0}, -- минимально количество пикселей каждого цвета
deviation = {5}, -- погрешность оттенка для каждого цвета
min_color = 1} -- минимальное количество цветов, которые должны присутствовать в группе

-- таблица с параметрами поиска перса
local pers = {0, 0, 1920, 1080, -- координаты поиска
radius = 80, -- радиус разброса пикселей
min_pixel_count = 5, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {5652309, 5586516, 5652052}, -- цвет или несколько цветов
min_pixel_color = {0, 0, 0}, -- минимально количество пикселей каждого цвета
deviation = {5, 5, 5}, -- погрешность оттенка для каждого цвета
min_color = 2} -- минимальное количество цветов, которые должны присутствовать в группе

local a, group = find_heap_pixel(mob) -- вызов функции
local b, group2 = find_heap_pixel(pers) -- вызов функции
log (group, group2) -- результат поиска, если nill - не найдено, LuaTable - найдено

if group and group2 then -- если моб и перс найдены
local x, y = min_distance(group2[1][1], group2[1][2], group) -- передаём в функцию координаты перса и массив с координатами мобов
move (x, y) -- навести курсор на моба
-- тут нужные действия
end

Автор: cirus 28.5.2019, 15:07

Версия пилота какая? Попробуйте 2.40, в 2.41 менялся синтаксис findcolor.

Автор: dron4938 16.12.2021, 13:20

https://ibb.co/7WC8b3z
Не очень понял. Радиус ищет только вниз, т.е область полумесяца?
или и вверх тоже?

И какой пиксель находится первым? Тот что указан в строке поиска первым? Или тут без разницы.
Если я укажу зеленый первым, то все равно первый найдет фиолетовый?
https://ibb.co/rsCjG7T

Автор: cirus 16.12.2021, 15:21

Цитата
Если я укажу зеленый первым, то все равно первый найдет фиолетовый?

Да. Нет разницы в каком порядке они указаны.

Автор: dron4938 17.12.2021, 5:39

Цитата(cirus @ 30.6.2018, 17:45) *

Можно дописать нужные действия. Тут 2 варианта.
1. Дописать нужные действия в этом скрипте на луа.
2. Запускать другой скрипт, который можно написать хоть на луа, хоть на языке пилота.
http://uopilot.tati.pro/index.php?title=Введение_в_синтаксис_Lua
http://uopilot.tati.pro/index.php?title=Список_функций_(Lua)
Код
--lua
require("find_heap_pixel")  -- загрузка функции

-- таблица с параметрами поиска
find = {0, 0, 1920, 1080,      -- координаты поиска
radius = 100,                 -- радиус разброса пикселей
min_pixel_count = 5, max_pixel_count = 1000,   -- минимальное и максимальное количество всех пикселей в группе
color = {9896023, 35807},                      -- цвет или несколько цветов
min_pixel_color = {0, 0},             -- минимально количество пикселей каждого цвета
deviation = {5, 5},                       -- погрешность оттенка для каждого цвета
min_color = 2}                        -- минимальное количество цветов, которые должны присутствовать в группе

while 1 do  -- выполнять бесконечно
    local a, group = find_heap_pixel(find)     -- вызов функции

    if group and #group > 0 then   -- если моб найден
        kleft (group[1][1], group[1][2])     -- клик по нему

        -- тут нужные действия, например:
        start_script(1, "wait")    -- запустить скрипт 1 и ждать когда он завершит работу
    end
end

Скрипт найдет моба, кликнет по нему и запустит скрипт1 и будет ждать когда скрипт1 завершит работу, допустим убьёт моба.

https://imgbb.com/
функция в бесконечном цикле жрет 30 фпс в игре. Как вылечить это?

Автор: cirus 17.12.2021, 11:17

Цитата
функция в бесконечном цикле жрет 30 фпс в игре. Как вылечить это?

Никак, это же не функция для распознавания текста.

Автор: Мащекус 14.2.2023, 20:28

Всем привет!
Ребятушки, а в Lua вообще отдельно Findcolor есть, как в пилоте?
Просто скрипт огонь (автору огромный респектос). Мне бы в условие Findcolor вставить, чтобы понять когда тормозить клики... т.к. даже при радиусе 5 пикселей, иногда не попадает в нужную область с первого раза.

--lua
require("find_heap_pixel")

local find = {0, 0, 1920, 1080,
radius = 5,
min_pixel_count = 0, max_pixel_count = 1000,
color = {870911, 8411405},
min_pixel_color = {0, 0},
deviation = {0,5},
min_color = 2}

local a, group = find_heap_pixel(find)

if group then
for i = 1, #group do
double_kleft (group[i][1], group[i][2])
wait (500)

----- ВОТ ТУТ БЫ ВСТАВИТЬ Findcolor и break, для понимания, что по мобу попали, на нем появился таргет

end
end

Автор: Madeus 15.2.2023, 3:22

https://forum.uokit.com/index.php?showtopic=70978&hl=findcolor&st=0

Автор: nykep 19.2.2023, 1:08

эта функция слишком сложна для меня(хотя разбираться в ней нет необходимости), а если искать скученность вот так

Код

--lua
local x, y, x1, y1 = 0, 0, 0, 0
while 1 == 1 do
    local a = findcolor(0, 0, 1920, 1080, "(12225101-12291882)", '%arr', 2, 1, 0)  --найти один пиксель или сколько захотите
    if a then
        x = arr[1][1] - 10
        y = arr[1][2] - 10
        x1 = arr[1][1] + 10
        y1 = arr[1][2] + 10
        local b = findcolor(x, y, x1, y1, "(12225101-12291882)", '%arr', 2, -1, 0)  --проверить область 20х20 вокруг найденного пикселя
        if b > 5 then    --если в квадрате больше 5 нужных цветов то

        end
    end
end

насколько велика разница?

Автор: DarkMaster 19.2.2023, 9:22

просто и элегантно. рекомендую делать getimage в данном случае чтобы дергать изображение только один раз.

Автор: DarkMaster 19.2.2023, 10:55

Цитата
x = arr[1][1] - 10
y = arr[1][2] - 10
x1 = arr[1][1] + 10
y1 = arr[1][2] + 10

В минус смысла делать нет - там мы уже проверили. Т.е. должно быть:
Код

    x = arr[1][1]
    y = arr[1][2]
    x1 = arr[1][1] + 20
    y1 = arr[1][2] + 20

Результат будет в любом случае, но так он будет быстрее во многих ситуацих.

Автор: nykep 19.2.2023, 14:57

Цитата(DarkMaster @ 19.2.2023, 10:55) *

В минус смысла делать нет - там мы уже проверили. Т.е. должно быть:
Код

    x = arr[1][1]
    y = arr[1][2]
    x1 = arr[1][1] + 20
    y1 = arr[1][2] + 20

Результат будет в любом случае, но так он будет быстрее во многих ситуацих.

и правда, спасибо за подсказку

Автор: nykep 19.2.2023, 15:33

наверное по Х все таки надо отнимать, например если объект имеет какую-нибудь такую форму
Изображение

Автор: DarkMaster 19.2.2023, 17:18

Пожалуй соглашусь.

Автор: nykep 19.2.2023, 21:00

Цитата(DarkMaster @ 19.2.2023, 9:22) *

просто и элегантно. рекомендую делать getimage в данном случае чтобы дергать изображение только один раз.

не могу разобраться с getimage, взял пример с вики
Код

address, width, height, length = getimage (100, 100, 1000, 1000)
log (address) -- адрес в памяти
log (width)   -- ширина изображения
log (height)  -- высота изображения
log (length)  -- длина строки в байтах

какие бы значения я не записал в getimage, в логах всегда пишет ширину 1921 и длину 1081.
После поиска на форуме решил что findcolor в запомненной картинке должен выглядеть так
Код

local a = findcolor(0, 0, width, height, 12345, '%arr', address, 1, 0)

но размеры как я понял он определяет неверно, получается надо самому прописывать вычисление ширины и высоты или я неправильно понял?

Автор: DarkMaster 19.2.2023, 21:38

пример фунции под имидж.
Я не могу дать никакой гарантии по поводу еденичек пограничных. В плане того нужно считать с 0 или с 1 и заканчивать x2-x1 (+1-1 или 0?).

Код
local my_find = function(x1, y1, x2, y2, image, method, acc, count, deviation, edge)
    local img, h, w, l = getimage(x1, y1, x2, y2, method)
    ext.black_and_white(img, h, w, l, edge)
    local arr, err = findimage(0, 0, x2-x1, y2-y1, image, method, acc, count, deviation)
    return arr, err
end


Цитата
какие бы значения я не записал в getimage, в логах всегда пишет ширину 1921 и длину 1081.

гетимидж условно создает квадрат малевича размером с приложение или рабочий стол, потом в левый верхний угол закидывает тот кусок изображения который запрашивался. По сути баг.

Автор: nykep 19.2.2023, 22:04

с размерами понятно, спасибо, хочу только уточнить - адрес нужно записывать туда где тип поиска и в findcolor и в findimage?

Автор: DarkMaster 19.2.2023, 22:12

да

Автор: nykep 20.2.2023, 1:02

в общем у меня че то не получается, нарисовал в пэинте толстую красную линию, у меня задача сначала найти ближайшую точку, потом проверить скопление вокруг нее, перед запуском открываю картинку на весь экран без каких либо рамок

Код
--lua
local gip, min, x, y, x1, x2, y1, y2 = 0, 0, 0, 0, 0, 0, 0, 0
while 1 == 1 do
    fog = getimage (179, 84, 1049, 651)
    local A = findcolor(0, 0, 870, 567, 2366701, '%arr', fog, -1, 0)
    if A then
        for i = 1, A do   -- поиск ближайшей точки
            gip = math.sqrt((960 - arr[i][1])^2 + (520 - arr[i][2])^2)
            if i == 1 then
                min = gip
            end
            if min >= gip then
                min = gip
                x = arr[i][1]
                y = arr[i][2]
            end
        end
        --move (x + 179, y + 84)  --до сюда всё работает как надо указывает на ближайшую точку
        x1 = x - 10
        y1 = y - 10       --это в случае с ближайшей точкой тоже нужно, так как она может быть в самом низу
        x2 = x + 10
        y2 = y + 10
        local B = findcolor(x1, y1, x2, y2, 2366701, '%arr2', fog, -1, 0) -- не может найти ни одной точки, как будто что-то со смещением, но не могу понять что.
                                   -- Визуально и по логам указывает на ту область(x1, y1, x2, y2) где была найдена эта ближайшая точка.
                                                                   -- Если поменять +-10 на +-50 тогда что-то находит, но ясности это не вносит
        if B and B > 3 then
            x = x + 179
            y = y + 84
            move (x, y)
            wait (1000)
        end
        deleteimage (fog)
    end
end

Автор: DarkMaster 20.2.2023, 8:41

Код

local ffi=require "ffi"
local rmem=ffi.cast

local ext = {}
ext.color_to_rgb = function(c)
    local r,g,b
    b = math.floor(c/65536)
    g = math.floor(c/256-b*256)
    r = c-b*256*256-g*256
    return r, g ,b
end


ext.pix_painting = function(img, x, y, color)
    local r, g, b = ext.color_to_rgb(color)
    local pix = rmem("unsigned char*", img[1])
    pix[ img[4]*y + x*3 ]  = b
    pix[ img[4]*y + x*3+1] = g
    pix[ img[4]*y + x*3+2] = r
end

Попробуй покрасить углы и сохранить изображение качестве отладки.
img - в данном случае массив {address, h, w, l}
сохранять обычным saveimage

Автор: nykep 20.2.2023, 17:08

блин, это для меня темный лес. Единственное, могу сказать что saveimage сохраняет картинку слева сверху обрезанную по координатам указанным в getimage, а справа вниз весь оставшийся экран независимо от того какие конечные координаты я напишу. Но по-моему проблема не в этом, потому что этот скрипт выше я делю пополам, сначала выполняю первый поиск и всё нормально, потом из него беру полученную область для второго поиска, записываю в отдельный скрипт тот же самый getimage и этот второй поиск с координатами которые получил в первом и никакого толку. Может я какую то ошибку делаю, но у меня уже терпения не хватает, если с getimage всё так сложно я пожалуй отложу его до лучших времен

Код
--lua
    fog = getimage (200, 100, 1000, 500)
    local A = findcolor(0, 0, 800, 300, 2366701, '%arr', fog, -1, 0)
    if A then
        x1 = arr[1][1] - 10
        y1 = arr[1][2] - 10
        x2 = arr[1][1] + 10
        y2 = arr[1][2] + 10
        log (x1, y1, x2, y2)
    end
deleteimage (fog)


Код
--lua
    fog = getimage (200, 100, 1000, 500)
    local B = findcolor(60, 5, 80, 25, 2366701, '%arr2', fog, -1, 0)
    if B and B > 2 then
        move (arr2[1][1] + 200, arr2[1][2] + 100)
    end
deleteimage (fog)

второй скрипт начинает находить по мере уменьшения начального Х = 60, но со смещением на величину этого Х вправо и правильно указывает мышью при начальном Х = 0, че с этим делать я сообразить не могу, может тогда в getimage вообще нету смысла в этом случае? А и еще в результате всех сохранений через saveimage у меня ни с того ни с сего одна картинка получилась без каких либо черных квадратов и смещений в верхний левый угол и размером точно как указывал, почему не знаю и повторить не смог.

Автор: Madeus 20.2.2023, 19:01

Попробуйте брать getimage с привязанного окна, обычно это помогает взять картинку без бага с черной областью или же брать абсолютные координаты.

Код
--lua
local handle = findwindow('Paint')
if not handle then
  log('Окно не найдено')
end

fog = getimage(200, 100, 1000, 500, handle[1]][1])
-- fog = getimage(200, 100, 1000, 500, 'abs')
local B = findcolor(60, 5, 80, 25, 2366701, '%arr2', fog, -1, 0)
if B and B > 2 then
  move (arr2[1][1] + 200, arr2[1][2] + 100)
end
deleteimage (fog)

Автор: nykep 16.5.2023, 16:25

переделал свой вариант, теперь не застревает на первом найденном пикселе, а ищет первое скопление которое удовлетворяет условию внутри for

Код
--lua
local A = findcolor(827, 417, 1029, 555, 2767576, '%arr', 2, -1, 0)
if A then
    for i = 1, A do
        local B = findcolor(arr[i][1] - 20, arr[i][2] - 20, arr[i][1] + 20, arr[i][2] + 20, 2767576, '%arr2', 2, -1, 0)
        if B and B > 300 then
            move (arr[i][1], arr[i][2])
            break
        end
    end
end

Автор: DarkMaster 28.1.2024, 18:40

Код
    find = {540, 160, 857, 428,
        radius = 10,
        min_pixel_count = 50, max_pixel_count = 1000,
        color = {'0x9EFCFF-0xA2FDFF'}}
    local a, group = find_heap_pixel(find)


a runtime error.
.\lua_plugins\find_heap_pixel.lua:45: attempt to compare number with nil

Шо не так?

Нашел. Рекомендую min_color в примерах вынести выше необязательных параметров. Смотрю хвост пошел необязательный - скипнул автоматом.

Автор: DarkMaster 5.2.2024, 15:43

Чет так и не завелось - нули возвращало.

Код

-- result_arr_sorted = pool_size(arr, distance)
-- arr - массив координат, где arr[i][1] и arr[i][2] x и y координаты.
-- т.е. принимает в формате результата работы findimage/findcolor
-- distance - дистанция которая считается единым объектом.
--
-- Вернет массив в котором у каждого элемента будут дополнительные поля:
-- pool_size содержащие количество объектов в группе для каждой точки,
-- массив будет отсортирован в порядке убывания result[1] - будет соответственно
-- содержать самый крупный объект.
-- pool_x - x координата середины группы объектов
-- pool_y - y координата середины группы объектов

-- Внимание! Исходный массив так же будет модифицирован!
-- В него будут добавлены поля, но порядок изменен не будет.
-- Массив с результатом просто набор ссылок на исходные вложенные таблицы.
local function pool_size(arr, distance)
    -- copy array
    local result = {}
    for i = 1, #arr do
        result[i] = arr[i]
    end

    -- add pool_size for each point
    for i = 1, #result do
        result[i].pool_size = 0
        result[i].pool_x = 0
        result[i].pool_y = 0
        for j = 1, #result do
            if ((result[i][1]-result[j][1])^2 + (result[i][2]-result[j][2])^2)^0.5 <= distance then
                result[i].pool_size = result[i].pool_size + 1
                result[i].pool_x = result[i].pool_x + result[j][1]
                result[i].pool_y = result[i].pool_y + result[j][2]
            end
        end
        result[i].pool_x = math.floor(result[i].pool_x / result[i].pool_size + 0.5)
        result[i].pool_y = math.floor(result[i].pool_y / result[i].pool_size + 0.5)
    end

    table.sort(result, function(a, b) return a.pool_size > b.pool_size end)
    return result
end

local arr = {{1, 1}, {1, 2}, {2, 2}, {3, 3}}

local arr_p = pool_size(arr, 1)

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)