#include #include #include // Segmento che parte dalle coordinate x,y di "inizio" a quelle di "fine" typedef struct { double m; double q; } Retta; void disegna_assi(); void cls(int, int); void disegna_punti(int); void traccia_retta(double, double, int); int *coordinate(int, int); void stampa_epoca(int); /* void main() { allegro_init(); install_keyboard(); // Installa il gestore della tastiera set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0); cls(); for (int i = 0; i < 1000; i++) { double m = (double)i / 100; cls(); traccia_retta(m,1.5); sleep(0.1); } readkey(); } */ /* Schermo 800x600 Centro 400x300 0,0 - 400,0 - 800,0 0,300 - 400,300 - 800,300 0,600 - 400,600 - 800,600 Ogni punto nel grafico, 100 pixel Range -2, 2 es retta y = mx + q con x=1, m=1, q=1 y = 1 * 1 + 1 = 2 x = 1 y = 2 */ void traccia_retta(double m, double q, int colore) { // determino il centro int center_x = SCREEN_W / 2; // Coordinata x del centro int center_y = SCREEN_H / 2; // Coordinata y del centro // Retta coi valori reali double x_start = -3; double x_end = 3; double y_start = (m * x_start + q); double y_end = (m * x_end + q); line(screen, center_x + (int)(x_start * 100), center_y - (int)(y_start * 100), center_x + (int)(x_end * 100), center_y - (int)(y_end * 100), colore); sleep(0.1); } void disegna_assi() { // determino il centro int center_x = SCREEN_W / 2; // Coordinata x del centro int center_y = SCREEN_H / 2; // Coordinata y del centro // Colore delle linee int colore_nero = makecol(0, 0, 0); // Disegna gli assi line(screen, center_x, 0, center_x, SCREEN_H - 1, colore_nero); line(screen, 0, center_y, SCREEN_W - 1, center_y, colore_nero); // Zero nel punto di intersezione textout_ex(screen, font, "0", center_x - 10, center_y + 5, colore_nero, -1); } void disegna_legenda(int multi_layer) { int colore_rosso = makecol(255, 0, 0); int colore_verde = makecol(0, 255, 0); int colore_blu = makecol(0, 0, 255); if(multi_layer == 0) textout_ex(screen, font, "Percettrone", 0 + 10, 0 + 10, colore_rosso, -1); else { textout_ex(screen, font, "Percettrone 1", 0 + 10, 0 + 10, colore_rosso, -1); //textout_ex(screen, font, "Percettrone 2", 0 + 10, 0 + 20, colore_verde, -1); textout_ex(screen, font, "Percettrone out", 0 + 10, 0 + 20, colore_blu, -1); } } void stampa_epoca(int epoca) { int colore_rosso = makecol(255, 0, 0); char stringa[4]; sprintf(stringa, "%d", epoca); textout_ex(screen, font, stringa, SCREEN_W - 50, 0 + 20, colore_rosso, -1); } /* il tipo indica quali punti vogliamo disegnare nel grafico: 0: AND 1: OR 2: XOR 3: NAND 4: NOR 5: XNOR */ void cls(int tipo, int multi_layer) { clear_to_color(screen, makecol(255, 255, 255)); // Sfondo bianco disegna_assi(); disegna_punti(tipo); disegna_legenda(multi_layer); } void disegna_punti(int tipo) { int raggio = 3; int colore_verde = makecol(0, 255, 0); int colore_rosso = makecol(255, 0, 0); int colore_nero = makecol(0, 0, 0); textout_ex(screen, font, "Epoca:", SCREEN_W - 100, 0 + 20, colore_rosso, -1); switch (tipo) { case 0: //AND int *punto = coordinate(0, 0); circlefill(screen, punto[0], punto[1], raggio, colore_rosso); punto = coordinate(0, 1); circlefill(screen, punto[0], punto[1], raggio, colore_rosso); punto = coordinate(1, 0); circlefill(screen, punto[0], punto[1], raggio, colore_rosso); punto = coordinate(1, 1); circlefill(screen, punto[0], punto[1], raggio, colore_verde); textout_ex(screen, font, "AND", SCREEN_W - 50, 0 + 10, colore_nero, -1); break; case 1: //OR punto = coordinate(0, 0); circlefill(screen, punto[0], punto[1], raggio, colore_rosso); punto = coordinate(0, 1); circlefill(screen, punto[0], punto[1], raggio, colore_verde); punto = coordinate(1, 0); circlefill(screen, punto[0], punto[1], raggio, colore_verde); punto = coordinate(1, 1); circlefill(screen, punto[0], punto[1], raggio, colore_verde); textout_ex(screen, font, "OR", SCREEN_W - 50, 0 + 10, colore_nero, -1); break; case 2: //XOR punto = coordinate(0, 0); circlefill(screen, punto[0], punto[1], raggio, colore_rosso); punto = coordinate(0, 1); circlefill(screen, punto[0], punto[1], raggio, colore_verde); punto = coordinate(1, 0); circlefill(screen, punto[0], punto[1], raggio, colore_verde); punto = coordinate(1, 1); circlefill(screen, punto[0], punto[1], raggio, colore_rosso); textout_ex(screen, font, "XOR", SCREEN_W - 50, 0 + 10, colore_nero, -1); break; case 3: //NAND punto = coordinate(0, 0); circlefill(screen, punto[0], punto[1], raggio, colore_verde); punto = coordinate(0, 1); circlefill(screen, punto[0], punto[1], raggio, colore_verde); punto = coordinate(1, 0); circlefill(screen, punto[0], punto[1], raggio, colore_verde); punto = coordinate(1, 1); circlefill(screen, punto[0], punto[1], raggio, colore_rosso); textout_ex(screen, font, "NAND", SCREEN_W - 50, 0 + 10, colore_nero, -1); break; case 4: //NOR punto = coordinate(0, 0); circlefill(screen, punto[0], punto[1], raggio, colore_verde); punto = coordinate(0, 1); circlefill(screen, punto[0], punto[1], raggio, colore_rosso); punto = coordinate(1, 0); circlefill(screen, punto[0], punto[1], raggio, colore_rosso); punto = coordinate(1, 1); circlefill(screen, punto[0], punto[1], raggio, colore_rosso); textout_ex(screen, font, "NOR", SCREEN_W - 50, 0 + 10, colore_nero, -1); break; case 5: //XNOR punto = coordinate(0, 0); circlefill(screen, punto[0], punto[1], raggio, colore_verde); punto = coordinate(0, 1); circlefill(screen, punto[0], punto[1], raggio, colore_rosso); punto = coordinate(1, 0); circlefill(screen, punto[0], punto[1], raggio, colore_rosso); punto = coordinate(1, 1); circlefill(screen, punto[0], punto[1], raggio, colore_verde); textout_ex(screen, font, "XNOR", SCREEN_W - 50, 0 + 10, colore_nero, -1); break; default: break; } } // Mi da le coordinate in pixel dati i punti in ingresso int *coordinate(int x, int y) { // determino il centro int center_x = SCREEN_W / 2; // Coordinata x del centro int center_y = SCREEN_H / 2; // Coordinata y del centro int *coordinate = (int *)malloc(sizeof(int) * 2); coordinate[0] = center_x + (x * 100); coordinate[1] = center_y - (y * 100); return coordinate; } void sleep_ms(int milliseconds) { struct timespec ts; ts.tv_sec = milliseconds / 1000; ts.tv_nsec = (milliseconds % 1000) * 1000000; nanosleep(&ts, NULL); }