Code : Tout sélectionner
#include <Color.au3>
#include <Array.au3>
Func PixelSearchListCircle($x, $y, $rayon, $couleur, $variation = 0, $exception = "")
$rayon += 1
Local $topx = $x, $topy = $y, $botx = $x + $rayon, $boty = $y + $rayon
Local $inrect = True
Local $MaxRad = Sqrt(($botx - $topx)^2 + ($boty - $topy)^2)
Local $arc, $res, $count = 0, $liste = ""
$arc = 1/$MaxRad
For $ang = 0 To 3.142 * 2 - $arc Step $arc
$sx = $x + $rayon * Cos($ang)
$sy = $y + $rayon * Sin($ang)
If Not ($sx < $topx Or $sx > $botx Or $sy < $topy Or $sy > $boty) Then
$count += 1
$liste &= Int($sx) & "," & Int($sy) & "|"
EndIf
Next
$liste = StringTrimRight($liste, 1)
Local $arrayPreDB[$count]
Local $arrayGH[$count], $arrayGB[$count], $arrayDH[$count], $arrayDB[$count]
Local $arrayGauche[$count*2], $arrayDroit[$count*2]
$arrayPreDB = StringSplit($liste, "|", 2)
$arrayDB = _ArrayUnique($arrayPreDB)
_ArrayDelete($arrayDB, 0)
$arrayDH = $arrayDB
$arrayGH = $arrayDB
$arrayGB = $arrayDB
_ArrayReverse($arrayDH)
$returnString1 = $arrayDH
Local $resultat1[Ubound($returnString1)][2]
For $i = 0 To UBound($returnString1)-1
$array1 = StringRegExp($returnString1[$i], '(.*),(.*)', 1, 1)
$resultat1[$i][0] = $array1[0] - $x
$resultat1[$i][1] = $array1[1] - $y
$arrayDH[$i] = $x + $resultat1[$i][0] & "," & $y - $resultat1[$i][1]
$arrayGH[$i] = $x - $resultat1[$i][0] & "," & $y - $resultat1[$i][1]
$arrayGB[$i] = $x - $resultat1[$i][0] & "," & $y + $resultat1[$i][1]
Next
$arrayDroit = $arrayDH
$arrayGauche = $arrayGH
_ArrayReverse($arrayGB)
_ArrayConcatenate($arrayDroit, $arrayDB)
_ArrayConcatenate($arrayGauche, $arrayGB)
Local $preFinalDroit[Ubound($arrayDroit)-1][2]
For $a = 0 To UBound($preFinalDroit) - 1
$array = StringRegExp($arrayDroit[$a], '(.*),(.*)', 1, 1)
$preFinalDroit[$a][0] = $array[0]
$preFinalDroit[$a][1] = $array[1]
Next
$finalDroitH = _ArrayUnique($preFinalDroit, 2)
Local $final[Ubound($finalDroitH) - 1][3], $arrayTemp[1] = [0], $nombre1 = 0
_ArrayDelete($finalDroitH, 0)
For $b = 0 To Ubound($finalDroitH) - 1
$arrayTemp[0] = 0
$nombre1 = 0
For $c = 0 To Ubound($preFinalDroit)-1
If $preFinalDroit[$c][1] = $finalDroitH[$b] Then
_ArrayAdd($arrayTemp, $preFinalDroit[$c][0])
EndIf
Next
_ArrayDelete($arrayTemp, 0)
For $d = 0 To Ubound($arrayTemp)-1
$nombre1 += $arrayTemp[$d]
Next
$final[$b][1] = Int($nombre1/Ubound($arrayTemp))
$final[$b][2] = $finalDroitH[$b]
For $e = 1 To Ubound($arrayTemp)-1
_ArrayDelete($arrayTemp, $e)
Next
Next
Local $preFinalGauche[Ubound($arrayDroit)-1][2]
For $f = 0 To UBound($preFinalGauche) - 1
$array = StringRegExp($arrayGauche[$f], '(.*),(.*)', 1, 1)
$preFinalGauche[$f][0] = $array[0]
$preFinalGauche[$f][1] = $array[1]
Next
$finalGaucheH = _ArrayUnique($preFinalGauche, 2)
Local $arrayTemp2[1] = [0], $nombre2 = 0
_ArrayDelete($finalGaucheH, 0)
For $g = 0 To Ubound($finalGaucheH) - 1
$arrayTemp2[0] = 0
$nombre2 = 0
For $h = 0 To Ubound($preFinalGauche)-1
If $preFinalGauche[$h][1] = $finalGaucheH[$g] Then
_ArrayAdd($arrayTemp2, $preFinalGauche[$h][0])
EndIf
Next
_ArrayDelete($arrayTemp2, 0)
For $j = 0 To Ubound($arrayTemp2)-1
$nombre2 += $arrayTemp2[$j]
Next
$final[$g][0] = Int($nombre2/Ubound($arrayTemp2))
For $k = 1 To Ubound($arrayTemp2)-1
_ArrayDelete($arrayTemp2, $k)
Next
Next
Local $pixelOfSearch = PixelSearchList($x-$rayon+1, $y-$rayon+1, $x+$rayon-1, $y+$rayon-1, $couleur, $variation, $exception)
Local $returnString = ""
For $l = 1 To Ubound($pixelOfSearch)-1
$aSearch = _ArrayFindAll($final, $pixelOfSearch[$l][1], 0, 0, 0, 0, 3)
If $aSearch <> @error Then
If $pixelOfSearch[$l][0] >= $final[$aSearch[0]][0] And $pixelOfSearch[$l][0] <= $final[$aSearch[0]][1] Then
$returnString &= $pixelOfSearch[$l][0] & "," & $pixelOfSearch[$l][1] & "|"
EndIf
EndIf
Next
If $returnString = "" Then return 0
$returnString = StringSplit(StringTrimRight($returnString, 1), "|")
Local $resultatF[$returnString[0] + 1][2]
$resultatF[0][0] = $returnString[0]
For $i = 1 To UBound($returnString) - 1
$arrayF = StringRegExp($returnString[$i], '(.*),(.*)', 1, 1)
$resultatF[$i][0] = $arrayF[0]
$resultatF[$i][1] = $arrayF[1]
Next
Return $resultatF
EndFunc
Func PixelSearchList($gauche, $haut, $droit, $bas, $hSearchCouleur, $variation = 0, $exception = "", $commande = "")
Local $result = ""
Local $variationPlus
Local $arrayExeption
If $exception <> "" Then
$arrayException = StringSplit($exception, "|", 2)
EndIf
$SearchCouleur = _ColorGetRGB($hSearchCouleur)
For $h = 0 To $bas - $haut
For $l = 0 To $droit - $gauche
$variationPlus = 0
If $exception = "" Or _ArrayFindAll($arrayException, $gauche + $l & "," & $haut + $h) = -1 Then
$hCouleur = "0x" & Hex(PixelGetColor($gauche + $l, $haut + $h), 6)
$couleur = _ColorGetRGB($hCouleur)
If $hCouleur = $hSearchCouleur Then
If $commande <> "" Then
$commande = StringReplace($commande, "$X", $gauche + $l)
$commande = StringReplace($commande, "$Y", $haut + $h)
Execute($commande)
EndIf
$result &= $gauche + $l & "," & $haut + $h & "|"
Else
If $SearchCouleur[0] > $couleur[0] Then
If $SearchCouleur[0] - $couleur[0] <= $variation Then
$variationPlus += 1
EndIf
Else
If $couleur[0] - $SearchCouleur[0] <= $variation Then
$variationPlus += 1
EndIf
EndIf
If $SearchCouleur[1] > $couleur[1] Then
If $SearchCouleur[1] - $couleur[1] <= $variation Then
$variationPlus += 1
EndIf
Else
If $couleur[1] - $SearchCouleur[1] <= $variation Then
$variationPlus += 1
EndIf
EndIf
If $SearchCouleur[2] > $couleur[2] Then
If $SearchCouleur[2] - $couleur[2] <= $variation Then
$variationPlus += 1
EndIf
Else
If $couleur[2] - $SearchCouleur[2] <= $variation Then
$variationPlus += 1
EndIf
EndIf
If $variationPlus = 3 Then
If $commande <> "" Then
$commande = StringReplace($commande, "$X", $gauche + $l)
$commande = StringReplace($commande, "$Y", $haut + $h)
Execute($commande)
EndIf
$result &= $gauche + $l & "," & $haut + $h & "|"
EndIf
EndIf
EndIf
Next
Next
If $result = "" Then Return 0
$returnString = StringSplit(StringTrimRight($result, 1), "|")
Local $resultat[$returnString[0] + 1][2]
$resultat[0][0] = $returnString[0]
For $i = 1 To UBound($returnString) - 1
$array = StringRegExp($returnString[$i], '(.*),(.*)', 1, 1)
$resultat[$i][0] = $array[0]
$resultat[$i][1] = $array[1]
Next
Return $resultat
EndFunc ;==>PixelSearchList
Func CreateListByRect($gauche, $haut, $droit, $bas)
Local $result = ""
For $h = 0 To $bas - $haut
For $l = 0 To $droit - $gauche
$result &= $gauche + $l & "," & $haut + $h & "|"
Next
Next
Return StringTrimRight($result, 1)
EndFunc ;==>CreateListByRect
Func CoordMoreProchByList($X, $Y, $list)
$arrayList = StringSplit($list, "|", 2)
Local $resultat[Ubound($arrayList)][3]
For $i = 0 To UBound($arrayList) - 1
$array = StringRegExp($arrayList[$i], '(.*),(.*)', 1, 1)
$resultat[$i][0] = $array[0]
$resultat[$i][1] = $array[1]
If $resultat[$i][0] > $X Then
If $resultat[$i][1] > $Y Then
$resultat[$i][2] = ($resultat[$i][0]-$X) + ($resultat[$i][1]-$Y)
Else
$resultat[$i][2] = ($resultat[$i][0]-$X) + ($Y-$resultat[$i][1])
EndIf
Else
If $resultat[$i][1] > $Y Then
$resultat[$i][2] = ($X-$resultat[$i][0]) + ($resultat[$i][1]-$Y)
Else
$resultat[$i][2] = ($X-$resultat[$i][0]) + ($Y-$resultat[$i][1])
EndIf
EndIf
Next
Local $resultatFinal[2] = [$resultat[0][0], $resultat[0][1]]
return $resultatFinal
EndFunc
Func PixelSearchListResultToList($result)
Local $return = ""
For $i = 1 To $result[0][0]
$return &= $result[$i][0] & "," & $result[$i][1] & "|"
Next
return StringTrimRight($return, 1)
EndFunc