Люблю такие задачи.
Пока вижу два варианта:
1. На миникарте отслеживать куда повёрнут нос корабля. Нос длинее. Проверяем по окружности на определённом удалении цвет на "зелёность". Высчитываем угол. То же самое по своей окружности для флага. Вычисляем его угол. Сравниваем углы и вычисляем угол на который нужно повернуть. См. скрин.
Из-за маленького размера центрального значка, точность будет +- лапоть, но может и хватит. В цикле, по мере приближения корректировать.
2. Для основного поля.
Проверяем в цикле пикселы по окружности (центр - корабль, радиус - расстояние до широкой части стрелки). Если преобладает красный канал и разница двух остальных (BG) не очень большая значит нашли. Разницу возможно придётся подобрать.
Рабочий пример:
LOGCLEAR
$d1 = 10 // минимальная разница в каналах (дельта) от красного
$d2 = 20 // максималиная разница 2 других каналов, синий-зелёный
$PI = 3.1415926535
$R = 118 // радиус
$centr_X = 526 // центр X
$centr_Y = 545 // центр Y
FOR ($i, $i<360, 10)
// коррекция ошибки 4.8
$COS = COS($i*$PI/180)
IF($COS < 0-1)
$COS = 0
END_IF
$SIN = SIN($i*$PI/180)
IF($SIN < 0-1)
$SIN = 0
END_IF
$x=INT($R*$COS+$centr_X)
$y=INT($R*$SIN+$centr_Y)
// если v4.7
//$x=INT($R*COS($i*$PI/180)+$centr_X)
//$y=INT($R*SIN($i*$PI/180)+$centr_Y)
MOVE($x,$y) // для отладки
WAITMS(200) // для отладки
$p = pxl($x,$y) // берём цвет точки
IF((COLORR($p) > COLORB($p)+$d) & (COLORR($p) > COLORG($p)+$d1))
// преобладание красной составляющей
LOGWRITE ("преобладает красный канал") // для отладки
LOGWRITE ("R ",COLORR($p)) // для отладки
LOGWRITE ("G ",COLORG($p)) // для отладки
LOGWRITE ("B ",COLORB($p)) // для отладки
// долее проверяем, что каналы B и G близки друг другу,
// для отсекания жёлто-коричнево-сиреневых оттенков
$raznica_BG = SQRT((COLORB($p) - COLORG($p))*(COLORB($p) - COLORG($p)))
LOGWRITE ("$raznica_BG ",$raznica_BG)
IF($raznica_BG < $d2)
// оттенок красный!, сохраняем координаты и обрабатываем
LOGWRITE ("оттенок красный, X= ",$x," Y= ",$y)
$Ugol = $i+90
IF(($Ugol = 360) | ($Ugol > 360))
$Ugol = $Ugol-360
END_IF
LOGWRITE ("направление ",$Ugol," градусов") // за 0 берём вверх
$i = 400 // выходим из цикла
END_IF
END_IF
END_CYC
HALT
Шаг проверки брал 10 градусов. Можно поиграться точность/скорость. Может выгодней проверять чаще по мере движения и корректировать, чем 1 раз точно в начале.
Исхожу из предположения, что центр области поиска фиксированный (на миникарте точно).
Так же можно ввести дополнительно учёт насыщенности красного, проверяя величину красного канала и отсекая стрелки бледнее заданного уровня. Возможностей много.