Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Функция возвращает угол от 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));}
|