Bonjour wiwaxia,
C'est le mode d'attente, j'ai gardé l'animation de la ligne qui parcourt les points dans l'ordre après tri. Initialement c'était pour vérifier que le classement était bon. Et puis je l'ai laissé pour le fun.
Les commandes sont simples (je ne les avais pas rappelées car elles étaient dans le post #47) :
- Clic sur Chercher (ou Alt C) recherche le plus grand rectangle (avec un ratio de dy/dx < 2/3 et un dYmini (hauteur minimale) paramétrable par le SpinEdit de droite. Le temps en ms est affiché au milieu du panel mais c'est toujours 0.
- Clic sur Chercher avec Ctrl appuyé fait la même chose en mode démo. Si la touche Ctrl est maintenue, les étapes s'enchaînent toutes les secondes sinon toutes les 0.2 secondes.
- Clic sur Nouveau opère un nouveau tirage au sort de N points réglable de 2 à 256 avec le SpinEdit de gauche.
- Clic sur Nouveau (ou Alt N) avec Ctrl appuyé fait la même chose mais enchaîne directement la recherche.
- Avec Ouvrir (ou Alt O) on peut charger un CSV (délimiteur ";") sans espace et sans titre. Format type : x;y. Les points n'ont pas besoin d'être dans un ordre particulier.
- Avec Sauvegarder (ou Alt S) on peut sauvegarder les points et le résultat en CSV. Il y a 3 colonnes : n°_originel;X;Y (pour le résultat : R0;X,Y et R1;dx;dy).
- Un clic sur l'image sélectionne simplement le point le plus proche.
J'ai depuis mis en œuvre une autre optimisation que j'appelle le dYmin (hauteur minimale) dynamique qui est calculé quand on change de scan (Xo augmente) et quand on trouve un plus grand rectangle (dYmin = Smax/(Lx-Xo)). Le gain est limité (mais quand même >10 % à 256) tendant légèrement à décroitre avec N. Si ça t'intéresse : Big_rect 5.zip (j'ai retiré la contrainte de ration qui casse l'esprit de rechercher le plus grand rectangle).
J'ai testé tes valeurs sur mon bidule, je trouve les même résultats, mais il y a un gros problème de classes : mathématicien vs tekos, repère direct contre repère inverse, repère mathématique contre repère écran![]()
Ce n'est pas le même algo que tu as présenté initialement, apparemment tu testes tous les quadruplets de points que tu filtres. Ca fait 215 = 4 millions d'itérations pas trop chargées, ça devrait tourner entre le 0.1 s et 1 s ce qui reste humainement instantané. Je pense que tu pourrais accélérer le traitement de TestL en sortant de la boucle dès que la condition est satisfaite. Si tu es sous Lazarus, ceci pourrait tomber en marche :
Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 FUNCTION TestL(K1, K2, L1, L2: Byte; VAR N_: Tab_V): Boolean; VAR m : Byte; BEGIN FOR m := 1 TO Npoint DO if (N_[K1].x < N_[m].x) and (N_[m].x < N_[K2].x) and (N_[L1].y < N_[m].y) and (N_[m].y < N_[L2].y)) then Exit(False); Result := True; END;
Salut
Partager