INFO607
convex.c
Go to the documentation of this file.
1#include <stdlib.h>
2#include <math.h>
3#include <assert.h>
4#include <gtk/gtk.h>
5#include "points.h"
6
7//-----------------------------------------------------------------------------
8// Déclaration des types
9//-----------------------------------------------------------------------------
10/**
11 Le contexte contient les informations utiles de l'interface pour
12 les algorithmes de géométrie algorithmique.
13*/
14typedef struct SContexte {
15 int width;
16 int height;
17 GtkWidget* drawing_area;
20
21
22//-----------------------------------------------------------------------------
23// Déclaration des fonctions
24//-----------------------------------------------------------------------------
25/**
26 Crée l'interface graphique en fonction du contexte \a pCtxt.
27*/
28GtkWidget* creerIHM( Contexte* pCtxt );
29
30/**
31 c'est la réaction principale qui va redessiner tout.
32*/
33gboolean on_draw( GtkWidget *widget, GdkEventExpose *event, gpointer data );
34
35/**
36 Génère un certain nombre de points distribués aléatoirement dans le
37 disque unité et les ajoute au contexte.
38*/
39gboolean diskRandom( GtkWidget *widget, gpointer data );
40
41/**
42 Fait la conversion coordonnées réelles de \a p vers coordonnées de la zone de dessin.
43 @param p le point en entrée
44 @param pCtxt le contexte de l'IHM
45 @return ses coordonnées dans la zone de dessin.
46*/
48
49/**
50 Affiche un point \a p dans une zone de dessin cairo \a cr comme un disque.
51
52 @param cr le contexte CAIRO pour dessiner dans une zone de dessin.
53 @param p un point dans la zone de dessin.
54 */
55void drawPoint( cairo_t* cr, Point p );
56
57//-----------------------------------------------------------------------------
58// Programme principal
59//-----------------------------------------------------------------------------
60int main( int argc,
61 char* argv[] )
62{
63 Contexte context;
64 TabPoints_init( &context.P );
65
66 /* Passe les arguments à GTK, pour qu'il extrait ceux qui le concernent. */
67 gtk_init( &argc, &argv );
68
69 /* Crée une fenêtre. */
70 creerIHM( &context );
71
72 /* Rentre dans la boucle d'événements. */
73 gtk_main ();
74 return 0;
75}
76
77// c'est la réaction principale qui va redessiner tout.
78gboolean
79on_draw( GtkWidget *widget, GdkEventExpose *event, gpointer data )
80{
81 Contexte* pCtxt = (Contexte*) data;
82 TabPoints* ptrP = &(pCtxt->P);
83 // c'est la structure qui permet d'afficher dans une zone de dessin
84 // via Cairo
85 GdkWindow* window = gtk_widget_get_window(widget);
86 cairo_region_t* cairoRegion = cairo_region_create();
87 GdkDrawingContext* drawingContext
88 = gdk_window_begin_draw_frame( window, cairoRegion );
89 cairo_t * cr = gdk_drawing_context_get_cairo_context( drawingContext );
90 cairo_set_source_rgb (cr, 1, 1, 1); // choisit le blanc.
91 cairo_paint( cr ); // remplit tout dans la couleur choisie.
92
93 // Affiche tous les points en bleu.
94 cairo_set_source_rgb (cr, 0, 0, 1);
95 for ( int i = 0; i < TabPoints_nb( ptrP ); ++i )
96 drawPoint( cr, point2DrawingArea( TabPoints_get( ptrP, i ), pCtxt ) );
97
98 // On a fini, on peut détruire la structure.
99 gdk_window_end_draw_frame(window,drawingContext);
100 // cleanup
101 cairo_region_destroy(cairoRegion);
102 return TRUE;
103}
104
106{
107 Point q;
108 q.x = (p.x+1.0)/2.0*pCtxt->width;
109 q.y = (1.0-p.y)/2.0*pCtxt->height;
110 return q;
111}
112
113void drawPoint( cairo_t* cr, Point p )
114{
115 cairo_arc( cr, p.x, p.y, 1.5, 0., 2.0 * 3.14159626 );
116 cairo_fill( cr );
117}
118
119/// Charge l'image donnée et crée l'interface.
120GtkWidget* creerIHM( Contexte* pCtxt )
121{
122 GtkWidget* window;
123 GtkWidget* vbox1;
124 GtkWidget* vbox2;
125 GtkWidget* hbox1;
126 GtkWidget* button_quit;
127 GtkWidget* button_disk_random;
128
129 /* Crée une fenêtre. */
130 window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
131 // Crée un conteneur horizontal box.
132 hbox1 = gtk_box_new( GTK_ORIENTATION_HORIZONTAL, 10 );
133 // Crée deux conteneurs vertical box.
134 vbox1 = gtk_box_new( GTK_ORIENTATION_VERTICAL, 10 );
135 vbox2 = gtk_box_new( GTK_ORIENTATION_VERTICAL, 10 );
136 // Crée une zone de dessin
137 pCtxt->drawing_area = gtk_drawing_area_new();
138 pCtxt->width = 500;
139 pCtxt->height = 500;
140 gtk_widget_set_size_request ( pCtxt->drawing_area, pCtxt->width, pCtxt->height );
141 // Crée le pixbuf source et le pixbuf destination
142 gtk_container_add( GTK_CONTAINER( hbox1 ), pCtxt->drawing_area );
143 // ... votre zone de dessin s'appelle ici "drawing_area"
144 g_signal_connect( G_OBJECT ( pCtxt->drawing_area ), "draw",
145 G_CALLBACK( on_draw ), pCtxt );
146
147 // Rajoute le 2eme vbox dans le conteneur hbox (pour mettre les boutons sélecteur de points
148 gtk_container_add( GTK_CONTAINER( hbox1 ), vbox2 );
149 // Crée les boutons de sélection "source"/"destination".
150 button_disk_random = gtk_button_new_with_label( "Points aléatoires dans disque" );
151 // Connecte la réaction gtk_main_quit à l'événement "clic" sur ce bouton.
152 g_signal_connect( button_disk_random, "clicked",
153 G_CALLBACK( diskRandom ),
154 pCtxt );
155 gtk_container_add( GTK_CONTAINER( vbox2 ), button_disk_random );
156 // Crée le bouton quitter.
157 button_quit = gtk_button_new_with_label( "Quitter" );
158 // Connecte la réaction gtk_main_quit à l'événement "clic" sur ce bouton.
159 g_signal_connect( button_quit, "clicked",
160 G_CALLBACK( gtk_main_quit ),
161 NULL);
162 // Rajoute tout dans le conteneur vbox.
163 gtk_container_add( GTK_CONTAINER( vbox1 ), hbox1 );
164 gtk_container_add( GTK_CONTAINER( vbox1 ), button_quit );
165 // Rajoute la vbox dans le conteneur window.
166 gtk_container_add( GTK_CONTAINER( window ), vbox1 );
167
168 // Rend tout visible
169 gtk_widget_show_all( window );
170
171 return window;
172}
173
174gboolean diskRandom( GtkWidget *widget, gpointer data )
175{
176 Contexte* pCtxt = (Contexte*) data;
177 TabPoints* ptrP = &(pCtxt->P);
178 printf( "diskRandom\n" );
179 for ( int i = 0; i < 10; ++i )
180 {
181 Point p;
182 do {
183 p.x = 2.0 * ( rand() / (double) RAND_MAX ) - 1.0;
184 p.y = 2.0 * ( rand() / (double) RAND_MAX ) - 1.0;
185 } while ( (p.x*p.x+p.y*p.y) > 1.0 );
186 TabPoints_ajoute( ptrP, p );
187 }
188 gtk_widget_queue_draw( pCtxt->drawing_area );
189
190 return TRUE;
191}
Point TabPoints_get(TabPoints *tab, int i)
Definition points.c:24
void TabPoints_ajoute(TabPoints *tab, Point p)
Definition points.c:12
int TabPoints_nb(TabPoints *tab)
Definition points.c:30
void TabPoints_init(TabPoints *tab)
Definition points.c:5
Point point2DrawingArea(Point p, Contexte *pCtxt)
Definition convex.c:105
gboolean on_draw(GtkWidget *widget, GdkEventExpose *event, gpointer data)
Definition convex.c:79
GtkWidget * creerIHM(Contexte *pCtxt)
Charge l'image donnée et crée l'interface.
Definition convex.c:120
void drawPoint(cairo_t *cr, Point p)
Definition convex.c:113
gboolean diskRandom(GtkWidget *widget, gpointer data)
Definition convex.c:174
struct SContexte Contexte
GtkWidget * drawing_area
Definition convex.c:17
TabPoints P
Definition convex.c:18
Definition points.h:4
double y
Definition points.h:6
double x
Definition points.h:5
int main(int argc, char *argv[])
Definition union-find.c:49