aboutsummaryrefslogtreecommitdiffstats
path: root/cube_pc_test1/algoline.c
diff options
context:
space:
mode:
Diffstat (limited to 'cube_pc_test1/algoline.c')
-rw-r--r--cube_pc_test1/algoline.c128
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... */
+ }
+ }
+ }
+ }
+}