Модуль определения дистанции к http://autoit-script.ru/index.php?topic=2727.0 мастера ботописания Бельфигора.
Метод определения:
1. Модуль ищет отличный от чёрного цвета пиксель по нижней строке пикселей в овервью после слова "Дистанция:". Найденные координаты пикселя считает нулевыми к координатам символа. Если пиксель не был найден - возвращает ошибку.
2. Далее он сравнивает 4 пикселя из массива символов с символом в овервью, при совпадении изменяет переменную дистанции, и так проверяет все символы до конца строки.
3. Дистанцию возвращает в метрах.
Уточнения:
Массив состоит из 15-ти блоков по 1-му на символ.
В каждом блоке хранятся координаты и цвет 4 пикселей символа.
Наглядный пример координат и цвета пикселей во вложении.
Массив составлялся для стандартного шрифта русского клиента EVE Online.
Скорость определения составляет примерно 0.1 секунды.
P.S. Так же во вложении скрипт выводящий расстояние до выбранной цели в левый верхний угол и пример расположения окна овервью.
Метод определения:
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. Так же во вложении скрипт выводящий расстояние до выбранной цели в левый верхний угол и пример расположения окна овервью.