Page 1 sur 1

[..] Recherche circulaire

Posté : mer. 09 juin 2010 23:49
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 !

Re: [..] Recherche circulaire

Posté : jeu. 10 juin 2010 07:58
par Tlem

Re: [..] Recherche circulaire

Posté : jeu. 10 juin 2010 11:03
par berthozero
Merci beaucoup mais je ne sais pas comment m'en servir ...

Re: [..] Recherche circulaire

Posté : jeu. 10 juin 2010 22:32
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.

Re: [..] Recherche circulaire

Posté : ven. 11 juin 2010 00:12
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()

Re: [..] Recherche circulaire

Posté : ven. 11 juin 2010 10:20
par berthozero
Merci mais j'ai fini par réussir à faire une fonction bien "mieux" avec mon UDF :
► Afficher le texte

Re: [..] Recherche circulaire

Posté : ven. 11 juin 2010 11:38
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 !

Re: [..] Recherche circulaire

Posté : ven. 11 juin 2010 12:46
par berthozero
C'est cool mais je n'arrive pas à utiliser ta fonction :S

Re: [..] Recherche circulaire

Posté : mar. 15 juin 2010 11:29
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 !