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