Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tracer un parcours

Tracer un parcours

Sujet résolu
    23 septembre 2010 à 18:19:55

    Bonsoir,

    J'ai besoin de votre aide, d'ailleurs entièrement de votre aide car je ne connais rien au sujet que je vous vous expliquer, j'aimerais donc juste des propositions, des scripts déjà fait ou des aides.

    Voilà, donc enfaite j'aimerais faire une animation en javascript ou autre si c'est possible (flash, php etc..) permettant à l'utilisateur via le curseur de sa souris de dessiner une forme prédéfinit et si l'utilisateur arrive a reproduire cette forme alors sa le lance sur une autre page PHP.

    Si vous voulez plus d'information, merci de me lès préciser. Merci
    • Partager sur Facebook
    • Partager sur Twitter
      24 septembre 2010 à 9:02:38

      Salut,
      C'est une sorte d'identification graphique que tu veux faire ?
      • Partager sur Facebook
      • Partager sur Twitter
        24 septembre 2010 à 14:27:51

        En gros oui :D

        Enfaite le but est que l'utilisateur dessine une forme puis par rapport à ce qu'il a dessiné que sa compare à la forme réelle pour voir si le dessin et bon ou pas... en gros comme ceci :

        http://games.ludobox.com/games/html/ra [...] id-crayon.swf

        Mais en javascript ou même en flash si c'est possible.

        Merci
        • Partager sur Facebook
        • Partager sur Twitter
          24 septembre 2010 à 15:09:02

          Il serait intéressant de connaître ton niveau en JavaScript... car réaliser un tel système me semble quand même relativement complexe...

          Pour le tracé en lui-même, tu peux utiliser la technologie canvas.

          Par contre pour la comparaison entre le tracé de l'utilisateur et celui de référence, je sais pas comment tu vas t'y prendre :-°
          • Partager sur Facebook
          • Partager sur Twitter
            24 septembre 2010 à 15:25:45

            Bah je crois qu'il a dit qu'il ne connait pas le JavaScript, auquel cas, c'est raté pour lui :-° ...
            • Partager sur Facebook
            • Partager sur Twitter

            L'important n'est pas de savoir maîtriser une technologie à la perfection, mais d'avoir une belle capacité d'adaptation.

              24 septembre 2010 à 15:53:49

              a oui, en JavaScript je connais rien j'ai jamais fait de script avec s'est pour cela que si y avait des scripts déjà fait à peu près j'aurais pu m'en servir mais bon j'ai cherché un moment et j'ai rien trouvé :s
              • Partager sur Facebook
              • Partager sur Twitter
                24 septembre 2010 à 16:10:39

                Citation : Golmote

                Par contre pour la comparaison entre le tracé de l'utilisateur et celui de référence, je sais pas comment tu vas t'y prendre :-°



                S'il s'agit d'une authentification, je ferais la comparaison côté serveur. Genre t'envoie les coordonnées du tracé et le serveur compare à un modèle.

                Pour commencer tu devrais apprendre la base :


                http://www.siteduzero.com/tutoriel-3-3 [...] vascript.html
                http://www.siteduzero.com/tutoriel-3-1 [...] vascript.html
                http://www.siteduzero.com/tutoriel-3-8 [...] vascript.html
                • Partager sur Facebook
                • Partager sur Twitter
                  24 septembre 2010 à 16:17:32

                  Citation : LCaba

                  S'il s'agit d'une authentification, je ferais la comparaison côté serveur. Genre t'envoie les coordonnées du tracé et le serveur compare à un modèle.



                  Ouais enfin mon interrogation, c'était plutôt au sujet de la comparaison justement...

                  J'ai aucune idée de la méthode adéquate à utiliser pour comparer la ressemblance de deux tracés... ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 septembre 2010 à 16:45:04

                    Facile, tu utilises la fonction trace_compare() de php... :-°

                    Sérieusement ça doit pas être évident du tout. Je pensais à une comparaison entre deux tableaux. Tu quadrilles virtuellement la zone de tracé. Lorsque le tracé passe dans un carreau, ce carreau (qui correspond à une entrée du tableau) prends la valeur 100 (par exemple) et les carreau voisin prenne des valeurs décroissante (ex: 90 pour les carreau juste à côté, 80 pour ceux qui viennent en deuxième, etc...).
                    Ensuite tu compare ça avec un tableau modèle, en faisant par exemple la somme du carré des écarts, et en deça d'une valeur seuil tu acceptes le tracé... easy quoi :p

                    Le problème, c'est que s'il y a un décalage ou une différence de taille, ça marche plus.

                    Je crois qu'en pratique, ce genre de truc est basé sur des réseaux de neurones artificielles
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 septembre 2010 à 16:58:58

                      J'imagine que pour la comparaison il faut être une brute en math ...

                      Trouves toi un gosu matheux qui t'écriras les équations pour toi ^^.


                      C'est vrai que c'est complexe comme problème.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 septembre 2010 à 7:11:11

                        Citation : LCaba

                        Sérieusement ça doit pas être évident du tout. Je pensais à une comparaison entre deux tableaux. Tu quadrilles virtuellement la zone de tracé. Lorsque le tracé passe dans un carreau, ce carreau (qui correspond à une entrée du tableau) prends la valeur 100 (par exemple) et les carreau voisin prenne des valeurs décroissante (ex: 90 pour les carreau juste à côté, 80 pour ceux qui viennent en deuxième, etc...).
                        Ensuite tu compare ça avec un tableau modèle, en faisant par exemple la somme du carré des écarts, et en deça d'une valeur seuil tu acceptes le tracé... easy quoi :p



                        J'avais aussi imaginé quelque chose comme ça :)


                        Citation : LCaba


                        Le problème, c'est que s'il y a un décalage ou une différence de taille, ça marche plus.



                        Il serait possible d'"encadrer" le tracé dans un rectangle pour pouvoir le redimensionner à la taille du modèle.

                        Mais si y'a rotation, ça marche plus non plus x)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 septembre 2010 à 12:35:18

                          La rotation c'est moins un problème. En général si on te dit de dessiner un A tu va pas faire ça : ∀ :D
                          • Partager sur Facebook
                          • Partager sur Twitter
                            25 septembre 2010 à 18:04:16

                            Un petit essai fait à la va-vite. (Ne vous attardez pas sur le code, c'est moche. Très très moche.)

                            Première ligne : Le modèle, l'agrandissement du modèle (et clarification du tracé), la représentation du modèle comme décrite par LCaba.

                            Deuxième ligne : Le canvas où dessiner !, son agrandissement (et clarification), et sa représentation LCaba-ienne.

                            Dernière ligne : La représentation des écarts en valeur absolue.


                            Détermination d'un ratio douteux, puis commentaire en fonction de ce ratio. ;)


                            EDIT : Faut recharger la page pour réessayer.
                            EDIT 2 : En fait j'ai mis un confirm() :)

                            EDIT 3 : Le redimensionnement, j'ai essayé... mais avec Canvas, la perte de qualité est vraiment notable... donc ça faussait tout :(


                            EDIT 4 : Si une explication détaillée vous intéresse, ce sera plus tard ce soir ou demain :p

                            EDIT 5 : Ah ouais mais si j'oublie le lien aussi... -_-"

                            http://golmote.free.fr/tracecompare.htm
                            • Partager sur Facebook
                            • Partager sur Twitter
                              26 septembre 2010 à 1:00:15

                              Là je suis impressionné :D
                              Je pense que l'amélioration est à faire du côté de la représentation du modèle. Un modèle plus tolérant, par exemple 20 valeurs décroissantes au lieu de 10, ou alors un truc non linéaire. Car ici dès qu'on s'éloigne un peu du tracé on passe dans le gris clair... Il doit aussi y avoir un travail à faire du côté du calcul du ratio.
                              Mais j'ai un peu du mal à m'approprié ton code pour bidouiller, je connaissais pas les canvas donc c'est nouveau tout ça pour moi.
                              Pour l'heure, bonne nuit.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 septembre 2010 à 6:30:54

                                Si j'ai le temps demain aujourd'hui :-° , je nettoie le code, et je rectifie le calcul du ratio.

                                J'ai un peu baclé hier, j'étais pressé.

                                Bref, pour l'heure, bonne nuit aussi :)

                                EDIT : Et j'en profiterai pour expliquer de façon détaillée, au moins en commentaires, pour faciliter tes bidouillages. :p
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  26 septembre 2010 à 11:33:38

                                  Ok. Bon je poste pour que tu puisses poster avant demain 6:30 ;)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    26 septembre 2010 à 17:15:46

                                    Voilà, j'ai commenté un peu.

                                    http://golmote.free.fr/tracecompare.htm

                                    J'ai changé le calcul du ratio... mais je sais pas si c'est forcément mieux... x)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      27 septembre 2010 à 8:07:52

                                      Merci pour toute votre aide ;) je vais pouvoir commencer à voir les tutos que vous m'avez recommandé et voir le code source de ta page Golmote pour comprendre un peu mieux comme tu fais ;)

                                      Encore merci,
                                      Cordialement, xortix
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        27 septembre 2010 à 9:34:05

                                        Golmote, un seul mot... t'es taré ^^

                                        Faut vraiment que je me mette à Canvas n'empêche, ça a l'air super fun ^^
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          27 septembre 2010 à 11:49:45

                                          ...complètement taré :D
                                          Je suis flatté, mon pseudo apparaît 59 fois dans ton code source :ange: . Trouver le concept c'était facile, le coder un peu moins.
                                          Pour en revenir au code, en biostat j'ai retenu une chose au moins, c'est que pour représenter un écart on utilise plutôt la somme du carré des écart plutôt que la somme des valeurs absolues. En faisant comme ça, et en divisant par le max au carré, on obtient une comparaison plus tolérante, plus "naturelle"

                                          Voici donc la fonction compare remasteurisée (les modifications sont précédées de l'ancien code, mis en commentaire suivi de 4 étoiles) :

                                          compare = function() {
                                          	for(var j=0,m=tabModele.length;j<m;j++) {
                                          		tabCompare[j] = [];
                                          		for(var i=0,l=tabModele[j].length;i<l;i++) {
                                          			// tabCompare stocke la différence entre les valeurs du modèle et les valeurs de l'utilisateur
                                          			tabCompare[j][i] = tabModele[j][i] - tabUser[j][i];
                                          			// Le ratio fait la somme des valeurs absolues des écarts
                                          			// **** ratio += Math.abs(tabCompare[j][i]);
                                          			ratio += Math.pow(tabCompare[j][i],2);
                                          			// On dessine la représentation de la comparaison
                                          			// **** ctx.compare.fillStyle = 'rgba(0,0,0,'+(Math.abs(tabCompare[j][i])/maxLCaba)+')';
                                          			ctx.compare.fillStyle = 'rgba(0,0,0,'+(Math.pow(tabCompare[j][i],2)/Math.pow(maxLCaba,2))+')';
                                          			ctx.compare.fillRect(i*4,j*4,4,4);
                                          		}
                                          	}
                                          	// On divise le ratio par le nombre total de pixels
                                          	// **** ratio /= tabCompare.length*tabCompare[0].length;
                                          	ratio /= tabCompare.length*tabCompare[0].length;
                                          	// Puis on divise par maxLCaba pour obtenir un ratio entre 0 et 1
                                          	// **** ratio /= maxLCaba;
                                          	ratio /= Math.pow(maxLCaba,2);
                                          	
                                          	// Le tracé correspond à peu près au modèle quand le ratio est inférieur à 0.1.
                                          	
                                          	var str;
                                          	if(ratio>0.5) {
                                          		str = "C'est n'importe quoi ! =o";
                                          	} else if(ratio>0.3) {
                                          		str = "On est loin du modèle...";
                                          	} else if(ratio>0.1) {
                                          		str = "C'est pas encore ça...";
                                          	} else if(ratio>0) {
                                          		str = "Ah ça c'est pas mal !";
                                          	} else if(ratio==0) {
                                          		str = "Euh... tricheur !? o_o";
                                          	}
                                          	
                                          	
                                          	if(confirm(
                                          		'Ratio : ' + ratio +
                                          		'\n' + str + 
                                          		'\n\nVoulez-vous recommencer ?'
                                          	)) { window.location.reload(); }
                                          },
                                          
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            27 septembre 2010 à 13:55:55

                                            Citation : LCaba

                                            Pour en revenir au code, en biostat j'ai retenu une chose au moins, c'est que pour représenter un écart on utilise plutôt la somme du carré des écart plutôt que la somme des valeurs absolues. En faisant comme ça, et en divisant par le max au carré, on obtient une comparaison plus tolérante, plus "naturelle"



                                            C'est noté. :)

                                            Citation : birdy42

                                            Faut vraiment que je me mette à Canvas n'empêche, ça a l'air super fun ^^



                                            Canvas c'trop bien ! <3

                                            Citation : XortiX

                                            Merci pour toute votre aide ;) je vais pouvoir commencer à voir les tutos que vous m'avez recommandé et voir le code source de ta page Golmote pour comprendre un peu mieux comme tu fais ;)

                                            Encore merci,
                                            Cordialement, xortix



                                            Yep, bon courage :)
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              27 septembre 2010 à 16:03:57

                                              Si je savais utiliser canvas je ferais un tuto sur le sdz :-°
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                27 septembre 2010 à 17:29:44

                                                Citation : LCaba

                                                Si je savais utiliser canvas je ferais un tuto sur le sdz :-°



                                                J'y ai pensé.

                                                Mais le big-tuto actuellement en cours de rédaction abordera normalement l'HTML5 dans son dernier chapitre.

                                                J'attends de voir ce qu'ils vont faire... ;)
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  27 septembre 2010 à 21:27:23

                                                  Bonsoir,

                                                  j'ai pu toucher un peu à ton code voir à quoi correspond chaque fonction du code.

                                                  Maintenant j'aimerais que l'on puisse tracer une lettre alphabétique par exemple (la lettre A) le modèle serait donc un A majuscule dessiné et il faudrait le reproduire.

                                                  J'ai donc pu voir que ce n'était pas possible car on doit reproduire le modèle en 1 seul trait (lorsqu'on lâche le clique gauche sa bloque le cadre d'écriture) donc j'aimerais bien savoir comment peut-on faire pour que l'on puisse tracer plusieurs traits dans "le cadre rouge" puis valider avec un bouton "Vérification" pour que sa action la fonction "compare();" et que à ce moment là sa puisse comparer mais surtout pas en relâchant le click gauche.

                                                  Merci de votre aide

                                                  P.S : Je sais juste que sait là dedans :

                                                  window.onmousemove = function(e) {
                                                  if(down) {
                                                  var x = offset_X(canvas.user,e), y = offset_Y(canvas.user,e);
                                                  ctx.user.lineTo(x,y);
                                                  ctx.user.stroke();
                                                  ctx.user.beginPath();
                                                  ctx.user.moveTo(x,y);
                                                  }
                                                  };
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    27 septembre 2010 à 22:15:41

                                                    Bah en gros, il "suffit" que tu vires la suppression des événements et l'appel de drawingOver() aux lignes 232 à 236.

                                                    Ailleurs dans le code, tu places un listener onclick sur ton bouton de validation.

                                                    Dans ce listener, tu remets les lignes que tu as virées.

                                                    (A modifier selon ce que tu comptes changer bien entendu)
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      27 septembre 2010 à 22:27:14

                                                      Avec le Code de Golmote actuel ce n'est pas vraiment possible de faire une levée du stylo tout en ayant une reconnaissance en temps réel avec l'alphabet latin.

                                                      Mais tu peux considérer que tant qu'on ne trouve pas de caractère on laisse le trait en place... mais la précision risque encore d'en prendre un coup (après il faudrait tester avec une base de jeu de caractères complet pour voir si ça marche bien).

                                                      Sinon au lieu de faire une reconnaissance immédiate au moment où on relâche tu peux demander de cliquer sur un bouton pour lancer le processus de reconnaissance (lancer la fonction drawingOver(); ).


                                                      Ou alors si tu veux tout faire en un seul trait je te conseille de regarder du côté de l'alphabet Graffiti de palm OS. Mais cela demande une légère connaissance de l'alphabet pour les utilisateurs (même si la plus part des lettres ressemblent aux caractères latin classique.
                                                      Mais si tu utilises ce jeu de caractère, je te conseillerai plutôt de faire une reconnaissance vectorielle au lieu de faire une reconnaissance bitmap. Cela permet d'être plus robuste aux bruits (il n'y a pas de contraintes de taille et est peu sensible aux tremblements d'un trait). Le principe est que pendant le mouvement de la souris tu détectes le sens du mouvement (en fonction de la sensibilité tu peux détecter plus ou moins de directions mais 8 est souvent suffisant) et de ne stocker que les changement de direction. Ensuite il suffit de comparer avec les mouvements correspondants pour dessiner un caractère (par exemple pour le A c'est haut;haut-droite;droite;bas-droite;bas).
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        27 septembre 2010 à 22:43:14

                                                        EDIT: Double grillé mais l'ordi a planté et j'en ai profité pour sortir mon chien :D
                                                        @restimel : pour le coup je crois que tu n'est pas tout à fait dans le sujet ...

                                                        Non, tu n'as pas besoin de toucher à cette fonction.

                                                        Modifie window.onmouseup :

                                                        window.onmouseup = function(e) { down = false; };

                                                        Et puis créer ton bouton "valider" :

                                                        <button id="valider">Valider</button>
                                                        


                                                        Et le javascript associé :

                                                        document.getElementById('valider').onclick = function(){
                                                        	// Retrait des listeners
                                                        	canvas.user.onmousedown = function(){};
                                                        	window.onmousemove = function(){};
                                                        	window.onmouseup = function(){};
                                                        	// L'opération de dessin est terminée.
                                                        	drawingOver();
                                                        }
                                                        
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          28 septembre 2010 à 1:18:37

                                                          Citation : LCaba

                                                          @restimel : pour le coup je crois que tu n'est pas tout à fait dans le sujet ...



                                                          Je trouve l'idée de la reconnaissance vectorielle plutôt intéressante, perso. :) A étudier ^^
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            28 septembre 2010 à 7:16:29

                                                            Je me suis mal exprimé... J'ai pas dis que ce qu'il proposais n'était pas intéressant :o

                                                            C'est juste la première phrase de restimel :

                                                            Citation : restimel

                                                            Avec le Code de Golmote actuel ce n'est pas vraiment possible de faire une levée du stylo tout en ayant une reconnaissance en temps réel avec l'alphabet latin.



                                                            Il ne s'agit pas d'une reconnaissance en temps réel mais juste d'un seul caractère à vérifier. Et avec ton code c'est tout à fait possible.

                                                            Pour en revenir à la reconnaissance vectorielle, t'as une idée pour sauvegarder les changements de directions ?


                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              28 septembre 2010 à 9:18:16

                                                              Bah une simple détection de chaque mouvement du onmousemove, avec des valeurs arrondies pour se limiter à 8 directions ?

                                                              Faut sans doute faire un ratio entre le mouvement en X et le mouvement en Y, pour déterminer si le mouvement est vertical, horizontal ou diagonal.
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Tracer un parcours

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown