Bonjour,
je dois actuellement changer la couleur de chaque pixel d'une de mes drawing area apres avoir déterminé cette couleur en fonction de diverses données qui me sont fournies.
Seulement voilà, mon problème est que, dès que ces données sont trop importantes, les calculs prennent trop de temps et tout d'un coup ca plante... std::bad_alloc.
Je me suis donc dit que c'était un problème d'allocation de mémoire ou de destruction de pointeurs. Mais après avoir corrigé ces fautes... ben ca plante toujours.
Je vous poste ci-dessous la fonction contenant ma boucle.
Je sais juste que ca plante toujours lors de l'appel de ma fonction getTriangleSource()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 void affInt(double **tabInt, int nbElem) { int nbNoeuds, nbTriangles, nbTrianglesBord; Noeud *noeuds; Triangle *triangles; int *noeudsBord; int *trianglesBord; gc = gdk_gc_new(aireA->window); initTPSF("cercle_fin2.msh", "donnees.txt", nbNoeuds, nbTriangles, nbTrianglesBord, noeuds, triangles, noeudsBord, trianglesBord); delete noeudsBord; delete trianglesBord; double maxechx = 0; double maxechy = 0; double coef = 0; double max; double *muas = new double[2]; ifstream ifs ( "donnees.txt" ); string ligne; stringstream ss; vector<double*> labels; while (!ifs.eof()) //Tant qu'il reste des lignes à lire, on met la valeur de la ligne courante dans le vecteur { getline (ifs, ligne); ss << ligne; ss >> muas[0] >> muas[1]; labels.push_back (muas); ss.clear(); } delete muas; ifs.close(); for (int p=0; p< labels.size()-1; p++) { g_print("mua %g / mus %g\n", labels.at(p)[0], labels.at(p)[1]); } //On trouve la plus grosse intensité mua for (int i=0; i<labels.size()-1; i++) { if (labels.at(i)[0] > max) { max = labels.at(i)[0]; } } //On trouve le plus gros x et y afin de calculer l'échelle x for (int i=0; i<nbNoeuds; i++) { if (noeuds[i].getX() > maxechx) { maxechx = noeuds[i].getX(); } if (noeuds[i].getY() > maxechy) { maxechy = noeuds[i].getY(); } } double echx = 200/maxechx; double echy = 200/maxechy; double x=0, y=0; double val; Triangle t; int label; for (int i=0; i<200; i++) { x = (i-100)/echx; for (int j=0; j<200; j++) { y = (j-100)/echy; t = Matrice::getTriangleSource(nbTriangles, noeuds, triangles, x, y); label = t.getLabel(); val = labels.at(label)[0]/max; changer_couleur(val); gdk_draw_point(pixmapA, gc, j, i); gtk_widget_draw ( aireA, NULL ); g_print("pixel %d/%d créé\n", i, j); } } }
Voici ci-dessous les deux fonctions appelées dans ma boucle :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 void changer_couleur(double value) { GdkColor *colors = new GdkColor[1]; colors[0] = gdk_color; gdk_colormap_free_colors (colormap, colors, 1); delete colors; gdk_color.red = (guint16)(value*65535.0); gdk_color.green = (guint16)(value*65535.0); gdk_color.blue = (guint16)(value*65535.0); colormap = gdk_window_get_colormap (aireA->window); gdk_color_alloc (colormap, &gdk_color); gdk_gc_set_foreground (gc, &gdk_color); }Merci d'avance pour votre aide !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 Triangle Matrice::getTriangleSource(const int nbElements, Noeud *noeuds, Triangle *triangles, const double x, const double y) { double p_courant; double min, xmin, ymin; int tmin= 0; Noeud n1, n2, n3; double x1, x2, x3; double y1, y2, y3; int i= 0; do { n1= noeuds[triangles[i].getN1()]; n2= noeuds[triangles[i].getN2()]; n3= noeuds[triangles[i].getN3()]; x1= n1.getX(), x2= n2.getX(), x3= n3.getX(); y1= n1.getY(), y2= n2.getY(), y3= n3.getY(); //Calcul du centre du triangle xmin= (x1 + x2 + x3) / 3.0; ymin= (y1 + y2 + y3) / 3.0; //Distance minimale p_courant= sqrt(pow(xmin - x, 2) + pow(ymin - y, 2)); if (i == 0) { min= p_courant; } if (p_courant < min) { min= p_courant; tmin= i; } i++; } while (i < nbElements); return triangles[tmin]; }
Partager