Что нового

Как узнать центральную координату по Y, прямоугольника залитого одним цветом?

agikon

Знающий
Сообщения
789
Репутация
16
Например есть прямоугольник неважно какой величины, но залитый белым цветом 0xFFFFFF, и его граничные пиксели имеют координаты по оси Y:
Ymax = 250
Ymin = 180

То средняя точка по оси Y равна 215, то есть Y = 215.
потому что 250-180=70, а потом 70/2=35, и 180+35=215,
то есть средняя точка по оси Y = 215.

так вот как это всё в коде записать?
то есть как найти с помощью PixelSearch Ymax и Ymin, и потом высчитать центральную точку.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
agikon,
Попробуйте так:
Код:
Dim $aTemp[@DesktopHeight] = [@DesktopHeight - 1]
$iCount = 0
$fYes = False

For $i = 0 To $aTemp[0]
	$aCoord = PixelSearch(650, $i, 651, $i + 1, 0xF0F4F9);тут Ваши данные
	If Not @error Then
		$fYes = True
		$iCount += 1
		$aTemp[$iCount] = $aCoord[1]
	Else
		If $fYes Then ExitLoop
	EndIf
Next
If $iCount Then
	$iYmin = $aTemp[1]
	$iYmax = $aTemp[$iCount]
	$iYmid = Abs($iYmax - ($iYmax - $iYmin) / 2)
	ConsoleWrite($iYmid & @LF)
	MouseMove(650, $iYmid)
Else
	MsgBox(16, 'Error', 'No')
EndIf
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
16
Спасибо щас буду тестить.

Но такой вопрос, что случится если например средняя координата будет не целое число а с запятой? ну например 64,5

Ну смотрите например Ymax = 282 Ymin = 153, средняя координата 64,5.

Так вот что будет в таком случае?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
agikon [?]
Так вот что будет в таком случае?
Код:
MsgBox(0, '', Abs(Round(-6.87)))
;$iYmid = Abs(Round($iYmax - ($iYmax - $iYmin) / 2))


А какая разница? У меня так работает:
Код:
MouseMove(666.666, 666.666, 6.66)


Я добавил в свой код ConsoleWrite($iYmid & @LF) и он мне через раз дает дробное значение.
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
16
понял, спасибо.
вот протестировал и предварительно вроде работает, но завтра точно протестирую.

а скажите пожалуйста что означает запись $i + 1 ? то есть почему +1, как вот не могу понять где взялось это +1 ?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
agikon [?]
что означает запись $i + 1
Означает, что я не совсем правильно понимал принцип работы функции PixelSearch(). Так быстрее:
Код:
Dim $aTemp[@DesktopHeight + 1] = [@DesktopHeight]
$iCount = 0
$fYes = False

For $i = 0 To $aTemp[0]
	$aCoord = PixelSearch(650, $i, 650, $i, 0xF0F4F9);тут Ваши данные
	If Not @error Then
		$fYes = True
		$iCount += 1
		$aTemp[$iCount] = $aCoord[1]
	Else
		If $fYes Then ExitLoop
	EndIf
Next
If $iCount Then
	$iYmin = $aTemp[1]
	$iYmax = $aTemp[$iCount]
	$iYmid = Abs($iYmax - ($iYmax - $iYmin) / 2)
	ConsoleWrite($iYmid & @LF)
	MouseMove(650, $iYmid)
Else
	MsgBox(16, 'Error', 'No')
EndIf

А так еще быстрее, но только с точным указанием цвета (PixelSearch() гибче):
Код:
Dim $aTemp[@DesktopHeight + 1] = [@DesktopHeight]
$iCount = 0
$fYes = False
For $i = 0 To $aTemp[0]
	If PixelGetColor(650, $i) = 0xF0F4F9 Then
		$fYes = True
		$iCount += 1
		$aTemp[$iCount] = $i
	Else
		If $fYes Then ExitLoop
	EndIf
Next
If $iCount Then
	$iYmin = $aTemp[1]
	$iYmax = $aTemp[$iCount]
	$iYmid = Abs($iYmax - ($iYmax - $iYmin) / 2)
	ConsoleWrite($iYmid & @LF)
Else
	MsgBox(16, 'Error', 'No')
EndIf
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
16
madmasles
спасибо.
все примеры работают отлично.
 
Верх