43gboolean
on_draw( GtkWidget *widget, GdkEventExpose *event, gpointer data );
81void drawPoint( cairo_t* cr,
double x,
double y,
double r );
91gint
tic( gpointer data );
138 double x,
double y,
double vx,
double vy,
double m );
151 gtk_init( &argc, &argv );
163on_draw( GtkWidget *widget, GdkEventExpose *event, gpointer data )
170 GdkWindow* window = gtk_widget_get_window(widget);
171 cairo_region_t* cairoRegion = cairo_region_create();
172 GdkDrawingContext* drawingContext
173 = gdk_window_begin_draw_frame( window, cairoRegion );
174 cairo_t* cr = gdk_drawing_context_get_cairo_context( drawingContext );
175 cairo_set_source_rgb (cr, 1, 1, 1);
179 cairo_set_source_rgb (cr, 0, 0, 1);
186 gdk_window_end_draw_frame(window,drawingContext);
188 cairo_region_destroy(cairoRegion);
195 q.
x[ 0 ] = ( p.
x[ 0 ] + 1.0 ) / 2.0 * pCtxt->
width;
196 q.
x[ 1 ] = ( 1.0 - p.
x[ 1 ] ) / 2.0 * pCtxt->
height;
202 return pCtxt->
width * l / 2.0;
208 q.
x[ 0 ] = 2.0 * ((double)p.
x[0] / (
double)pCtxt->
width) - 1.0;
209 q.
x[ 1 ] = -2.0 * ((double)p.
x[1] / (
double)pCtxt->
height) + 1.0;
216 pp.
x[ 0 ] = p.
x[ 0 ];
217 pp.
x[ 1 ] = p.
x[ 1 ];
224void drawPoint( cairo_t* cr,
double x,
double y,
double r )
226 cairo_arc( cr, x, y, r, 0.0, 2.0 * 3.14159626 );
232 cairo_move_to( cr, p.
x[ 0 ], p.
x[ 1 ] );
233 cairo_line_to( cr, q.
x[ 0 ], q.
x[ 1 ]);
244 GtkWidget* button_quit;
247 window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
249 hbox1 = gtk_box_new( GTK_ORIENTATION_HORIZONTAL, 10 );
251 vbox1 = gtk_box_new( GTK_ORIENTATION_VERTICAL, 10 );
252 vbox2 = gtk_box_new( GTK_ORIENTATION_VERTICAL, 10 );
259 gtk_container_add( GTK_CONTAINER( hbox1 ), pCtxt->
drawing_area );
261 g_signal_connect( G_OBJECT ( pCtxt->
drawing_area ),
"draw",
262 G_CALLBACK(
on_draw ), pCtxt );
264 gtk_container_add( GTK_CONTAINER( hbox1 ), vbox2 );
267 pCtxt->
label_nb = gtk_label_new(
"0 points" );
268 gtk_container_add( GTK_CONTAINER( vbox2 ), pCtxt->
label_nb );
270 gtk_container_add( GTK_CONTAINER( vbox2 ), pCtxt->
label_distance );
273 button_quit = gtk_button_new_with_label(
"Quitter" );
275 g_signal_connect( button_quit,
"clicked",
276 G_CALLBACK( gtk_main_quit ),
279 gtk_container_add( GTK_CONTAINER( vbox1 ), hbox1 );
280 gtk_container_add( GTK_CONTAINER( vbox1 ), button_quit );
282 gtk_container_add( GTK_CONTAINER( window ), vbox1 );
285 gtk_widget_show_all( window );
286 g_signal_connect (window,
"destroy", G_CALLBACK (gtk_main_quit), NULL);
293 g_timeout_add ( 1000*
DT,
tic, (gpointer) pCtxt );
297 g_timeout_add ( 1000,
ticDistance, (gpointer) pCtxt );
303 double p,
double x,
double y,
double vx,
double vy,
double m )
306 if ( ( rand() / (
double) RAND_MAX ) < p )
317 fontaine( pCtxt, 0.25, -0.5, 0.5, 0.3, 0.3, 2.5 );
320 g_timeout_add (1000*
DT,
tic, (gpointer) pCtxt );
329 gtk_label_set_text( GTK_LABEL( pCtxt->
label_nb ), buffer );
342 g_timeout_add (1000,
ticDistance, (gpointer) pCtxt );
352 for (
int i = 0; i < n; ++i )
359 for (
int i = 0; i < n; ++i )
368 for (
int i = 0; i < n; ++i )
371 p->
v[ 0 ] += (
DT / p->
m) * p->
f[ 0 ];
372 p->
v[ 1 ] += (
DT / p->
m) * p->
f[ 1 ];
379 p->
x[ 0 ] +=
DT * p->
v[ 0 ];
380 p->
x[ 1 ] +=
DT * p->
v[ 1 ];
388 for (
int i = 0; i < n; ++i )
397 if ( ( p->
x[ 0 ] < -1.5 ) || ( p->
x[ 0 ] > 1.5 )
398 || ( p->
x[ 1 ] < -1.5 ) || ( p->
x[ 1 ] > 1.5 ) )
int getCompteurDistance(void)
void resetCompteurDistance(void)
Remet à zéro le compteur du nombre d'appel à distance.
Force gravite(double gx, double gy)
Définit la force de gravité dans la direction donnée.
void appliqueForce(Particule *p, Force *f)
Ajoute à la particule p la force donnée f.
gint ticAffichage(gpointer data)
gboolean on_draw(GtkWidget *widget, GdkEventExpose *event, gpointer data)
void fontaine(Contexte *pCtxt, double p, double x, double y, double vx, double vy, double m)
GtkWidget * creerIHM(Contexte *pCtxt)
Charge l'image donnée et crée l'interface.
double length2DrawingAreaLength(Contexte *pCtxt, double l)
void calculDynamique(Contexte *pCtxt)
void deplaceParticule(Contexte *pCtxt, Particule *p)
void drawPoint(cairo_t *cr, double x, double y, double r)
Point point2DrawingAreaPoint(Contexte *pCtxt, Point p)
Point drawingAreaPoint2Point(Contexte *pCtxt, Point p)
gint ticDistance(gpointer data)
void deplaceTout(Contexte *pCtxt)
void drawLine(cairo_t *cr, Point p, Point q)
void drawParticule(Contexte *pCtxt, cairo_t *cr, Particule p)
struct SContexte Contexte
int TabParticules_nb(TabParticules *tab)
Particule * TabParticules_ref(TabParticules *tab, int i)
void TabParticules_init(TabParticules *tab)
void TabParticules_supprime(TabParticules *tab, int i)
void TabParticules_ajoute(TabParticules *tab, Particule p)
void initParticule(Particule *p, double x, double y, double vx, double vy, double m)
Particule TabParticules_get(TabParticules *tab, int i)
GtkWidget * label_distance
Une force est un type et des paramètres qui la définissent.
Représente un tableau dynamique de particules.
int main(int argc, char *argv[])