Author Topic: Подскажите пожалуйста как реализовать задачку с координатами  (Read 3651 times)

0 Members and 3 Guests are viewing this topic.

d2_bot

  • Освоившийся
  • **
  • Posts: 85
    • View Profile
Всем привет, помогите пожалуйста найти решение.
Есть 2 поля для работы на примере изображения


Для начала нужно найти любую из точек на правом поле, сделать по ней клик, определить ее координаты и в зависимости от того какая координата выпадет, переместить курсор на левую заданную за ранее координату по отношению к координате на правом поле, и сделать клик уже на левом поле.

Затем нужно снова проверить правое поле на наличие других точек(либо делать это сразу считая точки, не представляю даже как лучше), если они есть, то определить коры и так же переместить мышь на левое поле, относительно заданных координат правого и так далее, пока не останется точек.

Возможно такое?) 
« Last Edit: November 28, 2020, 01:16:28 PM by d2_bot »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Я так понял, что красная область - это уменьшенная копия зеленой области. Если так, то тут проще некуда. IF_PIXEL_IN или IF_PICTURE_IN ищет с лева на право сверху вниз и никак иначе.

Ищем в правом поле точку к примеру с помощью IF_PIXEL_IN. Координаты соответственно прописываем именно красной области. Он находит самую верхнюю точку. Клик по ней. Потом IF_PIXEL_IN с координатами зеленой области. Он так же находит именно самую верхнюю точку. Клик. Продолжаем, пока точки не закончатся.

d2_bot

  • Освоившийся
  • **
  • Posts: 85
    • View Profile
Все понято правильно, но найти на большом поле точку нераально каждая картинка уникальна, а вот положение получается одно и тоже, на маленьком поле найти картинку по пикселю не проблема. Точки это условности в данном случае

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Ну так ищи не по пикселю в большом поле, а по картинке. Используй colormode.

d2_bot

  • Освоившийся
  • **
  • Posts: 85
    • View Profile
Перепробовал все колормоды от 0 до 7, в редких случаях находит, в общем у меня вариант только такой заморочки, чтобы если в правом поле пиксель найден в координате 0,0, то в большом поле он кликнул по 15,15 допустим(соответственно каждой координате из правого поля мне нужно будет забивать вручную координату для левого

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Ладно, тогда уж проще использовать коэффициент смещения. Тоесть нужно точно рассчитать, во сколько раз левое поле больше правого, и соответственно смещать курсор.

Пример - правое поле в координатах (500, 100, 600, 200) - 100х100, левое (100, 100, 400, 400) - 300х300. 300/100=3 - это тот самый коэффициент.
 К примеру в правом поле нашло точку в координатах (520, 140), значит в левом получится (520-500)*3+100 = 160 - это координат а Х, (140-100)*3+100=220 - это координата У, в левом поле.

На переменных будет выглядеть так, надеюсь нигде не ошибся:

Code: (clickermann) [Select]
//($x1, $y1, $x2, $y2) - область левого поля
//($x3, $y3, $x4, $y4) - область правого поля 


$kx = ($x2-$x1)/($x4-$x3)
$ky = ($y2-$y1)/($y4-$y3)

$x = int(($_return1-$x3)*$kx+$x1) // координата х в левом поле, где $_return1 - это найденная координата х в правом поле
$y = int(($_return2-$y3)*$ky+$y1) // координата y в левом поле, где $_return2 - это найденная координата y в правом поле


d2_bot

  • Освоившийся
  • **
  • Posts: 85
    • View Profile
Огромное спасибо) то что нужно, и в будущем возможно пригодиться, буду пробовать)

d2_bot

  • Освоившийся
  • **
  • Posts: 85
    • View Profile
Ладно, тогда уж проще использовать коэффициент смещения. Тоесть нужно точно рассчитать, во сколько раз левое поле больше правого, и соответственно смещать курсор.

