[..] Recherche circulaire

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
berthozero
Niveau 2
Niveau 2
Messages : 20
Enregistré le : sam. 16 janv. 2010 22:09
Status : Hors ligne

[..] Recherche circulaire

#1

Message par berthozero »

Bonjour

Mon problème est que je souhaite créer une fonction de recherche circulaire mais mon probleme est que je ne sait pas comment m'y prendre, j'arrive seulement à recré PixelSearch en rectangle ou losange, or moi je recheche une fonction de genre :

PixelSearchCercl($couleur_a_rechercher, $centre_du_cerle, $rayon)

Voici une image pour illustrer :
Image

Merci de votre aide, c'est extremement important, et merci 1000 fois :D

PS: je souhaite que vous me donniez les calcul à faire, la méthode, des liens ou autres pour que je code la fonctions moi-même, sinon une fonction s'y rapprochant le plus possible, merci !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Recherche circulaire

#2

Message par Tlem »

Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
berthozero
Niveau 2
Niveau 2
Messages : 20
Enregistré le : sam. 16 janv. 2010 22:09
Status : Hors ligne

Re: [..] Recherche circulaire

#3

Message par berthozero »

Merci beaucoup mais je ne sais pas comment m'en servir ...
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Recherche circulaire

#4

Message par Tlem »

:shock:

$topxa, $topya, botxa, $botya correspondent aux coordonnées d'un carré dans lequel vous voulez le cercle.
$rada doit correspondre au rayon du cercle.

La fonction 'nearest' vous renvoie les coordonnées du point le plus proche par rapport au centre du cercle.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Recherche circulaire

#5

Message par ZDS »

Voici un exemple de fonction à la main, mais je ne sais pas si c'est ce que tu en attends (tu veux le point le plus proche? ou tous les points du cercle? Dans les deux cas, un minimum de bidouilles et tu trouveras ton bonheur ^^). Par contre je te préviens tout de suite, ce genre d'algorithme est loin d'être optimal, ça met enormément de temps (genre près d'une minute pour un cercle de 30 pixels de rayon). Pour faire des économies de bouts de chandelle, tu peux toujours enlever les ConsoleWrite, ils sont là que pour le débug et l'avancement (script fait à la va-vite, désolé ^^)
► Afficher le texterechercherUneCouleur()
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
berthozero
Niveau 2
Niveau 2
Messages : 20
Enregistré le : sam. 16 janv. 2010 22:09
Status : Hors ligne

Re: [..] Recherche circulaire

#6

Message par berthozero »

Merci mais j'ai fini par réussir à faire une fonction bien "mieux" avec mon UDF :
► Afficher le texte
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Recherche circulaire

#7

Message par ZDS »

Euh je vois pas trop le mieux là dedans ^^

A cause de ton système de coordonnées polaires, tu scrutes plusieurs fois le même pixel (surtout vers le centre). Et j'ai testé sur un autre ordinateur "potable" les performances de mon script à-la-mano d'hier soir, il est très rapide au final (1.785 seconde pour un cercle de 200pixels de rayons, 125.000 pixels à tester avec uniquement 400 opérations complexes). J'ai vu aussi que, dans ton algo, tu crées un $array AVANT de tester la couleur du pixel, tu arrives donc avec une énorme structure de données hyper lourde à manipuler. Je sais pas si c'est vraiment la meilleure approche à faire (à chaque itération tu effectues une opération lourde, ce qui a mit plus de vingt secondes à ta version de me pondre le "même" résultat :s).

Mais en tout cas, content que tu aies résolu ton soucis. A bientôt !
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
berthozero
Niveau 2
Niveau 2
Messages : 20
Enregistré le : sam. 16 janv. 2010 22:09
Status : Hors ligne

Re: [..] Recherche circulaire

#8

Message par berthozero »

C'est cool mais je n'arrive pas à utiliser ta fonction :S
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] Recherche circulaire

#9

Message par ZDS »

Pour la gestion de la tolérance :

1° Remplace la ligne :

Code : Tout sélectionner

Func rechercherUneCouleur($couleur,$centreX,$centreY,$rayon)
par :

Code : Tout sélectionner

Func rechercherUneCouleur($couleur,$centreX,$centreY,$rayon,$tolerance=0)
2° Remplace aussi la ligne :

Code : Tout sélectionner

If  $couleurEnCours  = $couleur  Then
par :

Code : Tout sélectionner

If tolerance($couleurEnCours, $couleur, $tolerance) Then
3° Et voila la fonction tolerance($couleurA, $couleurB, $valeur) :

Code : Tout sélectionner

Func tolerance($couleurA, $couleurB, $valeur)
    Local $hexA = Hex($couleurA,6), $hexB = Hex($couleurB,6)
    For $i = 1 To 3
        Local $decA = StringLeft(StringTrimLeft($hexA,2*($i-1)),2)
        Local $decB = StringLeft(StringTrimLeft($hexB,2*($i-1)),2)
        If Abs(Dec($decA)-Dec($decB)) > $valeur Then Return False
    Next
    Return True
EndFunc
Au final, le code devient :
► Afficher le texterechercherUneCouleur()
A bientôt !
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Répondre