front_idill/src/search/js/curvesDetector.js
author bastiena
Mon, 23 Jul 2012 16:59:35 +0200
changeset 52 277c94533395
parent 47 4e1ee94d70b1
child 55 afd60399a7b5
permissions -rw-r--r--
Front IDILL : doc updated swipe factorized search bug fixed : when a search is not complete
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
     1
/*
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
     2
* This file is part of the TraKERS\Front IDILL package.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
     3
*
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
     4
* (c) IRI <http://www.iri.centrepompidou.fr/>
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
     5
*
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
     6
* For the full copyright and license information, please view the LICENSE
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
     7
* file that was distributed with this source code.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
     8
*/
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
     9
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    10
/*
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    11
 * Projet : TraKERS
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    12
 * Module : Front IDILL
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    13
 * Fichier : curvesDetector.js
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    14
 * 
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    15
 * Auteur : alexandre.bastien@iri.centrepompidou.fr
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    16
 * 
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    17
 * Fonctionnalités : Détecteur de courbes de recherche, appelé par la classe de création du canvas de recherche.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    18
 */
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    19
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    20
/*
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    21
 * Détecteur de courbes (lignes droites, arcs de cercles et cercles).
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    22
 * Est appelé dans le fichier :
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    23
 * searchCanvas > fonction create.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    24
*/
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    25
function CurvesDetector(divisions, sizeTreshold, dictionary, mosaic)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    26
{
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    27
    //Précision de la détection de direction en divisions (par défaut 12, selon une modélisation horaire et non mathématique).
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    28
    this.divisions = divisions;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    29
    //Taille limite pour un segment/courbe pour être considéré comme tel en px.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    30
    this.sizeTreshold = sizeTreshold;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    31
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    32
    this.dictionary = dictionary;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    33
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    34
    this.mosaic = mosaic;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    35
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    36
    //Code actuel généré. Il représente la structure de la courbe de recherche.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    37
    this.actualCode = '';
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    38
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    39
    this.joints = [];
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    40
    this.jInc = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    41
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    42
    //Longueur totale de la courbe.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    43
    this.MPTotalDist = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    44
    this.SPTotalDist = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    45
    //Longueur de la partie actuelle (après début ou changement de direction).
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    46
    this.MPActualDist = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    47
    this.SPActualDist = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    48
    //Angles actuels.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    49
    this.MPActualAngle = -1;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    50
    this.SPActualAngle = -1;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    51
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    52
    //Centre du repère du pointeur principal.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    53
    this.MPrepX = null;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    54
    this.MPrepY = null;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    55
    //Centre du repère du pointeur secondaire.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    56
    this.SPrepX = null;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    57
    this.SPrepY = null;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    58
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    59
    //Coordonnées actuelles du/des pointeur/s.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    60
    this.MPx = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    61
    this.MPy = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    62
    this.SPx = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    63
    this.SPy = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    64
    //Coordonnées précédentes du/des pointeur/s.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    65
    this.MPpx = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    66
    this.MPpy = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    67
    this.SPpx = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    68
    this.SPpy = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    69
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    70
    //Si les paramètres sont incorrects, on leur donne une valeur par défaut.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    71
    if(isNaN(divisions) || divisions < 1 || divisions > 360)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    72
    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    73
        this.divisions = 12;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    74
    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    75
    if(sizeTreshold < 1)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    76
    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    77
        sizeTreshold = 30;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    78
    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    79
}
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    80
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    81
/*
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    82
 * Reinitialise les paramètres du détecteur.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    83
 * Est appelé dans le fichier :
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    84
 * searchCanvas > fonction onPointerOut.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    85
*/
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    86
CurvesDetector.prototype.reinit = function()
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    87
{
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    88
    this.MPrepX = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    89
    this.MPrepY = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    90
    this.MPpx = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    91
    this.MPpy = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    92
    this.MPActualAngle = -1;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    93
    this.SPActualAngle = -1;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    94
    this.actualCode = '';
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    95
    this.MPActualDist = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    96
    this.MPTotalDist = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    97
}
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    98
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
    99
