aboutsummaryrefslogtreecommitdiffstats
path: root/cube_pc_test1/algoline.c
blob: bf982ffd2728d666df331939805b6ed36b4174b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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... */
                    }
                }
            }
        }
}