Пример - правое поле в координатах (500, 100, 600, 200) - 100х100, левое (100, 100, 400, 400) - 300х300. 300/100=3 - это тот самый коэффициент.
 К примеру в правом поле нашло точку в координатах (520, 140), значит в левом получится (520-500)*3+100 = 160 - это координат а Х, (140-100)*3+100=220 - это координата У, в левом поле.

На переменных будет выглядеть так, надеюсь нигде не ошибся:

Code: (clickermann) [Select]
//($x1, $y1, $x2, $y2) - область левого поля
//($x3, $y3, $x4, $y4) - область правого поля 


$kx = ($x2-$x1)/($x4-$x3)
$ky = ($y2-$y1)/($y4-$y3)

$x = int(($_return1-$x3)*$kx+$x1) // координата х в левом поле, где $_return1 - это найденная координата х в правом поле
$y = int(($_return2-$y3)*$ky+$y1) // координата y в левом поле, где $_return2 - это найденная координата y в правом поле



И все таки не просто... подскажи пожалуйста куда вписывать координаты правого и левого поля

Code: [Select]
$kx = ($x2-$x1)/($x4-$x3)
$ky = ($y2-$y1)/($y4-$y3)

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Code: (clickermann) [Select]
$x1 =   //левое поле
$y1 =
$x2 =
$y2 =

$x3 =   //правое поле
$y3 =
$x4 =
$y4 =

$kx = ($x2-$x1)/($x4-$x3)
$ky = ($y2-$y1)/($y4-$y3)

$x = int(($_return1-$x3)*$kx+$x1) // координата х в левом поле, где $_return1 - это найденная координата х в правом поле
$y = int(($_return2-$y3)*$ky+$y1) // координата y в левом поле, где $_return2 - это найденная координата y в правом поле

d2_bot

  • Освоившийся
  • **
  • Posts: 85
    • View Profile
Спасибо большое, только походу все равно делаю что-то не так

Code: [Select]
wait(3)

$x1 = 4 //левое поле
$y1 = 89
$x2 = 891
$y2 = 468
 
$x3 = 889  //правое поле
$y3 = 113
$x4 = 1012
$y4 = 161
 
$kx = ($x2-$x1)/($x4-$x3)
$ky = ($y2-$y1)/($y4-$y3)
 
$x = int(($_return1-$x3)*$kx+$x1) // координата х в левом поле, где $_return1 - это найденная координата х в правом поле
$y = int(($_return2-$y3)*$ky+$y1) // координата y в левом поле, где $_return2 - это найденная координата y в правом поле

IF_PIXEL_IN (889,113, 1012,161, 2928328)
LCLICK($_return1, $_return2) 
end_if
halt



И еще вопрос -  как с такими функциями, сделать например, чтобы делался клик сначала по правому полю где найден пиксель, затем уже по относительным координатам делался клик на левом поле?

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Code: (clickermann) [Select]
wait(3)

$x1 = 4 //левое поле
$y1 = 89
$x2 = 891
$y2 = 468

$x3 = 889  //правое поле
$y3 = 113
$x4 = 1012
$y4 = 161


GETSCREEN // не забывай про гетскрин. ты не прописал, а я долго голову себе ломал... не работало

IF_PIXEL_IN ($x3,$y3, $x4,$y4, 2928328)
   LCLICK($_return1, $_return2)  // клик по правому  полю
   
   //рассчет коорднат точки в левом поле
   
   $kx = ($x2-$x1)/($x4-$x3)
   $ky = ($y2-$y1)/($y4-$y3)
   $x = int(($_return1-$x3)*$kx+$x1) // координата х в левом поле, где $_return1 - это найденная координата х в правом поле
   $y = int(($_return2-$y3)*$ky+$y1) // координата y в левом поле, где $_return2 - это найденная координата y в правом поле
   //клик  в левое
   wait(2)
   LCLICK($x, $y)
end_if



halt
« Last Edit: December 22, 2020, 04:07:04 PM by dramster »