Что нового

[Автоматизация] Модуль определения дистанции.

yaguar666

Знающий
Сообщения
11
Репутация
5
Модуль определения дистанции к http://autoit-script.ru/index.php?topic=2727.0 мастера ботописания Бельфигора.

Метод определения:
1. Модуль ищет отличный от чёрного цвета пиксель по нижней строке пикселей в овервью после слова "Дистанция:". Найденные координаты пикселя считает нулевыми к координатам символа. Если пиксель не был найден - возвращает ошибку.
2. Далее он сравнивает 4 пикселя из массива символов с символом в овервью, при совпадении изменяет переменную дистанции, и так проверяет все символы до конца строки.
3. Дистанцию возвращает в метрах.

Уточнения:
Массив состоит из 15-ти блоков по 1-му на символ.
В каждом блоке хранятся координаты и цвет 4 пикселей символа.
Наглядный пример координат и цвета пикселей во вложении.
Массив составлялся для стандартного шрифта русского клиента EVE Online.
Скорость определения составляет примерно 0.1 секунды.


Код:
Case $AdvCheck = "CheckDistance" ; ("CheckDistance")
				Local $DistConf = 1, $CurSimv = 1, $FindCord[2] = [$iSI[0]+105, $iSI[1]+46], $CurDist = 0 , $ZP = 0, $CP
				While $DistConf ; Определяем дистанцию, пока не полуим подтверждения, что определили.
					$CP = PixelSearch($FindCord[0], $FindCord[1], $iSI[0]+200, $FindCord[1], 0x9F9F9F, 95) ; Ищем нижний пиксель символа.
					; MsgBox(0, "Координаты найденой точки:", $CP[0] & "," & $CP[1]) ; Отладочное сообщение.
					If Not @error Then ; Если нашли нижний пиксель, то ...
						For $i = 0 To UBound($MS, 1)-1 Step 1 ; Определяем какой символ нашли методом перебора и сравнения циклом.
							; Отладочное сообщение.
							; MsgBox(0, "Координаты символа:", $CP[0]+$MS[$i][0][0] & "," & $CP[1]+$MS[$i][0][1] & " " & $CP[0]+$MS[$i][1][0] & "," & $CP[1]+$MS[$i][1][1] & " " & $CP[0]+$MS[$i][2][0] & "," & $CP[1]+$MS[$i][2][1] & " " & $CP[0]+$MS[$i][3][0] & "," & $CP[1]+$MS[$i][3][1])
							PixelSearch($CP[0]+$MS[$i][0][0],$CP[1]+$MS[$i][0][1],$CP[0]+$MS[$i][0][0],$CP[1]+$MS[$i][0][1],$MS[$i][0][2],5) ; Сравниваем 1-ый пиксель.
							If Not @error Then ; Если пиксель такой же как и в массиве, то ...
							PixelSearch($CP[0]+$MS[$i][1][0],$CP[1]+$MS[$i][1][1],$CP[0]+$MS[$i][1][0],$CP[1]+$MS[$i][1][1],$MS[$i][1][2],5) ; Сравниваем 2-ой пиксель.
							If Not @error Then ; Если пиксель такой же как и в массиве, то ...
							PixelSearch($CP[0]+$MS[$i][2][0],$CP[1]+$MS[$i][2][1],$CP[0]+$MS[$i][2][0],$CP[1]+$MS[$i][2][1],$MS[$i][2][2],5) ; Сравниваем 3-ий пиксель.
							If Not @error Then ; Если пиксель такой же как и в массиве, то ...
							PixelSearch($CP[0]+$MS[$i][3][0],$CP[1]+$MS[$i][3][1],$CP[0]+$MS[$i][3][0],$CP[1]+$MS[$i][3][1],$MS[$i][3][2],5) ; Сравниваем 4-ый пиксель.
							If Not @error Then ; Если пиксель такой же как и в массиве, то ...
								; MsgBox(0, "Current Simvole:", $i) Отладочное сообщение.
								If $i < 10 Then ; Если найденный символ - цифра, то ...
									$CurDist = $CurDist*10 + $i ; Добавляем символ в дистанцию.
									If $i = 1 Or $i = 4 Then ; Если найденный символ - цифра 1 или 4, то ...
										$FindCord[0] = $CP[0]+2 ; Сдвигаем начало поиска по оси х-ов на 2 пикселя.
									ElseIf $i = 0 Or $i = 3 Or $i = 6 Or $i = 8 Or $i = 9 Then ; Если найденный символ - цифра 0, 3, 6, 8 или 9, то ...
										$FindCord[0] = $CP[0]+4 ; Сдвигаем начало поиска по оси х-ов на 4 пикселя.
									ElseIf $i = 2 Or $i = 5 Or $i = 7 Then ; Если найденный символ - цифра 2, 5 или 7, то ...
										$FindCord[0] = $CP[0]+5 ; Сдвигаем начало поиска по оси х-ов на 5 пикселей.
									EndIf ; Конец условия.
								Exitloop ; Досрочно выходим из цикла.
								ElseIf $i = 10 Then ; Если найденный символ - запятая, то ...
									$FindCord[0] = $CP[0]+3 ; Сдвигаем начало поиска по оси х-ов на 3 пикселя.
									$ZP = 1 ; Изменяем переменную дробления на 1.
								ElseIf $i = 11 Then ; Если найденный символ - буква "к", то ...
									$CurDist = $CurDist*10^3 ; Переводим км в м.
									$DistConf = 0 ; Подтверждаем определение дистанции.
									Exitloop ; Досрочно выходим из цикла.
								ElseIf $i = 12 Then ; Если найденный символ - буква "м", то ...
									$DistConf = 0 ; Подтверждаем определение дистанции.
									Exitloop ; Досрочно выходим из цикла.
								ElseIf $i = 13 Then ; Если найденный символ - точка, то ...
									$FindCord[0] = $CP[0]+2 ; Сдвигаем начало поиска по оси х-ов на 2 пикселя.
									$ZP = 2  ; Изменяем переменную дробления на 2.
								ElseIf $i = 14 Then ; Если найденный символ - буква "a", то ...
									If $ZP = 2 Then ; Если в графе была точка, то ...
										$CurDist = $CurDist*10^5 ; Переводим астрономические еденицы в метры.
									Else ; Если в графе не было запятой, то ...
										$CurDist = $CurDist*10^6 ; Переводим астрономические еденицы в метры.
									EndIf ; Конец условия.
									$DistConf = 0 ; Подтверждаем определение дистанции.
									Exitloop ; Досрочно выходим из цикла.
								EndIf ; Конец условия.
							$CurSimv = $CurSimv + 1 ; Увеличиваем перменную проверяемого символа на 1.
							Else ; Если пиксель не такой же как и в массиве, то ...
								; MsgBox(0, "Ошибка в 4-ом символе! Сравнение происходило с символом:", $i) ; Отладочное сообщение.
							EndIf ; Конец условия.
							Else ; Если пиксель не такой же как и в массиве, то ...
								; MsgBox(0, "Ошибка в 3-ем символе! Сравнение происходило с символом:", $i) ; Отладочное сообщение.
							EndIf ; Конец условия.
							Else ; Если пиксель не такой же как и в массиве, то ...
								; MsgBox(0, "Ошибка в 2-ом символе! Сравнение происходило с символом:", $i) ; Отладочное сообщение.
							EndIf ; Конец условия.
							Else ; Если пиксель не такой же как и в массиве, то ...
								; MsgBox(0, "Ошибка в 1-ом символе! Сравнение происходило с символом:", $i) ; Отладочное сообщение.
							EndIf ; Конец условия.
						Next ; Конец цикла For.
						;MsgBox(0, "Дистанция в данный момент:", $CurDist & " м") ; Отладочное сообщение .
						; MsgBox(0, "Координаты начала поиска:", $FindCord[0] & "," & $FindCord[1]) ; Отладочное сообщение.
						; MsgBox(0, "Distanse Confirmed:", $DistConf) ; Отладочное сообщение.
						; MsgBox(0, "Рассматриваемый символ:", $CurSimv) ; Отладочное сообщение.
					Else  ; Если не найден ни один символ, то ...
						$DistConf = 0 ; Подтверждаем определение дистанции.
						Return @error ; Возвращаем ошибку определения дистанции.
					; Exitloop ; Досрочно выходим из цикла.
					EndIf ; Конец условия.
				WEnd ; Конец цикла While.
				; ToolTip($CurDist & " м",0,0) ; Отладочное сообщение.
				; MsgBox(0, "Дистанция до выбранной цели:", $CurDist & " м") ; Отладочное сообщение.
				Return $CurDist ; Возвращаем дистанцию.


P.S. Так же во вложении скрипт выводящий расстояние до выбранной цели в левый верхний угол и пример расположения окна овервью.
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Знаешь, имхо, стоит также на кусочке скрина показать где у тебя находится точка
Код:
$iSI[0] $iSI[1]
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,602
Репутация
941
О, кто-то таки выложил свое мини ocr. Помню столкнулся с необходимостью четко определить дистанцию тогда, когда писал сальваж первого бота.
 
Автор
Y

yaguar666

Знающий
Сообщения
11
Репутация
5
SirMaksFromEho сказал(а):
Знаешь, имхо, стоит также на кусочке скрина показать где у тебя находится точка
Код:
$iSI[0] $iSI[0]

Согласен, что-то я этот момент пропустил.
Координаты:
Код:
$iSI[2] = [619, 0]

Пример добавил во вложения в 1-ый пост.
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Хмм... Хоть я и не буду пользоваться (своё есть), но картинка с точкой - неясна.
Лучше всего, имхо, найти такой фон (не всегда лучше чёрный, иногда лучше на светлом пояснить), чтобы чётко было видно. И вдобавок включить лупу в au3info.

К примеру, я координаты СИ окна определяю так.
Координата Х - это первая чёрная точка, где заканчивается светлая полоска под надписью "выбранный объект" (в твоей картинке), если идти по полосе влево.
Координата Y - именно Y этой полосы у меня.
Мне так проще найти его с лупой, если надо в скрипте поправить сей момент вручную.
А вообще, это у меня ищется самим скриптом, да...
 

