Files
percettroni_c/grafico.h

250 lines
7.5 KiB
C

#include <allegro.h>
#include <time.h>
#include <string.h>
typedef struct {
double x;
double y;
} Punto;
// 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(double, double);
void stampa_epoca(int);
void traccia_inputs(Punto, 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 traccia_inputs(Punto punto, int colore) {
int *point = coordinate(punto.x, punto.y);
//printf("Ho generato coordinate: %dx%d", point[0], point[1]);
circlefill(screen, point[0], point[1], 1.5, colore);
}
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 + 30, 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(double x, double 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);
}