/// <summary>
        /// Méthode qui permet de générer la carte de chaleur ou de transparence de l'image
        /// </summary>
        /// <param name="mode">Mode sélectionné</param>
        /// <param name="img">Image sur laquelle on appose le masque</param>
        private void GenerateMask(string mode, ImageExp img)
        {
            ImageBmp = new WriteableBitmap(new BitmapImage(new Uri(img.Acces, UriKind.RelativeOrAbsolute)));
            imgBackground.Source = ImageBmp;

            // Taille de l'image d'origine
            //int width = imageBitmap.PixelWidth;
            //int height = imageBitmap.PixelHeight;
            int width = 1680;
            int height = 900;

            // Creation du masque a partir du bitmap d'origine
            WriteableBitmap bitmap = new WriteableBitmap(ImageBmp);

            // Pixels Destination (r,g,b,a)
            byte[, ,] pixels = new byte[height, width, 4];

            // Pixels Source
            int strideSource = ImageBmp.PixelWidth * 4;
            int sizeSource = ImageBmp.PixelHeight * strideSource;
            byte[] pixelSource = new byte[sizeSource];
            bitmap.CopyPixels(pixelSource, strideSource, 0);

            double max = Data[AppData.ImagesExp[img.Numero-1]].Cast<double>().Max();

            for (int row = 0; row < height; row++)
            {
                for (int col = 0; col < width; col++)
                {
                    // le numéro de l'image à indiquer est un en dessous
                    double tps = Data[AppData.ImagesExp[img.Numero-1]][row, col];

                        // Pixel d'origine
                        int indexSource = row * strideSource + 4 * col;

                        double coef = tps / max;

                        // 0 : bleu, 1 : vert, 2 : rouge
                        // Cas où on demande le gris
                        if (mode == "gris")
                        {
                            pixels[row, col, 0] = (byte)(pixelSource[indexSource] * coef);
                            pixels[row, col, 1] = (byte)(pixelSource[indexSource + 1] * coef);
                            pixels[row, col, 2] = (byte)((pixelSource[indexSource + 2]) * coef);
                        }
                            // Cas où l'utilisateur demande de la couleur
                        else
                        {
                            int x = (int)Math.Floor((1000 / max) * (max-tps));

                            if (x >= 0 && x < 255)
                            {
                                pixels[row, col, 2] = (byte)(pixelSource[indexSource+2]/2 + (255)/2);
                                pixels[row, col, 1] = (byte)(pixelSource[indexSource+1]/2 + (x)/2);
                                pixels[row, col, 0] = (byte)( pixelSource[indexSource]/2 + (0)/2);
                            }
                            if (x >= 255 && x < 510)
                            {
                                pixels[row, col, 2] = (byte)(pixelSource[indexSource + 2] / 2 + (510 - x) / 2);
                                pixels[row, col, 1] = (byte)(pixelSource[indexSource + 1] / 2 + (255) / 2);
                                pixels[row, col, 0] = (byte)(pixelSource[indexSource] / 2 + (0) / 2);

                            }
                            if (x >= 510 && x < 765)
                            {
                                pixels[row, col, 2] = (byte)(pixelSource[indexSource + 2] / 2 + (0) / 2);
                                pixels[row, col, 1] = (byte)(pixelSource[indexSource + 1] / 2 + (255) / 2);
                                pixels[row, col, 0] = (byte)(pixelSource[indexSource] / 2 + (x-510) / 2);
                            }
                            if (x >= 765 && x < 1020)
                            {
                                pixels[row, col, 2] = (byte)(pixelSource[indexSource + 2] / 2 + (0) / 2);
                                pixels[row, col, 1] = (byte)(pixelSource[indexSource + 1] / 2 + (1020-x) / 2);
                                pixels[row, col, 0] = (byte)(pixelSource[indexSource] / 2 + (255) / 2);
                            }
                            if (x >= 1020 && x < 1275)
                            {
                                pixels[row, col, 2] = (byte)(pixelSource[indexSource + 2] / 2 + (x-1020) / 2);
                                pixels[row, col, 1] = (byte)(pixelSource[indexSource + 1] / 2 + (0) / 2);
                                pixels[row, col, 0] = (byte)(pixelSource[indexSource] / 2 + (255) / 2);
                            }
                            if (x >= 1275 && x <= 1530)
                            {
                                pixels[row, col, 2] = (byte)(pixelSource[indexSource + 2] / 2 + (255) / 2);
                                pixels[row, col, 1] = (byte)(pixelSource[indexSource + 1] / 2 + (0) / 2);
                                pixels[row, col, 0] = (byte)(pixelSource[indexSource] / 2 + (1530-x) / 2);
                            }

                    }

                    // Alpha
                    pixels[row, col, 3] = 255;
                }
            }

            // Flat le tableau
            byte[] pixels1d = new byte[height * width * 4];
            int index = 0;
            for (int row = 0; row < height; row++)
            {
                for (int col = 0; col < width; col++)
                {
                    for (int i = 0; i < 4; i++)
                        pixels1d[index++] = pixels[row, col, i];
                }
            }

            Int32Rect rect = new Int32Rect(0, 0, width, height);
            int stride = 4 * width;
            bitmap.WritePixels(rect, pixels1d, stride, 0);

            imgMask.Source = bitmap;
        }
        /// <summary>
        /// Méthode qui permet de calculer le nombre d'aller-retour dans une image
        /// </summary>
        /// <param name="i">Image de l'expérience dont on veut calculer le nombre d'aller-retour</param>
        /// <param name="dico">Dictionnaire dans lequel on veut stocker l'ensemble des nombre d'aller-retour pour l'image</param>
        /// <param name="listeObs">Liste des observations</param>
        private void calculeAllerRetour(ImageExp i, Dictionary<ImageExp, List<double>> dico, List<Observation> listeObs)
        {
            // Pour chaque observations de l'mage
            // Paramètre qui permet de savoir si le point d'attention d'avant était dans le bandeau ou dans l'image
            bool bandeau;
            int nb = 0;

            foreach (Observation o in listeObs)
            {
                // On regarde si le premier est dans le bandeau ou pas
                bandeau = o.PointsAttentions[0].dansBandeau();

                foreach (PointAttention pa in o.PointsAttentions)
                {
                   bool bTemp = pa.dansBandeau();
                    if (bandeau != bTemp)
                        nb++;

                    // On renseigne le nouveau dernier
                    bandeau = pa.dansBandeau();

                }
            }

            //On ajoute le nombre d'aller-retour calculés à la liste
            if (dico.ContainsKey(i))
            {
                dico[i].Add(nb);
            }
            else
            {
                dico.Add(i, new List<double>());
                dico[i].Add(nb);
            }
        }
        /// <summary>
        /// Méthode qui permet de calculer la dispersion des PA à chaque instant t obtenue
        /// </summary>
        /// <param name="i">Image de l'expérience dont on veut calculer la dispersion des PA</param>
        /// <param name="dico">Dictionnaire dans lequel on veut stocker l'ensemble des taux de dispersion des PA par image</param>
        /// <param name="listeObs">Liste des observations</param>
        private void calculeDispersion(ImageExp i, Dictionary<ImageExp, List<double>> dico, List<Observation> listeObs)
        {
            //Liste des distances entres les PA à un instant t
            List<double> distances = new List<double>();

            //Dispersion provisoire
            double disp = 0;

            // Somme de toutes les dipersions de l'expérience (1 image, 1 groupe)
            double sommeDisp = 0;

            // On veut pouvoir regrouper tous les points d'attention du même instant t
            for (int t = 0; t < listeObs[0].PointsAttentions.Count(); t++)
            {
                double sommeDist = 0;
                int n = 0;

                // On va faire la moyenne de trois distance à chaque instant t pour déterminer la dispersion de chaque instant t
                for (int j = 0; j < listeObs.Count(); j++)
                {
                    for (int k = j + 1; k < listeObs.Count(); k++)
                    {
                        sommeDist += listeObs[j].PointsAttentions[t].CoordPA.Distance(listeObs[k].PointsAttentions[t].CoordPA);
                        n++;
                    }
                }

                disp = sommeDist / n;
                sommeDisp += disp;
            }

            // On calculcule la dispersion moyenne sur une image
            double moyDisp = sommeDisp / listeObs[0].PointsAttentions.Count();

            //On ajoute _tousLesGroupes taux action la liste
            if (dico.ContainsKey(i))
            {
                dico[i].Add(moyDisp);
            }
            else
            {
                dico.Add(i, new List<double>());
                dico[i].Add(moyDisp);
            }
        }
示例#4
0
 /// <summary>
 /// Constructeur de la classe Observation
 /// </summary>
 /// <param name="image">Image de l'expérience pour laquelle on ajoute les observations</param>
 public Observation(ImageExp image)
 {
     Image = image;
     PointsAttentions = new List<PointAttention>();
 }