middleware/Tracking/Search/Segmenter.cs
author bastiena
Thu, 05 Apr 2012 15:54:44 +0200
changeset 17 fda26bfcabef
parent 15 4b78f179e7ce
child 27 6c08d4d7219e
permissions -rw-r--r--
Middleware : new gesture implemented : WAVE new kind of detection : postures new postures implemented : BEND KNEE_UP CROSS (developpement, but should be dropped because of collisions with SWIPE gestures) Gesture/Posture detectors got a link towards Debug (For debug purpose only, will be removed later)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     1
/*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     2
* This file is part of the TraKERS\Middleware package.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     3
*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     4
* (c) IRI <http://www.iri.centrepompidou.fr/>
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     5
*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     6
* For the full copyright and license information, please view the LICENSE_MIDDLEWARE
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     7
* file that was distributed with this source code.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     8
*/
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     9
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    10
/*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    11
 * Projet : TraKERS
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    12
 * Module : MIDDLEWARE
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    13
 * Sous-Module : Search
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    14
 * Classe : Segmenter
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    15
 * 
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    16
 * Auteur : alexandre.bastien@iri.centrepompidou.fr
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    17
 * 
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    18
 * Fonctionnalités : Permet d'extraire à la volée les segments du tracé en cours.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    19
 */
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    20
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    21
using System;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    22
using System.Collections.Generic;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    23
using System.Linq;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    24
using System.Text;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    25
using System.Windows.Media.Media3D;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    26
17
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    27
namespace Trakers.Tracking.Search
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    28
{
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    29
    public class Segmenter
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    30
    {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    31
        //Stocke les positions d'une main au cours du temps.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    32
        private List<Point3D> handPointerHistory;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    33
        //Point précédent.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    34
        private Point3D prevPt;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    35
        //Ratio : on prend 1/ratio points.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    36
        private int ratio;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    37
        //Indique le numéro du point actuellement enregistré (pour le ratio).
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    38
        private int currentPointNumber;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    39
        //Extremums enregistrés parmi les 3 axes pour détecter les changements de sens.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    40
        private double Xmax, Ymax, Zmax;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    41
        private double Xmin, Ymin, Zmin;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    42
        //On établit une distance en nombre de points entre le point actuel l'extremum 
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    43
        //local détecté dans les 3 axes (pour copier le segment : points de 0 à id de l'extremum).
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    44
        private int distToXmax, distToYmax, distToZmax;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    45
        private int distToXmin, distToYmin, distToZmin;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    46
        //Points critiques.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    47
        private Point3D minPt, maxPt;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    48
        //Tendance actuelle du tracé.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    49
        private bool XtowardRight, YtowardUp, ZtowardFront;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    50
        //Limites de différences à partir desquelles .
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    51
        private int directionChangeTresholdXY;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    52
        private float directionChangeTresholdZ;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    53
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    54
        /*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    55
        *  Initialisation du segmenter.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    56
        *  Coupe une courbe en deux dès qu'il repère un changement important de trajectoire.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    57
        */
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    58
        public Segmenter(int _ratio)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    59
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    60
            //directionChangeTresholdXY = kinectMain.getDirectionChangeTresholdXY();
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    61
            //directionChangeTresholdZ = kinectMain.getDirectionChangeTresholdZ();
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    62
            handPointerHistory = new List<Point3D>();
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    63
            ratio = _ratio;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    64
            currentPointNumber = 1;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    65
            prevPt = new Point3D(0, 0, 0);
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    66
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    67
            Xmax = Ymax = Zmax = Xmin = Ymin = Zmin = -1;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    68
            distToXmax = distToYmax = distToZmax = distToXmin = distToYmin = distToZmin = -1;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    69
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    70
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    71
        /*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    72
         * Getters et setters.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    73
         */
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    74
        public void SetRatio(int _ratio)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    75
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    76
            ratio = _ratio;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    77
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    78
        public void SetDirectionChangeTresholdXY(int _directionChangeTresholdXY)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    79
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    80
            directionChangeTresholdXY = _directionChangeTresholdXY;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    81
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    82
        public void SetDirectionChangeTresholdZ(float _directionChangeTresholdZ)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    83
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    84
            directionChangeTresholdZ = _directionChangeTresholdZ;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    85
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    86
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    87
        public int GetRatio()
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    88
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    89
            return ratio;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    90
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    91
        public int SetDirectionChangeTresholdXY()
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    92
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    93
            return directionChangeTresholdXY;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    94
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    95
        public float SetDirectionChangeTresholdZ()
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    96
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    97
            return directionChangeTresholdZ;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    98
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    99
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   100
        /*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   101
         * On charge tous les paramètres d'un coup.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   102
         */
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   103
        public void setParams(int _ratio, int _directionChangeTresholdXY, float _directionChangeTresholdZ)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   104
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   105
            ratio = _ratio;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   106
            directionChangeTresholdXY = _directionChangeTresholdXY;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   107
            directionChangeTresholdZ = _directionChangeTresholdZ;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   108
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   109
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   110
        /*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   111
         * Enregistre le point passé en paramètre d'après le ratio.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   112
         */
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   113
        public void RecordPoint(Point3D pt)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   114
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   115
            //Indique l'ID du point à couper.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   116
            int whereToCut;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   117
            //Si le ratio est excédé, on peut enregistrer.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   118
            if (currentPointNumber > ratio)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   119
                currentPointNumber = 1;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   120
            
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   121
            //Si le point précédent est à une position différente du point actuel.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   122
            if(prevPt.X != pt.X || prevPt.Y != pt.Y || prevPt.Z != pt.Z)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   123
            {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   124
                //Si le numéro est 1 (début ou ratio atteint), on enregistre.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   125
                if(currentPointNumber == 1)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   126
                    handPointerHistory.Add(pt);
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   127
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   128
                //Si le point précédent a été initialisé avec un vrai point.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   129
                if (prevPt.X > 0 && prevPt.Y > 0 && prevPt.Z > 0)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   130
                {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   131
                    //Appel aux detecteurs d'extremums.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   132
                    if ((whereToCut = DetectDirectionChangeAtXAxis(pt)) > 0)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   133
                        Segment(whereToCut);
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   134
                    else if((whereToCut = DetectDirectionChangeAtYAxis(pt)) > 0)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   135
                        Segment(whereToCut);
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   136
                    else if ((whereToCut = DetectDirectionChangeAtZAxis(pt)) > 0)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   137
                        Segment(whereToCut);
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   138
                }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   139
                //On met à jour le point précédent.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   140
                prevPt = pt;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   141
                //On passe au numéro suivant (jusqu'à atteindre le ration plus tard).
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   142
                currentPointNumber++;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   143
            }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   144
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   145
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   146
        /*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   147
         * Détecte un changement de sens (extremum) dans l'axe X.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   148
         */
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   149
        public int DetectDirectionChangeAtXAxis(Point3D pt)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   150
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   151
            //ID où couper en cas d'extremum.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   152
            int whereToCut = -1;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   153
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   154
            //Mise à jour des extremums.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   155
            if (Xmax == -1 || Xmax < pt.X)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   156
            {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   157
                //Si le point est plus grand en X que Xmax, alors il est remplacé et on réinitialise la
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   158
                //distance au dernier maximum en X.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   159
                Xmax = pt.X;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   160
                maxPt = pt;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   161
                distToXmax = 0;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   162
            }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   163
            else
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   164
                distToXmax++;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   165
            if (Xmin == -1 || Xmin > pt.X)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   166
            {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   167
                //Si le point est plus petit en X que Xmin, alors il est remplacé et on réinitialise la
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   168
                //distance au dernier minimum en X.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   169
                Xmin = pt.X;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   170
                minPt = pt;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   171
                distToXmin = 0;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   172
            }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   173
            else
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   174
                distToXmin++;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   175
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   176
            //Si X max est plus grand que la position actuelle additionnée du seuil
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   177
            //et que l'extremum n'est pas le premier point sauvegardé.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   178
            if (Xmax > pt.X + directionChangeTresholdXY && maxPt != handPointerHistory.First())
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   179
                whereToCut = currentPointNumber - distToXmax;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   180
            //Si X min est plus petit que la position actuelle à laquelle on a retiré le seuil
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   181
            //et que l'extremum n'est pas le premier point sauvegardé.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   182
            if (Xmin < pt.X - directionChangeTresholdXY && minPt != handPointerHistory.First())
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   183
                whereToCut = currentPointNumber - distToXmin;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   184
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   185
            return whereToCut;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   186
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   187
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   188
        /*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   189
         * Détecte un changement de sens (extremum) dans l'axe Y.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   190
         */
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   191
        public int DetectDirectionChangeAtYAxis(Point3D pt)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   192
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   193
            //ID où couper en cas d'extremum.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   194
            int whereToCut = -1;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   195
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   196
            //Mise à jour des extremums.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   197
            if (Ymax == -1 || Ymax < pt.Y)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   198
            {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   199
                //Si le point est plus grand en Y que Ymax, alors il est remplacé et on réinitialise la
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   200
                //distance au dernier maximum en Y.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   201
                Ymax = pt.Y;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   202
                maxPt = pt;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   203
                distToYmax = 0;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   204
            }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   205
            else
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   206
                distToYmax++;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   207
            if (Ymin == -1 || Ymin > pt.Y)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   208
            {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   209
                //Si le point est plus petit en Y que Ymin, alors il est remplacé et on réinitialise la
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   210
                //distance au dernier minimum en Y.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   211
                Ymin = pt.Y;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   212
                minPt = pt;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   213
                distToYmin = 0;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   214
            }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   215
            else
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   216
                distToYmin++;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   217
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   218
            //Si Y max est plus grand que la position actuelle additionnée du seuil
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   219
            //et que l'extremum n'est pas le premier point sauvegardé.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   220
            if (Ymax > pt.Y + directionChangeTresholdXY && maxPt != handPointerHistory.First())
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   221
                whereToCut = currentPointNumber - distToYmax;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   222
            //Si Y min est plus petit que la position actuelle à laquelle on a retiré le seuil
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   223
            //et que l'extremum n'est pas le premier point sauvegardé.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   224
            if (Ymin < pt.Y - directionChangeTresholdXY && minPt != handPointerHistory.First())
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   225
                whereToCut = currentPointNumber - distToYmin;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   226
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   227
            return whereToCut;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   228
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   229
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   230
        /*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   231
         * Détecte un changement de sens (extremum) dans l'axe Z.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   232
         */
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   233
        public int DetectDirectionChangeAtZAxis(Point3D pt)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   234
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   235
            //ID où couper en cas d'extremum.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   236
            int whereToCut = -1;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   237
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   238
            //Mise à jour des extremums.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   239
            if (Zmax == -1 || Zmax < pt.Z)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   240
            {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   241
                //Si le point est plus grand en Z que Ymax, alors il est remplacé et on réinitialise la
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   242
                //distance au dernier maximum en Z.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   243
                Zmax = pt.Z;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   244
                maxPt = pt;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   245
                distToZmax = 0;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   246
            }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   247
            else
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   248
                distToZmax++;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   249
            if (Zmin == -1 || Zmin > pt.Z)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   250
            {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   251
                //Si le point est plus petit en Z que Zmin, alors il est remplacé et on réinitialise la
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   252
                //distance au dernier minimum en Z.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   253
                Zmin = pt.Z;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   254
                minPt = pt;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   255
                distToZmin = 0;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   256
            }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   257
            else
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   258
                distToZmin++;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   259
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   260
            //Si Z max est plus grand que la position actuelle additionnée du seuil
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   261
            //et que l'extremum n'est pas le premier point sauvegardé.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   262
            if (Zmax > pt.Z + directionChangeTresholdXY && maxPt != handPointerHistory.First())
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   263
                whereToCut = currentPointNumber - distToZmax;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   264
            //Si Z min est plus petit que la position actuelle à laquelle on a retiré le seuil
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   265
            //et que l'extremum n'est pas le premier point sauvegardé.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   266
            if (Zmin < pt.Z - directionChangeTresholdXY && minPt != handPointerHistory.First())
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   267
                whereToCut = currentPointNumber - distToZmin;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   268
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   269
            return whereToCut;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   270
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   271
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   272
        /*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   273
         * Découpe le tracé en cours en segment allant du premier point au premier extremum trouvé.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   274
         */
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   275
        public void Segment(int whereToCut)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   276
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   277
            handPointerHistory.RemoveRange(0, whereToCut);
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   278
            currentPointNumber -= whereToCut;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   279
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   280
    }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   281
}