DJ_Tommy

Продвинутый
Сообщения
236
Репутация
57
По поводу цвета - проще по яркости точки определять есть там светлый цвет или нет. Где то в этой теме был код, который выдавал не цвет точки я ее яркость от 0 до 255. Так вот проверять точку стоит не на цвет а на яркость, что бы использовать потом на любой машине.

А вот и функция которую я все же разыскал TrimColor http://autoit-script.ru/index.php?topic=261.msg3330#msg3330
 
Автор
Y

yaguar666

Знающий
Сообщения
11
Репутация
5
SirMaksFromEho сказал(а):
Хмм... Хоть я и не буду пользоваться (своё есть), но картинка с точкой - неясна.
Лучше всего, имхо, найти такой фон (не всегда лучше чёрный, иногда лучше на светлом пояснить), чтобы чётко было видно. И вдобавок включить лупу в au3info.

К примеру, я координаты СИ окна определяю так.
Координата Х - это первая чёрная точка, где заканчивается светлая полоска под надписью "выбранный объект" (в твоей картинке), если идти по полосе влево.
Координата Y - именно Y этой полосы у меня.
Мне так проще найти его с лупой, если надо в скрипте поправить сей момент вручную.
А вообще, это у меня ищется самим скриптом, да...

Картинку сделал нагляднее.
На счёт лупы не понял, ни разу не пользовался, если есть возможность - пожалуйста уточните.

Координата Х - такая же как и у Вас, координата Y - 0, мне так проще было считать и проверять координаты объектов в овервью.

Продвинутый карибас сказал(а):
По поводу цвета - проще по яркости точки определять есть там светлый цвет или нет. Где то в этой теме был код, который выдавал не цвет точки я ее яркость от 0 до 255. Так вот проверять точку стоит не на цвет а на яркость, что бы использовать потом на любой машине.

А вот и функция которую я все же разыскал TrimColor http://autoit-script.ru/index.php?topic=261.msg3330#msg3330

