Автоматизация и боты

 Помощь      Поиск      Пользователи
Сайт Кибор     Программируемый кликер Кибор     Видео обучение     Заказать бот

 Страниц (1): [1]   

> Без описания
konctantin777
Отправлено: 08 Мая, 2023 - 19:45:58
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 1137
Дата рег-ции: Окт. 2017  
Откуда: Архангельск
Репутация: 6




Здравствуйте.
В игре персонаж на карте отображается треугольником. Острый угол- в каком направлении повёрнут. Можно ли как то определить куда где у треугольника острый угол относительно его центра ? Чтобы не делать много много поисков по картинке...

(Отредактировано автором: 08 Мая, 2023 - 19:46:18)

 
 Top
Zireael
Отправлено: 08 Мая, 2023 - 20:47:02
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4399
Дата рег-ции: Нояб. 2017  
Репутация: 580




Скрин треугольника скиньте. Лучше несколько скринов, в разных направлениях.
 
 Top
konctantin777
Отправлено: 08 Мая, 2023 - 21:29:15
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 1137
Дата рег-ции: Окт. 2017  
Откуда: Архангельск
Репутация: 6




(для просмотра ссылки Вам необходимо авторизоваться) (для просмотра ссылки Вам необходимо авторизоваться) (для просмотра ссылки Вам необходимо авторизоваться)
 
 Top
Zireael
Отправлено: 08 Мая, 2023 - 23:38:20
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4399
Дата рег-ции: Нояб. 2017  
Репутация: 580




С помощью findcolor ищем все белые пиксели.
Находим самые крайние точки, это будут вершины треугольника. Надо найти самую верхнюю, нижнюю, левую и правую координаты. Из 4 точек выбрать те, которые не находятся рядом, т. к. одна и та же точка может быть, к примеру, самой верхней и самой левой, если стрелка смотрит на северо-запад.
Нашли 3 точки, это вершины.
Находим самую короткую сторону. Находим центр этой стороны, это будет начальная точка.
3-я вершина это конечная точка. Считаем угол полученного вектора.

Вспоминаем геометрию, потому что её тут больше чем информатики.
 
 Top
konctantin777
Отправлено: 09 Мая, 2023 - 12:28:19
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 1137
Дата рег-ции: Окт. 2017  
Откуда: Архангельск
Репутация: 6




Вроде понял, спасибо )
 
 Top
Zireael
Отправлено: 09 Мая, 2023 - 23:54:58
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4399
Дата рег-ции: Нояб. 2017  
Репутация: 580




Функция возвращает угол от 0 до 360 градусов. Либо -1 если на найдено достаточное количество пикселей.
Если стрелка направлена влево это 0 градусов, вверх 90 градусов, вправо 180, вниз 270.

CODE:
int crd[4] = {6, 147, 26, 167}; // координаты стрелки
int Color = 16382440; // цвет стрелки
int R = 10; // отклонение цвета

double result = GetAngle(#crd[0], Color, R);
messagebox(result);


function GetAngle(int #coord, int color, int r)
{
int i, j, pos[4], min[4], MAxDist[2], Position[3], tmpDist[2], x[999], y[999];
double ResultAngle;
int k=findcolor(999, #x[0], #y[0], coord[0], coord[1], coord[2], coord[3], color, r,r,r,r,r,r, -1);
if(k>30)
{
min[0] = 9999; for(i=0; i<k; i++){if(y[i] < min[0]){ min[0] = y[i]; pos[0] = i;}}
min[1] = 0; for(i=0; i<k; i++){if(y[i] > min[1]){min[1] = y[i]; pos[1] = i;}}
min[1] = coord[3] - coord[1] - min[1];
min[2] = 9999; for(i=0; i<k; i++){if(x[i] < min[2]){ min[2] = x[i]; pos[2] = i;}}
min[3] = 0; for(i=0; i<k; i++){if(x[i] > min[3]){ min[3] = x[i]; pos[3] = i;}}
min[3] = coord[2] - coord[0] - min[3];

int MinValue = 9999, MinPos = 0;
for(i=0; i<4; i++){ if(min[i] < MinValue){ MinValue = min[i]; MinPos = i; }}
initialarray(#MAxDist[0], 0);
for(i=0; i<k; i++)
{
tmpDist[0] = point_distance(x[pos[MinPos]], y[pos[MinPos]], x[i], y[i]);
if(tmpDist[0] > MAxDist[0]){ MAxDist[0] = tmpDist[0]; Position[0] = i;}
}
MAxDist[0] = 0;
for(i=0; i<k; i++)
{
tmpDist[0] = point_distance(x[pos[MinPos]], y[pos[MinPos]], x[i], y[i]);
if(tmpDist[0] > MAxDist[0])
{
tmpDist[1] = point_distance(x[Position[0]], y[Position[0]], x[i], y[i]);
if(tmpDist[1] > 5){ MAxDist[0] = tmpDist[0]; Position[1] = i; }
}
}
MAxDist[1] = 0;
for(i=0; i<k; i++)
{
tmpDist[0] = point_distance(x[Position[0]], y[Position[0]], x[i], y[i]);
if(tmpDist[0] > MAxDist[1])
{
tmpDist[1] = point_distance(x[pos[MinPos]], y[pos[MinPos]], x[i], y[i]);
if(tmpDist[1] > 5){ MAxDist[1] = tmpDist[0]; Position[2] = i; }
}
}
if(MAxDist[1] < MAxDist[0]){ int tmpPos = pos[MinPos]; pos[MinPos] = Position[0]; Position[0] = tmpPos; Position[1] = Position[2]; }
int MidX = (x[pos[MinPos]] + x[Position[1]]) / 2;
int MidY = (y[pos[MinPos]] + y[Position[1]]) / 2;

/*
int wait = 500;
mousemove(x[pos[MinPos]] + coord[0], y[pos[MinPos]] + coord[1]); sleep(wait); // первая вершина
mousemove(x[Position[0]] + coord[0], y[Position[0]] + coord[1]); sleep(wait); // вторая вершина
mousemove(x[Position[1]] + coord[0], y[Position[1]] + coord[1]); sleep(wait); // третья вершина
mousemove(MidX + coord[0], MidY + coord[1]); sleep(wait); // центр короткой стороны
*/

double distance = point_distance(MidX, MidY, x[Position[0]], y[Position[0]]);
double _acos = acos((MidX - x[Position[0]]) / distance);
double _asin = asin((MidY - y[Position[0]]) / distance);
if(MidY >= y[Position[0]]) ResultAngle = _acos;
else
{
if(x[Position[0]] >= MidX) ResultAngle = 180 + sqrt(pow(_asin, 2));
else ResultAngle = 360 + _asin;
}
return ResultAngle;
}

return -1;
}

function point_distance(int x, int y, int x2, int y2){return sqrt(pow(x-x2, 2)+pow(y-y2, 2));}
 
 Top
konctantin777
Отправлено: 10 Мая, 2023 - 11:41:02
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 1137
Дата рег-ции: Окт. 2017  
Откуда: Архангельск
Репутация: 6




Спасибо !
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Вопросы и решение проблем »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 




Powered by