Что нового

Как найти ближайший к указанной точке пиксел по цвету?

killbond

Осваивающий
Сообщения
96
Репутация
32
Моя собственная идея:
1. Найти сначала все точки с этим цветом
2. Сравнить расстояния и выбрать наиближнюю

на 1-ое я написал вот что:
Код:
Func _AllPixelSearch ( $left, $top, $right, $bottom, $color , $shade = 0 )
	Local $Value = 0, $CurrentPoint, $LastPoint [2] = [$left, $top]
	Local $Points [1] [2]
	For $iX = $left to $right - $left
		For  $iY = $top to $bottom - $top
			$CurrentPoint = PixelSearch ( $left + $iX, $LastPoint [1] + 1, $right + $iX + 1, $top, $color , $shade)
			If Not @error then 
				$Value += 1
				ReDim $Points [1 + $Value] [2]
				$Points [$Value] [0] = $CurrentPoint [0]
				$Points [$Value] [1] = $CurrentPoint [1]
				$LastPoint [0] = $CurrentPoint [0]
				$LastPoint [1] = $CurrentPoint [1]
				$iY = $LastPoint [1]
			EndIf
		Next
	Next
	If $Value > 0 then
		$Points [0] [0] = $Value - 1
	Else
		$Points [0] [0] = $Value
	EndIf
	Return $Points
EndFunc

Но оно не работает (точнее работает, но не так, как хотелось бы), и я даже не понимаю почему... :wacko:
Вообщем, эта функция должна вернуть 2D массив с координатами найденных точек. При написании учитывал то, что PixelSearch ищет сначала сверху вниз, затем слева направо. Я хотел, чтобы PixelSearch проверил сначала каждую вертикальную область, шириной в 1 пиксел, затем проверку начинал со следующей y-координаты от последней найденной точки.
 
Автор
K

killbond

Осваивающий
Сообщения
96
Репутация
32
Исправил, теперь работает и как надо:
Код:
Func _AllPixelSearch ( $left, $top, $right, $bottom, $color, $shade = 0, $hwnd = 0 )				
		; $left - Крайняя левая Х координата поиска
		; $top - Верхняя У координата поиска
		; $right - Крайняя правая Х координата поиска
		; $bottom - Нижняя У координата поиска
		; $color - Цвет поиска
		; $shade - Вариация гаммы цвета (от 0 до 255)
		; $hwnd - Хендл окна, в котором производится поиск
	Local $Value = 0, $CurrentPoint
		; $Value - Счетчик кол-ва точек
		; $CurrentPoint - Хранит координаты текущей найденной точки
	Local $Points [1] [2]
		; $Points - Конечный 2D массив, в котором будут храниться координаты всех найденных точек 
	For $iX = $left to $right 
		; $iX - Счет начинается от крайней левой координаты поиска до крайней правой, шаг - 1,
		; позволяет отграничить область поиска до одной вертикальной полосы, шириной в 1 пиксел
		For  $iY = $top to $bottom
			; $iY - позволяет отграничить вертикальную полосу шириной в 1 пиксел по вертикали, 
			; при этом ограничение идет со сдледующей от последней найденной У координаты точки
			$CurrentPoint = PixelSearch ( $iX, $iY, 1 + $iX, $bottom, $color , $shade, 1, $hwnd )
				; $iX, 1 + $iX - Отграничивают область поиска до одной вертикальной полосы, шириной в 1 пиксел
				; $iY, $bottom - Отграничивают область поиска по вертикали
			If Not @error then
				; Если ошибок не найдено, то зафиксировать координаты найденной точки:
					$Value += 1
						; Увеличить число точек на 1
					ReDim $Points [1 + $Value] [2]
						; Передекларировать массив, увеличчивая его 1-ую размерность на 1
					$Points [$Value] [0] = $CurrentPoint [0]
						; Занести Х координату в конечный массив
					$Points [$Value] [1] = $CurrentPoint [1]
						; Занести Y координату в конечный массив
					$iY = $CurrentPoint [1]
						; Увеличить счетчик координат по оси У до У координаты найденной точки
			EndIf
		Next
		
	Next
		$Points [0] [0] = $Value
			; Положить в корень массива число найденных точек
	Return $Points
		; Вернуть полученный массив
EndFunc

Только вот слишком долго :( Есть способ увеличить скорость?


Добавлено:
Сообщение автоматически объединено:

Идея №2:
1. Указать точку, относительно которой будет вестись поиск
2. Искать в этой области, постепенно увеличивая радиус поиска
Это, я думаю, будет быстрее, но при этом теряется точность, т.к. будет указана точка, ближняя к левой верхней точки области поиска, м.б. есть вариант более гениальный и более простой?
 

OsiWops

Новичок
Сообщения
9
Репутация
0
Столкнулся с такой же проблемой, нужно найти ближайший пиксель по цвету относительно заданной координаты...
Попробую идею №2 может поможет :smile:
Мозг кипит ужо...
 
Верх