250 lines
7.5 KiB
C
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);
|
|
} |