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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
| /***************************
/ Thread
**************************/
void *dessine_thread (void *args)
{
GtkWidget *dessin = lookup_widget(GTK_WIDGET(args), "drawingarea1");
while(1) // boucle infinie du thread
{
if(dess)
{
if(!arret)
{
temps += 1;
gdk_window_invalidate_rect(dessin->window, NULL, FALSE);
}
/*if(temps > larg-20)
{
dess = FALSE;
//redess = FALSE;
}*/
}
usleep(10000); // attendre entre deux redessiner
}
return NULL;
}
/*********************************************************************************
/ Expose Event
/********************************************************************************/
gboolean
on_drawingarea1_expose_event (GtkWidget *widget,
GdkEventExpose *event,
gpointer user_data)
{
GdkGC *gc;
gc = gdk_gc_new(widget->window);
gdk_window_get_size(GDK_WINDOW(widget->window), &larg, &haut); //Récupération de des dimensions de la fenêtre
gdk_draw_line(widget->window, gc, 0, haut/2, larg, haut/2);
//Création de l'interface entre 2 milieux
if(lignemilieu == TRUE)
{
gdk_draw_line(widget->window, gc, larg/2, haut, larg/2, 0);
}
//Création des interfaces entre 3 milieux
// valeurded = gtk_entry_get_text(GTK_ENTRY(pEntry));
if(affichagetranche == TRUE)
{
gdk_draw_line(widget->window, gc, larg/2, haut, larg/2, 0);
gdk_draw_line(widget->window, gc, larg/2, haut, larg/2 + tranche, 0);
}
/**************************************
/ Affichage de l'onde
/***************************************/
gint ite,i;
gint x_precedent, y_precedent;
gdouble ez[larg], hy[larg];
for(ite=0; ite<larg;ite++)
{
ez[ite]= haut/2;
hy[ite]= haut/2; //initialisation des tableaux
}
gdouble imp0=377.0;
gint mm;
gint temps_max = 100;
gint abs=1;
/*Incrémentation du temps*/
for (i=0; i < temps; i++)
{
ez[0]=40*sin((gdouble)((i*2*3.14)/(gdouble)(larg))) + haut/2; //le haut/2 permet de centrer le graphique
for (mm=0; mm<larg-1; mm++) //Mise Ã* jour de champ magnétique
{
hy[mm] = hy[mm] + (ez[mm+1] - ez[mm])/imp0;
}
for (mm=1; mm<larg; mm++) //Mise Ã* jour de champ électrique
{
ez[mm] = ez[mm] + imp0*(hy[mm] - hy[mm-1]);
}
x_precedent=0; //dessin de la courbe dans l'interface pour chaque instant
y_precedent=ez[0];
for (mm=0; mm< larg-1; mm++)
{
gdk_draw_line(widget->window, gc, x_precedent, y_precedent, x_precedent+1 ,ez[mm+1]);
x_precedent++;
y_precedent = ez[mm+1];
}
}
usleep(10000);
return FALSE;
} |
Partager