/// <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); } }
/// <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>(); }