middleware/Tracking/Search/Segmenter.cs
author bastiena
Fri, 06 Apr 2012 11:48:00 +0200
changeset 24 2bdf5d51d434
parent 17 fda26bfcabef
child 27 6c08d4d7219e
permissions -rw-r--r--
Front IDILL : TuioPoint class header modified in order to manage 3D points TuioContainer class header modified in order to manage 3D points TuioCursor class header modified in order to manage 3D points TuioClient class header modified in order to manage 3D points TuioClient class modified in order to manage 3D points client class header modified in order to manage 3D points client class modified in order to manage 3D points
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
}