// "display.cpp" // (c) OPAC Team, LIFL, January 2006 /* Contact: paradiseo-help@lists.gforge.inria.fr */ #include #include #include #include "display.h" #include "node.h" #include "opt_route.h" #define BORDER 20 #define RATIO 0.5 #define screen_width 1024 #define screen_height 768 static const char * filename; /* Computed coordinates */ static unsigned * X_new_coord, * Y_new_coord ; /* this variable will contain the handle to the returned graphics context. */ static GC gc; /* this variable will contain the pointer to the Display structure */ static Display* disp; /* this variable will store the ID of the newly created window. */ static Window win; static int screen; /* Create a new backing pixmap of the appropriate size */ /* Best tour */ /* gdk_gc_set_line_attributes (gc, 2, GDK_LINE_ON_OFF_DASH, GDK_CAP_NOT_LAST, GDK_JOIN_MITER) ; gdk_gc_set_foreground (gc, & color_green) ; for (int i = 0 ; i < (int) numNodes ; i ++) { gdk_draw_line (pixmap, gc, X_new_coord [opt_route [i]], Y_new_coord [opt_route [i]], X_new_coord [opt_route [(i + 1) % numNodes]], Y_new_coord [opt_route [(i + 1) % numNodes]]); }*/ void openMainWindow (const char * __filename) { filename = __filename; /* Map */ int map_width = (int) (X_max - X_min); int map_height = (int) (Y_max - Y_min); int map_side = std :: max (map_width, map_height); /* Calculate the window's width and height. */ int win_width = (int) (screen_width * RATIO * map_width / map_side); int win_height = (int) (screen_height * RATIO * map_height / map_side); /* Computing the coordinates */ X_new_coord = new unsigned [numNodes]; Y_new_coord = new unsigned [numNodes]; for (unsigned i = 0; i < numNodes; i ++) { X_new_coord [i] = (unsigned) (win_width * (1.0 - (X_coord [i] - X_min) / map_width) + BORDER); Y_new_coord [i] = (unsigned) (win_height * (1.0 - (Y_coord [i] - Y_min) / map_height) + BORDER); } /* Initialisation */ XGCValues val ; disp = XOpenDisplay (NULL) ; screen = DefaultScreen (disp) ; win = XCreateSimpleWindow (disp, RootWindow (disp, screen), 0, 0, win_width + 2 * BORDER, win_height + 2 * BORDER, 2, BlackPixel (disp, screen), WhitePixel (disp, screen)) ; val.foreground = BlackPixel(disp, screen) ; val.background = WhitePixel(disp, screen) ; gc = XCreateGC (disp, win, GCForeground | GCBackground, & val) ; XMapWindow (disp, win) ; XFlush (disp) ; while (true) { XClearWindow (disp, win) ; /* Vertices as circles */ for (unsigned i = 1 ; i < numNodes ; i ++) XDrawArc (disp, win, gc, X_new_coord [i] - 1, Y_new_coord [i] - 1, 3, 3, 0, 364 * 64) ; /* New tour */ std :: ifstream f (filename); if (f) { Route route; f >> route; f.close (); for (int i = 0; i < (int) numNodes; i ++) XDrawLine (disp, win, gc, X_new_coord [route [i]], Y_new_coord [route [i]], X_new_coord [route [(i + 1) % numNodes]], Y_new_coord [route [(i + 1) % numNodes]]); } XFlush (disp) ; sleep (1) ; } }