INFO607
Classes | Typedefs | Functions
convex.c File Reference
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include <gtk/gtk.h>
#include "points.h"

Go to the source code of this file.

Classes

struct  SContexte
 

Typedefs

typedef struct SContexte Contexte
 

Functions

GtkWidget * creerIHM (Contexte *pCtxt)
 Charge l'image donnée et crée l'interface.
 
gboolean on_draw (GtkWidget *widget, GdkEventExpose *event, gpointer data)
 
gboolean diskRandom (GtkWidget *widget, gpointer data)
 
Point point2DrawingArea (Point p, Contexte *pCtxt)
 
void drawPoint (cairo_t *cr, Point p)
 
int main (int argc, char *argv[])
 

Typedef Documentation

◆ Contexte

typedef struct SContexte Contexte

Le contexte contient les informations utiles de l'interface pour les algorithmes de géométrie algorithmique.

Function Documentation

◆ creerIHM()

GtkWidget * creerIHM ( Contexte pCtxt)

Charge l'image donnée et crée l'interface.

Crée l'interface graphique en fonction du contexte pCtxt.

Definition at line 120 of file convex.c.

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}
gboolean on_draw(GtkWidget *widget, GdkEventExpose *event, gpointer data)
Definition convex.c:79
gboolean diskRandom(GtkWidget *widget, gpointer data)
Definition convex.c:174
GtkWidget * drawing_area
Definition convex.c:17

References diskRandom(), SContexte::drawing_area, SContexte::height, on_draw(), and SContexte::width.

Referenced by main().

◆ diskRandom()

gboolean diskRandom ( GtkWidget *  widget,
gpointer  data 
)

Génère un certain nombre de points distribués aléatoirement dans le disque unité et les ajoute au contexte.

Definition at line 174 of file convex.c.

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}
void TabPoints_ajoute(TabPoints *tab, Point p)
Definition points.c:12
TabPoints P
Definition convex.c:18
Definition points.h:4
double y
Definition points.h:6
double x
Definition points.h:5

References SContexte::drawing_area, SContexte::P, TabPoints_ajoute(), SPoint::x, and SPoint::y.

Referenced by creerIHM().

◆ drawPoint()

void drawPoint ( cairo_t *  cr,
Point  p 
)

Affiche un point p dans une zone de dessin cairo cr comme un disque.

Parameters
crle contexte CAIRO pour dessiner dans une zone de dessin.
pun point dans la zone de dessin.

Definition at line 113 of file convex.c.

114{
115 cairo_arc( cr, p.x, p.y, 1.5, 0., 2.0 * 3.14159626 );
116 cairo_fill( cr );
117}

References SPoint::x, and SPoint::y.

Referenced by on_draw().

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 60 of file convex.c.

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}
void TabPoints_init(TabPoints *tab)
Definition points.c:5
GtkWidget * creerIHM(Contexte *pCtxt)
Charge l'image donnée et crée l'interface.
Definition convex.c:120

References creerIHM(), main(), SContexte::P, and TabPoints_init().

◆ on_draw()

gboolean on_draw ( GtkWidget *  widget,
GdkEventExpose *  event,
gpointer  data 
)

c'est la réaction principale qui va redessiner tout.

Definition at line 79 of file convex.c.

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}
Point TabPoints_get(TabPoints *tab, int i)
Definition points.c:24
int TabPoints_nb(TabPoints *tab)
Definition points.c:30
Point point2DrawingArea(Point p, Contexte *pCtxt)
Definition convex.c:105
void drawPoint(cairo_t *cr, Point p)
Definition convex.c:113

References drawPoint(), SContexte::P, point2DrawingArea(), TabPoints_get(), and TabPoints_nb().

Referenced by creerIHM().

◆ point2DrawingArea()

Point point2DrawingArea ( Point  p,
Contexte pCtxt 
)

Fait la conversion coordonnées réelles de p vers coordonnées de la zone de dessin.

Parameters
ple point en entrée
pCtxtle contexte de l'IHM
Returns
ses coordonnées dans la zone de dessin.

Definition at line 105 of file convex.c.

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}

References SContexte::height, SContexte::width, SPoint::x, and SPoint::y.

Referenced by on_draw().