#include "dessinTSP.h" #include #include #include #include #include #include #include #include // voir http://cairographics.org/ // débuter par http://cairographics.org/FAQ/ typedef enum {SVG, PDF, EPS, ERREUR} type_sortie; static type_sortie determiner_sortie(char *fichier) { size_t l = strlen(fichier); if (!strcmp(".svg",fichier+l-4)) return SVG; if (!strcmp(".pdf",fichier+l-4)) return PDF; if (!strcmp(".eps",fichier+l-4)) return EPS; return ERREUR; } void determiner_dim_surface(double *x, double *y, int nb_villes, coordonnees *villes, int fontsize) { double maxx=0, maxy=0; for(int i = 0; i < nb_villes; i++) { if( villes[i].x > maxx) maxx = villes[i].x ; if( villes[i].y > maxy) maxy = villes[i].y ; } if (fontsize > 0) { maxx += 4 * fontsize; maxy += 4 * fontsize; } *x=maxx; *y=maxy; } void tsp_dessiner(int nb_villes, coordonnees *villes, chemin tour, char *fichier, double fontsize) { cairo_surface_t *surface; cairo_t *cr; type_sortie sortie = determiner_sortie(fichier); double maxx, maxy; determiner_dim_surface(&maxx, &maxy, nb_villes, villes, fontsize); if (sortie == PDF) surface = cairo_pdf_surface_create (fichier, maxx, maxy); else if (sortie == SVG) surface = cairo_svg_surface_create (fichier, maxx, maxy); else if (sortie == EPS) { surface = cairo_ps_surface_create (fichier, maxx, maxy); cairo_ps_surface_set_eps (surface, true); } if (sortie == ERREUR || surface == NULL) { perror("fichier inadapté"); exit(1); } cr = cairo_create (surface); cairo_set_source_rgb (cr, 0, 0, 128); cairo_set_line_width (cr, 1); // se placer sur la dernière ville cairo_move_to (cr, villes[tour[nb_villes-1]].x, villes[tour[nb_villes-1]].y); for(int i = 0; i < nb_villes; i++) { cairo_line_to (cr, villes[tour[i]].x, villes[tour[i]].y); } cairo_stroke (cr); if(fontsize>0){ cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size (cr, fontsize); cairo_set_source_rgb (cr, 128, 0, 0); for(int i = 0; i < nb_villes; i++) { char numero[10]; sprintf (numero,"%d",tour[i]); cairo_move_to (cr, villes[tour[i]].x, villes[tour[i]].y); cairo_show_text (cr, numero); } } cairo_surface_destroy (surface); cairo_destroy (cr); }