/*
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   100
 * Met à jour les positions des pointeurs.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   101
 * Est appelé dans le fichier :
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   102
 * searchCanvas > fonction onPointerMove.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   103
*/
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   104
CurvesDetector.prototype.updatePos = function(mpx, mpy, spx, spy)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   105
{
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   106
    //On met à jour les coordonnées récentes.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   107
    this.MPx = mpx;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   108
    this.MPy = mpy;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   109
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   110
    //Si les coordonnées précédentes n'existent pas, alors on les met à jour.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   111
    if(!this.MPpx)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   112
    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   113
        this.MPpx = mpx;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   114
    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   115
    if(!this.MPpy)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   116
    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   117
        this.MPpy = mpy;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   118
    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   119
    if(!this.MPrepX)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   120
    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   121
        this.MPrepX = mpx;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   122
    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   123
    if(!this.MPrepY)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   124
    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   125
        this.MPrepY = mpy;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   126
    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   127
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   128
    //Si on a un second pointeur.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   129
    if(spx && spy)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   130
    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   131
        //On met les coordonnées à jour.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   132
        this.SPx = spx;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   133
        this.SPy = spy;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   134
        
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   135
        //Si les coordonnées précédentes n'existent pas, alors on les met à jour.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   136
        if(!this.SPpx)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   137
        {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   138
            this.SPpx = spx;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   139
        }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   140
        if(!this.SPpy)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   141
        {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   142
            this.SPpy = spy;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   143
        }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   144
    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   145
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   146
    //On met à jour la distance des segments courants et on regarde les correspondances dans le dictionnaire.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   147
    this.updateDists();
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   148
}
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   149
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   150
/*
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   151
 * Met à jour les distances parcourues.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   152
 * Est appelé dans le fichier :
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   153
 * curvesDetector > fonction updatePos.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   154
*/
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   155
CurvesDetector.prototype.updateDists = function()
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   156
{
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   157
	//Si on n'est pas en recherche pas courbes, on part.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   158
	if(!this.mosaic.isSearchByCurvesOn)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   159
	{
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   160
		return;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   161
	}
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   162
	
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   163
    var foundGestures;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   164
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   165
    //Si on a de quoi calculer les distances.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   166
    if(this.MPx && this.MPy && this.MPpx && this.MPpy && this.MPrepX && this.MPrepY)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   167
    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   168
        //Distance entre les deux derniers points.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   169
        var MPDist = Math.floor(Math.sqrt((this.MPx - this.MPpx) * (this.MPx - this.MPpx) + (this.MPy - this.MPpy) * (this.MPy - this.MPpy)));
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   170
        //On met à jour la distance totale de la courbe.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   171
        this.MPTotalDist += MPDist;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   172
        //Et aussi la distance du segment en cours.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   173
        this.MPActualDist += MPDist;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   174
        
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   175
        //Angle courant initialisé à -1.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   176
        var MPCurrentA = -1;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   177
        
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   178
        //Si la distance actuelle du segment existe.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   179
        if(MPDist > 0)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   180
        {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   181
            //On calcule l'angle courant entre ce segment et 
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   182
            MPCurrentA = this.currentAngle(this.MPrepX, this.MPrepY, this.MPx, this.MPy, this.divisions);
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   183
        }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   184
        
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   185
        //Si la distance du segment actuel excède le seuil de la config et qu'il y a un angle.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   186
        if(this.MPActualDist > this.sizeTreshold && MPCurrentA != -1)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   187
        {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   188
            //Si l'angle affecté n'a pas encore de valeur ou si l'angle affecté est différent de l'angle calculé.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   189
            if(this.MPActualAngle == -1 || this.MPActualAngle != MPCurrentA)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   190
            {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   191
                //On affecte le nouvel angle.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   192
                this.MPActualAngle = MPCurrentA;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   193
                //On construit le code correspondant à ce segment.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   194
                this.actualCode += 'D' + MPCurrentA;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   195
                //On affecte le code dans la mosaique.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   196
                this.mosaic.actualCode = this.actualCode;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   197
                //On recherche les gestures commencant par ce code.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   198
                foundGestures = this.codeToGestures(this.actualCode);
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   199
                
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   200
                //S'il n'y a pas de gestures trouvées ou s'il y en a plus d'une.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   201
                if(foundGestures.length == 0 || foundGestures.split(';').length != 1)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   202
                {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   203
                    //On a trouvé quelque chose, même si ce qu'on a trouvé est vide ('').
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   204
                    this.mosaic.curvesGesturesFound = true;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   205
                    //On notifie ce qu'on a trouvé. Dans le cas où c'est '', on affiche geste inconnu.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   206
                    this.mosaic.removeNotifications();
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   207
                    this.mosaic.curvesGestures(foundGestures);
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   208
                    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   209
                    //Si ce qu'on a trouvé est vide et si l'aide n'est pas affichée.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   210
                    if(foundGestures.length == 0 && !this.mosaic.helpDisplayed)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   211
                    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   212
                        //On l'affiche.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   213
                        this.mosaic.notifyHelp();
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   214
                        foundGestures = '';
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   215
                        
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   216
                        //On enlève la recherche.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   217
                        this.mosaic.curvesGesturesFound = false;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   218
                        this.mosaic.isSearchByCurvesOn = false;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   219
                        this.mosaic.leaveSearch();
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   220
						
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   221
						//Si on était en mode filtrage de la mosaïque et qu'aucune gesture de filtrage n'avait été détectée avant ca, on revient en mode mosaïque.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   222
						if(this.mosaic.currentMode == "FILTER" && this.mosaic.filterSearchedType == "")
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   223
						{
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   224
							this.mosaic.currentMode = "MOSAIC";
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   225
							this.mosaic.isMosaicFiltered = false;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   226
						}
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   227
						//Sinon si on était en mode recherche dans une video et qu'aucune gesture n'avait été détectée avant ca, on revient en mode video.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   228
						if(this.mosaic.currentMode == "SEARCH" && this.mosaic.currentSearchGesture[this.centerId] == "")
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   229
						{
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   230
							this.mosaic.currentMode = "VIDEO";
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   231
						}
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   232
                    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   233
                    //Si l'aide est déjà affichée, on l'enlève.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   234
                    else if(foundGestures.split(';').length != 1 && this.mosaic.helpDisplayed)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   235
                    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   236
                        this.mosaic.removeHelp();
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   237
                    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   238
                }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   239
                //Si on a un seul résultat.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   240
                else
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   241
                {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   242
                    //On affecte la recherche.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   243
                    this.mosaic.currentSearchGesture[this.mosaic.centerId] = foundGestures;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   244
                    this.mosaic.isUserInSearchZone = false;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   245
                    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   246
                    //Si on est en mode recherche et que le player est prêt.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   247
                    if(this.mosaic.currentMode == "SEARCH" && this.mosaic.playerIsReady)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   248
                    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   249
                        //On effectue la recherche.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   250
                        this.mosaic.player.widgets[0].searchByGesture(foundGestures);
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   251
                        this.mosaic.isCurrentlyInASearchByGesture = this.mosaic.player.widgets[0].isCurrentlyInASearchByGesture;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   252
                        
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   253
                        //On notifie.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   254
                        this.mosaic.removeNotifications();
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   255
                        this.mosaic.searchGesture(foundGestures, 'valid');
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   256
                        
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   257
                        //S'il y a un marqueur trouvé au moins, on place le curseur sur le premier résultat.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   258
                        if(this.mosaic.player && this.mosaic.player.widgets[0] && this.mosaic.timeToGoAt[this.mosaic.centerId] === 0 && this.mosaic.player.widgets[0].atLeastOneSearchMarker(this.mosaic.currentSearchGesture[this.mosaic.centerId]))
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   259
                        {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   260
                            this.mosaic.player.widgets[0].goToFirstSearchedMarker(this.mosaic.currentSearchGesture[this.mosaic.centerId]);
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   261
                        }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   262
                        
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   263
                        //On enlève a recherche par courbes.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   264
                        foundGestures = '';
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   265
                        this.mosaic.curvesGesturesFound = false;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   266
                        
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   267
                        this.mosaic.isSearchByCurvesOn = false;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   268
                        this.mosaic.leaveSearch();
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   269
                    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   270
                    //Si on est en filtrage.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   271
                    else if(this.mosaic.currentMode == "FILTER")
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   272
                    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   273
                        if(this.mosaic.isMosaicFiltered)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   274
                        {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   275
                            //On met à jour la gesture de filtrage.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   276
                            this.mosaic.filterSearchedType = foundGestures;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   277
                            //On filtre la mosaique.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   278
                            this.mosaic.searchFilter(foundGestures);
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   279
                            this.mosaic.curvesGesturesFound = false;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   280
                            //On notifie.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   281
                            this.mosaic.removeNotifications();
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   282
                            this.mosaic.filterGesture(foundGestures, 'valid');
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   283
                            
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   284
                            foundGestures = '';
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   285
                            //On enlève la recherche par courbes.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   286
                            this.mosaic.isSearchByCurvesOn = false;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   287
                            this.mosaic.leaveSearch();
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   288
                        }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   289
                    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   290
                }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   291
                //On réinitialise la distance entre les deux derniers points.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   292
                this.MPActualDist = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   293
            }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   294
            //Sinon si l'angle n'a pas changé dans le segment en cours.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   295
            else
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   296
            {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   297
                //On met à jour les dernières coordonnées du pointeur principal.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   298
                this.MPrepX = this.MPpx;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   299
                this.MPrepY = this.MPpy;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   300
            }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   301
            
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   302
            //Si l'angle affecté n'a pas encore de valeur.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   303
            if(this.MPActualAngle == -1)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   304
            {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   305
                //On le met à jour.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   306
                this.MPActualAngle = MPCurrentA;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   307
            }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   308
        }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   309
        
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   310
        //On met à jour les coordonnées précédentes.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   311
        if(this.MPpx != this.MPx)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   312
        {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   313
            this.MPpx = this.MPx;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   314
        }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   315
        if(this.MPpy != this.MPy)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   316
        {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   317
            this.MPpy = this.MPy;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   318
        }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   319
    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   320
    //Idem au cas où on aurait un deuxième pointeur.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   321
    if(this.SPx && this.SPy && this.SPpx && this.SPpy)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   322
    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   323
        //Distance entre les deux derniers points.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   324
        var SPDist = Math.floor(Math.sqrt((this.SPx - this.SPpx) * (this.SPx - this.SPpx) + (this.SPy - this.SPpy) * (this.SPy - this.SPpy)));
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   325
        //On met à jour la distance totale de la courbe.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   326
        this.SPTotalDist += SPDist;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   327
        //Et aussi la distance du segment en cours.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   328
        this.SPActualDist += SPDist;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   329
        
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   330
        //Si la distance actuelle du segment existe.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   331
        if(SPDist > 0)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   332
        {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   333
            /*En développement*/
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   334
            this.currentAngle(this.SPpx, this.SPpy, this.SPx, this.SPy);
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   335
        }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   336
        
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   337
        //On met à jour les coordonnées précédentes.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   338
        if(this.SPpx != this.SPx)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   339
        {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   340
            this.SPpx = this.SPx;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   341
        }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   342
        if(this.SPpy != this.SPy)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   343
        {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   344
            this.SPpy = this.SPy;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   345
        }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   346
    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   347
}
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   348
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   349
/*
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   350
 * Renvoie les noms de gestures du dictionnaire qui ont un code qui commence par le code en entrée.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   351
 * Est appelé dans le fichier :
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   352
 * curvesDetector > fonction updateDists.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   353
*/
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   354
CurvesDetector.prototype.codeToGestures = function(code)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   355
{
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   356
    //Variable qui va stocker tous les noms trouvés.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   357
    var retNames = '';
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   358
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   359
    //Pour tout le dictionnaire.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   360
    for(var i = 0 ; i < this.dictionary.length ; i++)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   361
    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   362
        //Pour touts les codes de chaque gesture du dictionnaire.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   363
        for(var j = 0 ; j < this.dictionary[i].codes.length ; j++)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   364
        {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   365
            //Si le code en entrée est une partie début d'un des codes.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   366
            if(this.dictionary[i].codes[j].indexOf(code) == 0)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   367
            {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   368
                //On ajoute le nom de la gesture et on passe à la gesture suivante.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   369
                retNames += this.dictionary[i].name + ';';
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   370
                break;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   371
            }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   372
        }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   373
    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   374
    //Comme on sépare chaque nom par un ;, il faut supprimer le dernier si au moins un nom a été trouvé.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   375
    if(retNames.length > 0)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   376
    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   377
        retNames = retNames.substring(0, retNames.length-1);
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   378
    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   379
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   380
    //On renvoit les noms.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   381
    return retNames;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   382
}
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   383
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   384
/*
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   385
 * Calcule l'angle emprunté par le morceau de segment actuel. On prend A va vers B.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   386
 * Est appelé dans le fichier :
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   387
 * curvesDetector > fonction updateDists.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   388
*/
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   389
CurvesDetector.prototype.currentAngle = function(xa, ya, xb, yb, divisions)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   390
{
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   391
    //On calcule l'angle de la droite AB et des abscisses, et on effectue une rotation de 90° vers la gauche.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   392
    var angleRad = Math.atan2((ya - yb), (xa - xb)) - Math.PI / 2;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   393
    //On traduit les radians en divisions en passant de [-PI/2 ; PI/2] à [0 ; divisions - 1].
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   394
    var angleDiv = Math.floor((angleRad > 0 ? angleRad : (2*Math.PI + angleRad)) * divisions / (2*Math.PI));
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   395
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   396
    //L'angle initial est 0.
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   397
    if(angleDiv == divisions)
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   398
    {
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   399
        angleDiv = 0;
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   400
    }
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   401
    
277c94533395 Front IDILL :
bastiena
parents: 47
diff changeset
   402
    return angleDiv;
45
0e29ae4568a0 Front IDILL:
bastiena
parents:
diff changeset
   403
}