1 (изменено: Military, 2018-09-22 23:16:30)

Тема: AHK: Поиск ближайшей картинки отталкиваясь от центра окна.

Возникла проблема при создании простого скрипта с поиском картинки.
Есть такой скрипт.

F1::
Loop,
{
ImageSearch, xp, yp, 0, 0, 600, 800, *50 chest.png
Sleep 200
If xp > 0
Break
}
MouseMove, xp, yp
Click (by itself)

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

2

Re: AHK: Поиск ближайшей картинки отталкиваясь от центра окна.

Если ищете в окне и поиск должен начинаться с его середины, то, вначале нужно уточнить, что с середины - поиск будет осуществляться в одной четвёртой от площади этого окна, при том, самой последней в порядке сверху-вниз и слева-направо. Для этого, нужно узнать ширину и высоту окна и поделив значения пополам, прибавить к координатам положения окна на экране и установить результат операций в качестве начальной точки, а делимые значения, так же сложенные со значениями положения, конечной:


#SingleInstance, Force
#NoEnv

CoordMode, Pixel
CoordMode, Mouse
SetTitleMatchMode, 2

F1::
	WinGetPos, win_x, win_y, win_w, win_h,Тайтл окна, в котором производится поиск
	srch_x := win_x + win_w // 2, srch_y := win_y + win_h // 2, srch_w := win_x + win_w, srch_h := win_y + win_h
	Loop {
		ImageSearch, xp, yp, srch_x, srch_y, srch_w, srch_h, *50 chest.png
		Sleep, 200
		If (xp)
			Break
	}
	MouseMove, xp, yp
return
Esc::
	ExitApp

И ещё, важно понимать, что название темы относится к поиску относительно экрана, а в тексте идёт речь об окне. Это усложняет понимание того, что, Вам, конкретно нужно. Будьте внимательней впредь.

3 (изменено: Military, 2018-09-22 19:13:26)

Re: AHK: Поиск ближайшей картинки отталкиваясь от центра окна.

KusochekDobra Спасибо за ответ, Ваш скрипт работает хорошо, но я не совсем это имел введу, искомый объект не обязательно находится справа вниз от начальной точки. Объекты могут появляться в любой области окна, но отправная точка с центра и надо дотянутся до ближайшего искомого объекта. Возможно стоит каким-то образом задавать квадрат поиска от центра и постепенно его увеличивать до размеров окна?
Прикрепил картинку для более наглядного понимания задачи.

KusochekDobra пишет:

И ещё, важно понимать, что название темы относится к поиску относительно экрана, а в тексте идёт речь об окне. Это усложняет понимание того, что, Вам, конкретно нужно. Будьте внимательней впредь.

Название темы поправил, да действительно действия происходят в окне.

Post's attachments

shortcut.png 5.37 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

4

Re: AHK: Поиск ближайшей картинки отталкиваясь от центра окна.

Изображения вставляются в сообщения при помощи соответствующего тега.

Тогда, на ум приходит только получение рейтинга удалённости точек от центра, путём сложения их разницы, после чего, переместить курсор по их координатам в порядке возрастания. Для начала, потребуется найти все точки. Воспользуемся решением от serzh82saratov:


#SingleInstance Force 
#NoEnv
ListLines Off
SetBatchLines -1
SetTitleMatchMode, 2
CoordMode, Pixel
CoordMode, Mouse

Global center_x, center_y, rateArr := {}, order := []

F1::
	WinGetPos, win_x, win_y, win_w, win_h,Тайтл окна, в котором производится поиск
	center_x:= win_x + win_w // 2, center_y:= win_y + win_h // 2, srch_w := win_x + win_w, srch_h := win_y + win_h
	dataArray := SeveralSearch(win_x, win_y, srch_w, srch_h, ["chest.png"], 50)

	Loop,% len := dataArray.Length()
		SetRateItem(dataArray[ A_Index ])

	Loop,% len
		MouseMove, rateArr[ order[ A_Index ] ][1], rateArr[ order[ A_Index ] ][2]	
return

SeveralSearch(ix1, iy1, w, h, files, variation = 0)  { 
	Coords := []
	For k, file in files
	{
		x1 := ix1, y1 := iy1, x2 := ix1 + w - 1, y2 := iy1 + h - 1
		prY := y2, ErrorCount := 0
		Loop
		{
			ImageSearch, mX, mY, x1, y1, x2, y2, *%variation% %file%
			If (ErrorLevel && ++ErrorCount > 1)
				Break
			If (mY = "" || mY > prY)
				x1 := ix1, y1 += 1, prY := y2
			Else
				x1 := mX + 1, ErrorCount := 0, y1 := mY, prY := mY, Coords.Push([mX, mY])
		}
	} 
	Return Coords
}
SetRateItem(item) {
	a := center_x < item[1] ? item[1] - center_x : center_x - item[1]
	b := center_y < item[2] ? item[2] - center_y : center_y - item[2]
	rateArr[rate := a + b] := item, doInsert := true
	
	Loop,% order.Length(){
		if (rate <= order[ A_Index ]) {
			order.InsertAt(A_Index, rate)
			doInsert := false
			break
		}
	} (doInsert && order.Push(rate))
}