Здравствуйте.
В игре персонаж на карте отображается треугольником. Острый угол- в каком направлении повёрнут. Можно ли как то определить куда где у треугольника острый угол относительно его центра ? Чтобы не делать много много поисков по картинке...
1. konctantin777 - 08 Мая, 2023 - 11:45:58 - перейти к сообщению
2. Zireael - 08 Мая, 2023 - 12:47:02 - перейти к сообщению
Скрин треугольника скиньте. Лучше несколько скринов, в разных направлениях.
3. konctantin777 - 08 Мая, 2023 - 13:29:15 - перейти к сообщению
(для просмотра ссылки Вам необходимо авторизоваться) (для просмотра ссылки Вам необходимо авторизоваться) (для просмотра ссылки Вам необходимо авторизоваться)
4. Zireael - 08 Мая, 2023 - 15:38:20 - перейти к сообщению
С помощью findcolor ищем все белые пиксели.
Находим самые крайние точки, это будут вершины треугольника. Надо найти самую верхнюю, нижнюю, левую и правую координаты. Из 4 точек выбрать те, которые не находятся рядом, т. к. одна и та же точка может быть, к примеру, самой верхней и самой левой, если стрелка смотрит на северо-запад.
Нашли 3 точки, это вершины.
Находим самую короткую сторону. Находим центр этой стороны, это будет начальная точка.
3-я вершина это конечная точка. Считаем угол полученного вектора.
Вспоминаем геометрию, потому что её тут больше чем информатики.
Находим самые крайние точки, это будут вершины треугольника. Надо найти самую верхнюю, нижнюю, левую и правую координаты. Из 4 точек выбрать те, которые не находятся рядом, т. к. одна и та же точка может быть, к примеру, самой верхней и самой левой, если стрелка смотрит на северо-запад.
Нашли 3 точки, это вершины.
Находим самую короткую сторону. Находим центр этой стороны, это будет начальная точка.
3-я вершина это конечная точка. Считаем угол полученного вектора.
Вспоминаем геометрию, потому что её тут больше чем информатики.
5. konctantin777 - 09 Мая, 2023 - 04:28:19 - перейти к сообщению
Вроде понял, спасибо )
6. Zireael - 09 Мая, 2023 - 15:54:58 - перейти к сообщению
Функция возвращает угол от 0 до 360 градусов. Либо -1 если на найдено достаточное количество пикселей.
Если стрелка направлена влево это 0 градусов, вверх 90 градусов, вправо 180, вниз 270.
Если стрелка направлена влево это 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));}
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));}
7. konctantin777 - 10 Мая, 2023 - 03:41:02 - перейти к сообщению
Спасибо !