Абсолютно с Вами согласен, будет время - обязательно переделаю.
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
У ау3инфо есть опция лупа. Поищи там в опциях Magnify.
 

mornere

Знающий
Сообщения
22
Репутация
8
Это он на каждый символ сравнивает с образцом 10 раз? Если я прально понял? Я сделал проще, у меня максимум около 5 сравнений на цифру (+2 чтобы убедиться, что цифра есть), при этом стабильно работает определение точной дистанции, точку вообще не ищу, мне 4х значные значения километров не интересны, считаю, что если в метрах и 4 цифры - первая после точки (и точка там только разделитель +2 пикселя вроде). Проверяет любую строчку в оверью. хотя можно сделать и в окошке селектед инфо, но в овервью мне проще.
 
Автор
Y

yaguar666

Знающий
Сообщения
11
Репутация
5
mornere сказал(а):
Это он на каждый символ сравнивает с образцом 10 раз? Если я прально понял? Я сделал проще, у меня максимум около 5 сравнений на цифру (+2 чтобы убедиться, что цифра есть), при этом стабильно работает определение точной дистанции, точку вообще не ищу, мне 4х значные значения километров не интересны, считаю, что если в метрах и 4 цифры - первая после точки (и точка там только разделитель +2 пикселя вроде). Проверяет любую строчку в оверью. хотя можно сделать и в окошке селектед инфо, но в овервью мне проще.

Нет, Вы поняли не верно, модуль сравнивает символ с образцом до тех пор, пока не поймёт, что это за символ, а если не поймёт - то выдаст ошибку.
Сравнивать с элементом массива он может от 1 до 15 раз - от 0 до буквы "а".
Ну значения >150 км мне тоже не нужны, просто это задаток на будущее)
 

mornere

Знающий
Сообщения
22
Репутация
8
Ну если честно, я пишу на С++, но тестирую функционал на аутоит, поскольку он простенький, и куча функций встроена, но я определяю в строчке овервью m & u по 1 пикселю, k по еще 1 пикселю, потом сдвиг влево, далее разбор цифры, зная что все цифры занимают n пикселей.

Из минусов
- хоть я и выбирая пиксели поярче, приходится настроить цвет и допуск,
- функция работает с конкретным шрифтом и размером, при смене его в очередном патче - придется что-то менять,


Плюсы
- не сильно грузит цпу
- позволяет не искать расстояние меньше 10 км (распознав м - можно дальше не мучить проц, 2 проверки всего)
- элементрано разбирает всё овервью на дистанции, можно регулярно обновлять информацию по всем позициям (вытекает из слабого загруза цпу)
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Пиксели поярче, цвет, допуск...
Используй CheckPixel последней версии и не мучайся.
 

mornere

Знающий
Сообщения
22
Репутация
8
SirMaksFromEho сказал(а):
Пиксели поярче, цвет, допуск...
Используй CheckPixel последней версии и не мучайся.

Ну во первых, я не мучаюсь, вычислил оба значения с 2х попыток + калькулятор.
Во-вторых, смысл переводить в яркость и потом шаманить с яркостями мне не очень ясен. По крайней мере в данном случае. В С я вообще могу это сделать с 1 лейером, что означает - гетпиксел, побитовый сдвиг, сравнение - выход из функции. Какой именно лейер тоже задается в 1 цифру.
Опять же обращаю внимание, что как проще есть способы, но я стремлюсь к скорости выполнения, ну например чтобы одновременно проверять много "датчиков".
 

Victor

Новичок
Сообщения
7
Репутация
0
Re: [Автоматизация] Модуль определения дистанции

yaguar666 сказал(а):
SirMaksFromEho сказал(а):
Знаешь, имхо, стоит также на кусочке скрина показать где у тебя находится точка
Код:
$iSI[0] $iSI[0]

Согласен, что-то я этот момент пропустил.
Координаты:
Код:
$iSI[2] = [619, 0]

Пример добавил во вложения в 1-ый пост.

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

Belfigor

Модератор
Локальный модератор
Сообщения
3,602
Репутация
941
Re: [Автоматизация] Модуль определения дистанции

Victor
Левый верхний угол окна Selected Item
 
Верх