diff options
author | vg <vgm+dev@devys.org> | 2020-07-07 16:24:01 +0200 |
---|---|---|
committer | vg <vgm+dev@devys.org> | 2020-07-07 16:24:01 +0200 |
commit | 66dcf910bd4744d8ced56cb9586aa937a1a2d4c5 (patch) | |
tree | df4dca1ae4af1e5df0be0d1f4f2cd0d54751f8e8 /cube_pc_test1/algoline.c | |
download | hic-master.tar.gz hic-master.tar.bz2 hic-master.zip |
Diffstat (limited to 'cube_pc_test1/algoline.c')
-rw-r--r-- | cube_pc_test1/algoline.c | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/cube_pc_test1/algoline.c b/cube_pc_test1/algoline.c new file mode 100644 index 0000000..bf982ff --- /dev/null +++ b/cube_pc_test1/algoline.c @@ -0,0 +1,128 @@ +#include <math.h> +#include <stdio.h> + +#define RADIUS 0.25 + +void draw_line(int Xa, int Ya, int Za, + int Xb, int Yb, int Zb) { + int Xc=0; + int Yc=0; + int Zc=0; + int Xd=0; + int Yd=0; + int Zd=0; + float D=0; + int x=0; + int y=0; + int z=0; + + /* Affectation des valeurs de Xa, Ya, Za, Xb, Yb, et Zb à + Xc, Yc, Zc, Xd, Yd et Zd de telle sorte que cela + corresponde pour les calculs vectoriels. */ + + if ( Xa > Xb) { + Xd=Xa; + Xc=Xb; + } + else { + Xc=Xa; + Xd=Xb; + } + + if ( Ya > Yb) { + Yd=Ya; + Yc=Yb; + } + else { + Yc=Ya; + Yd=Yb; + } + + if ( Za > Zb) { + Zd=Za; + Zc=Zb; + } + else { + Zc=Za; + Zd=Zb; + } + + /* On parcours les diodes en conjuguant les trois boucles for.*/ + + for ( x=Xc ; x<=Xd ; x++) { + for ( y=Yc ; y<=Yd ; y++) { + for ( z=Zc ; z<=Zd ; z++) { + + /* Cette horrible formule calcule la distance de la LED testée + à la droite (AB) ; Désolé, je ne savais pas comment la mettre sur 2 lignes */ + + D=(pow(Zb*y+Yb*Za-Za*y-z*Yb-Zb*Ya+z*Ya,2)+pow(z*Xb-z*Xa+Zb*Xa-x*Zb+x*Za-Xb*Za,2)+pow(x*Yb-x*Ya+Xb*Ya-y*Xb+y*Xa-Yb*Xa,2))/((Xb-Xa)*(Xb-Xa)+(Yb-Ya)*(Yb-Ya)+(Zb-Za)*(Zb-Za)); + if (D <= RADIUS) { /* Cette constante, par défaut à 2.5, représente la largeur et la précision de la droite */ + setvoxel(x,y,z); /* C'était bien ça la fonction pour allumer la LED ? mes souvenirs sont embrouillés... */ + } + } + } + } +} + +void draw_linef(float Xa, float Ya, float Za, + float Xb, float Yb, float Zb) { + int Xc=0; + int Yc=0; + int Zc=0; + int Xd=0; + int Yd=0; + int Zd=0; + float D=0; + float x=0; + float y=0; + float z=0; + + /* Affectation des valeurs de Xa, Ya, Za, Xb, Yb, et Zb à + Xc, Yc, Zc, Xd, Yd et Zd de telle sorte que cela + corresponde pour les calculs vectoriels. */ + + if ( Xa > Xb) { + Xd=Xa; + Xc=Xb; + } + else { + Xc=Xa; + Xd=Xb; + } + + if ( Ya > Yb) { + Yd=Ya; + Yc=Yb; + } + else { + Yc=Ya; + Yd=Yb; + } + + if ( Za > Zb) { + Zd=Za; + Zc=Zb; + } + else { + Zc=Za; + Zd=Zb; + } + + /* On parcours les diodes en conjuguant les trois boucles for.*/ + + for ( x=Xc ; x<=Xd ; x++) { + for ( y=Yc ; y<=Yd ; y++) { + for ( z=Zc ; z<=Zd ; z++) { + + /* Cette horrible formule calcule la distance de la LED testée + à la droite (AB) ; Désolé, je ne savais pas comment la mettre sur 2 lignes */ + + D=(pow(Zb*y+Yb*Za-Za*y-z*Yb-Zb*Ya+z*Ya,2)+pow(z*Xb-z*Xa+Zb*Xa-x*Zb+x*Za-Xb*Za,2)+pow(x*Yb-x*Ya+Xb*Ya-y*Xb+y*Xa-Yb*Xa,2))/((Xb-Xa)*(Xb-Xa)+(Yb-Ya)*(Yb-Ya)+(Zb-Za)*(Zb-Za)); + if (D <= RADIUS) { /* Cette constante, par défaut à 2.5, représente la largeur et la précision de la droite */ + setvoxel(x,y,z); /* C'était bien ça la fonction pour allumer la LED ? mes souvenirs sont embrouillés... */ + } + } + } + } +} |