Author Topic: Как лучше сделать ? (найти точку, окруженную точками с определенными цветами)  (Read 2831 times)

0 Members and 1 Guest are viewing this topic.

HD1521

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Дорого времени дня.

Подскажите пожалуйста, как реализовть следующее.

Есть массив, содержаций коды цветов, они разные.
Есть определенная область экрана, достаточно большая, скажем, 100*100.
Нужно в этой области выбрать случайную точку, которая:
- имеет любой цвет, из содержащихся в массиве
- "обернута" как минимум 2 слоями точек, цвет которых опять же находится в вышеупомянутом массиве(т.е. квадрат 3*3, в середине искомая точка. Лучше, конечно, 5*5)

Пока у меня рождаются совершенно монструозные конструкции, и, возможно, я изобретаю велосипед ?

С наступающими, и заранее спасибо.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Это не велосипед, готовых решений нет, нужно писать.

Насколько большой массив с кодами цветов?
На ум сразу пришли 3 способа поиска, но скорость проверки может быть плохая, всё зависит от количества допустимых цветов. И можно ли сократить их количество применив COLORMODE?

Можно реализовать все 3 способа и сравнить скорость выполнения. Можно хоть один тестовый образец для опытов?
Область на краях как учитывается? Фактически нужно проверять 98х98 (при 3х3) или 96х96 (при 5х5) или проверять все не учитывая выходящие области?

1. Тривиальный, Поиск всех цветов через SCANPXL. Пробегаемся по нему в каждой точке проверяя точки +1, +2 по xy каждый цвет проверяя в массиве. При первом же несовпадении бросаем всё и переходим к следующей точке.
2. В начале то же самое SCANPXL, но потом пробегаемся по массиву разрешённых цветов и считаем их в области 3х3, если получили 9 - точка найдена. Думаю этот способ должен работать быстрее, т.к. поиск по массиву из п.1 в кликере не быстрый.
3. Если именно проверки в массиве будут самым медленным куском из-за большого количества цветов, можно вместо поиска по массиву склеить всё в строку через разделитель и искать методами строк. Это даст больший выигрыш.
« Last Edit: December 29, 2022, 01:31:35 PM by Vint »


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Можно еще так:
Если без заморочек - берем по порядку все цвета из массива и pixelreplace-ам меняем их в нашей области на какой-нибудь уникальный цвет, которого точно нет изначально. Ищем квадрад этого уникального цвета picturein-ом. Готово.
С заморочками - в начале ищем цвет, которого точно нет в нашей искомой области. Просто циклом for , по очереди, пока не найдет ifpixelin. Когда нашли, нужно сохранить искомый квадрат этого цвета - закрашиваеем любую облать этим цветом и сохраняем. Обновляем графический буфер. И дальше уже перекрашиваем все цвета из массива этим нашим цветом, тот что нашли в начале. Ищем сохраненный квадрат. Готово.
Вроде это все шустро должно работать.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Можно еще так:
Если без заморочек - берем по порядку все цвета из массива и pixelreplace-ам меняем их в нашей области на какой-нибудь уникальный цвет, которого точно нет изначально. Ищем квадрад этого уникального цвета picturein-ом. Готово.
С заморочками - в начале ищем цвет, которого точно нет в нашей искомой области. Просто циклом for , по очереди, пока не найдет ifpixelin. Когда нашли, нужно сохранить искомый квадрат этого цвета - закрашиваеем любую облать этим цветом и сохраняем. Обновляем графический буфер. И дальше уже перекрашиваем все цвета из массива этим нашим цветом, тот что нашли в начале. Ищем сохраненный квадрат. Готово.
Вроде это все шустро должно работать.

Отличное решение! А я всё время забываю про pixelreplace. Всё городульки горожу  ;D
Второй вариант, не понял. Зачем искать цвет, которого точно нет? Как его можно найти?

HD1521 забудь про то, что я написал выше.


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Ну так а если у нас  картинка постоянно меняется и там на ней может появиться любой цвет, даже тот что мы изначально решили что его быть не должно, в игре к примеру с суперпупер графикой. Вот тогда можно изначально по порядку найти тот цвет которого нет. Тупо начинаем от 0 и далее 1, 2, 3.... пока не найдет во всей области какой-нибудь цвет (найдет отсутствие цвета).

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
А вообще - да. Это лишнее. Врядли это применяется для сложной графики.

kiril

  • Активный участник
  • ***
  • Posts: 106
    • View Profile
Можно еще так:
Если без заморочек - берем по порядку все цвета из массива и pixelreplace-ам меняем их в нашей области на какой-нибудь уникальный цвет, которого точно нет изначально. Ищем квадрад этого уникального цвета picturein-ом. Готово.
Тут возникают разночтения из-за неточностей формулировки автора темы;
- "обернута" как минимум 2 слоями точек, цвет которых опять же находится в вышеупомянутом массиве
 если в обёртке допустимы все цвета найденные в массиве одновременно, то перекрашивание приемлимо,
а если  только один из цветов, то способ не подходит.
 Мой вариант;
1. максимально допустимый в данном случае COLORMODE для уменьшения числа возможных цветов перед их сканированием в массив
2.  генерирование и сохранение в папку скрипта картинок  с помощью PXLREPLACE и SCREENSHOTFIX
3. поиск полученных картинок в указанной области с помощью IF_PICTURE_IN
 предположу, что цвета каждого объекта поиска постоянны и основные затраты времени придутся на обычный поиск маленьких, заранее и автоматически сохранённых скриптом картинок. ;)

HD1521

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
С заморочками - в начале ищем цвет, которого точно нет в нашей искомой области. Просто циклом for , по очереди, пока не найдет ifpixelin. Когда нашли, нужно сохранить искомый квадрат этого цвета - закрашиваеем любую облать этим цветом и сохраняем. Обновляем графический буфер. И дальше уже перекрашиваем все цвета из массива этим нашим цветом, тот что нашли в начале. Ищем сохраненный квадрат. Готово.
Вроде это все шустро должно работать.

Вот это непонятно. Зачем закрашивать-сохранять-обновлять ?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Вот это непонятно. Зачем закрашивать-сохранять-обновлять ?
Это если в области возможны любые цвета. Мы просто на первом шаге перебираем все цвета и ждём пока нам не попадётся такой, которого нет.
На втором шаге делаем заготовку картинки этого цвета и на третьем ищем её.
Но скорее всего это не нужно и достаточно выбрать один кислотный цвет для этих целей.


HD1521

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Вот это непонятно. Зачем закрашивать-сохранять-обновлять ?
Это если в области возможны любые цвета. Мы просто на первом шаге перебираем все цвета и ждём пока нам не попадётся такой, которого нет.
На втором шаге делаем заготовку картинки этого цвета и на третьем ищем её.
Но скорее всего это не нужно и достаточно выбрать один кислотный цвет для этих целей.

Большое спасибо!
Пошел отлаживать.

С Новым Годом и всего самого лучшего.