Pipeline graphique
 Tout Structures de données Espaces de nommage Fichiers Fonctions Variables Définitions de type Énumérations Valeurs énumérées Macros
utils.cpp
Aller à la documentation de ce fichier.
1 /*
2  * File: utils.cpp
3  * Author: quartz
4  *
5  * Created on 27 octobre 2014, 22:54
6  */
7 
8 
9 #include "utils.h"
10 
19 float zBaricentrique(Math::coord2d P,FaceteEcran *facette, Sommet *somettransformer)
20 {
21 
23  Math::coord2d V(P.x - facette->som1.x,P.y - facette->som1.y);
24  Math::coord2d V1(facette->som2.x - facette->som1.x, facette->som2.y - facette->som1.y);
25  Math::coord2d V2(facette->som3.x - facette->som1.x, facette->som3.y - facette->som1.y);
26 
27  Math::coord2d V2Ortho(V2.y,-V2.x);
28  Math::coord2d V1Ortho(V1.y,-V1.x);
29 
30 
31  float div_bas = (V1.x * V2Ortho.x + V1.y * V2Ortho.y);
32 
33  if(div_bas == 0) // ON A UN SEGMENT ! changement de fonction
34  {
35  /*float alpha= P.y * facette->som1y;
36  alpha /= facette->som1y* facette->som3y;*/
37 
38  return 5000;
39  //printf("alpha : %f\n",alpha);
40  }
41 
42 
43  float alpha = (V.x * V2Ortho.x + V.y * V2Ortho.y)/div_bas;
44  float beta = (V.x * V1Ortho.x + V.y * V1Ortho.y)/div_bas;
45 
46 
47  if(alpha < 0)
48  alpha *= -1;
49  if(beta < 0)
50  beta *= -1;
51 
53  float s = somettransformer[0].pos.w * somettransformer[2].pos.w * alpha;
54  float temps = somettransformer[1].pos.w * somettransformer[2].pos.w;
55  temps += somettransformer[2].pos.w*(somettransformer[0].pos.w-somettransformer[1].pos.w)*alpha;
56  temps += somettransformer[1].pos.w*(somettransformer[0].pos.w-somettransformer[2].pos.w)*beta;
57  s /= temps;
58  float t = somettransformer[0].pos.w * somettransformer[1].pos.w * beta;
59  temps = somettransformer[1].pos.w * somettransformer[2].pos.w;
60  temps += somettransformer[2].pos.w*(somettransformer[0].pos.w-somettransformer[1].pos.w)*alpha;
61  temps += somettransformer[1].pos.w*(somettransformer[0].pos.w-somettransformer[2].pos.w)*beta;
62  t /= temps;
63 
64 
65 
67  //printf(" z1 %f z2 %f z3 %f\n",somettransformer[0].pos.z,somettransformer[1].pos.z, somettransformer[0].pos.z);
68  return ((1-s-t)* somettransformer[0].pos.z) + (s*somettransformer[1].pos.z) + (t*somettransformer[2].pos.z);
69 }
70 
80 {
81 
83  Math::coord2d V(P.x - facette->som1.x,P.y - facette->som1.y);
84  Math::coord2d V1(facette->som2.x - facette->som1.x, facette->som2.y - facette->som1.y);
85  Math::coord2d V2(facette->som3.x - facette->som1.x, facette->som3.y - facette->som1.y);
86 
87 
88  Math::coord2d V2Ortho(V2.y,-V2.x);
89  Math::coord2d V1Ortho(V1.y,-V1.x);
90 
91 
92  float div_bas = (V1.x * V2Ortho.x + V1.y * V2Ortho.y);
93 
94  if(div_bas == 0) // ON A UN SEGMENT ! changement de fonction
95  {
96  /*float alpha= P.y * facette->som1y;
97  alpha /= facette->som1y* facette->som3y;*/
98 
99  return 5000;
100  //printf("alpha : %f\n",alpha);
101  }
102 
103 
104  float alpha = (V.x * V2Ortho.x + V.y * V2Ortho.y)/div_bas;
105  float beta = (V.x * V1Ortho.x + V.y * V1Ortho.y)/div_bas;
106 
107 
108  if(alpha < 0)
109  alpha *= -1;
110  if(beta < 0)
111  beta *= -1;
112 
114  float s = somettransformer[0].pos.w * somettransformer[2].pos.w * alpha;
115  float temps = somettransformer[1].pos.w * somettransformer[2].pos.w;
116  temps += somettransformer[2].pos.w*(somettransformer[0].pos.w-somettransformer[1].pos.w)*alpha;
117  temps += somettransformer[1].pos.w*(somettransformer[0].pos.w-somettransformer[2].pos.w)*beta;
118  s /= temps;
119  float t = somettransformer[0].pos.w * somettransformer[1].pos.w * beta;
120  temps = somettransformer[1].pos.w * somettransformer[2].pos.w;
121  temps += somettransformer[2].pos.w*(somettransformer[0].pos.w-somettransformer[1].pos.w)*alpha;
122  temps += somettransformer[1].pos.w*(somettransformer[0].pos.w-somettransformer[2].pos.w)*beta;
123  t /= temps;
124 
125 
127  Math::vecteur3d result;
128  //printf(" z1 %f z2 %f z3 %f\n",somettransformer[0].pos.z,somettransformer[1].pos.z, somettransformer[0].pos.z);
129  result.x = ((1-s-t)* somettransformer[0].norm.x) + (s*somettransformer[1].norm.x) + (t*somettransformer[2].norm.x);
130  result.y = ((1-s-t)* somettransformer[0].norm.y) + (s*somettransformer[1].norm.y) + (t*somettransformer[2].norm.y);
131  result.z = ((1-s-t)* somettransformer[0].norm.z) + (s*somettransformer[1].norm.z) + (t*somettransformer[2].norm.z);
132  return result;
133 }
143 {
144 
146  Math::coord2d V(P.x - facette->som1.x,P.y - facette->som1.y);
147  Math::coord2d V1(facette->som2.x - facette->som1.x, facette->som2.y - facette->som1.y);
148  Math::coord2d V2(facette->som3.x - facette->som1.x, facette->som3.y - facette->som1.y);
149 
150  Math::coord2d V2Ortho(V2.y,-V2.x);
151  Math::coord2d V1Ortho(V1.y,-V1.x);
152 
153  float div_bas = (V1.x * V2Ortho.x + V1.y * V2Ortho.y);
154 
155  if(div_bas == 0) // ON A UN SEGMENT ! changement de fonction
156  {
157  /*float alpha= P.y * facette->som1y;
158  alpha /= facette->som1y* facette->som3y;*/
159 
160  return 5000;
161  //printf("alpha : %f\n",alpha);
162  }
163 
164 
165  float alpha = (V.x * V2Ortho.x + V.y * V2Ortho.y)/div_bas;
166  float beta = (V.x * V1Ortho.x + V.y * V1Ortho.y)/div_bas;
167 
168 
169  if(alpha < 0)
170  alpha *= -1;
171  if(beta < 0)
172  beta *= -1;
173 
175  float s = somettransformer[0].pos.w * somettransformer[2].pos.w * alpha;
176  float temps = somettransformer[1].pos.w * somettransformer[2].pos.w;
177  temps += somettransformer[2].pos.w*(somettransformer[0].pos.w-somettransformer[1].pos.w)*alpha;
178  temps += somettransformer[1].pos.w*(somettransformer[0].pos.w-somettransformer[2].pos.w)*beta;
179  s /= temps;
180  float t = somettransformer[0].pos.w * somettransformer[1].pos.w * beta;
181  temps = somettransformer[1].pos.w * somettransformer[2].pos.w;
182  temps += somettransformer[2].pos.w*(somettransformer[0].pos.w-somettransformer[1].pos.w)*alpha;
183  temps += somettransformer[1].pos.w*(somettransformer[0].pos.w-somettransformer[2].pos.w)*beta;
184  t /= temps;
185 
187  Math::vecteur3d result;
188  //printf(" z1 %f z2 %f z3 %f\n",somettransformer[0].pos.z,somettransformer[1].pos.z, somettransformer[0].pos.z);
189  result.x = ((1-s-t)* somettransformer[0].pos_originel.x) + (s*somettransformer[1].pos_originel.x) + (t*somettransformer[2].pos_originel.x);
190  result.y = ((1-s-t)* somettransformer[0].pos_originel.y) + (s*somettransformer[1].pos_originel.y) + (t*somettransformer[2].pos_originel.y);
191  result.z = ((1-s-t)* somettransformer[0].pos_originel.z) + (s*somettransformer[1].pos_originel.z) + (t*somettransformer[2].pos_originel.z);
192  return result;
193 }
202 unsigned int IBaricentrique(Math::coord2d P,FaceteEcran *facette, Sommet *somettransformer)
203 {
204 
206  Math::coord2d V(P.x - facette->som1.x,P.y - facette->som1.y);
207  Math::coord2d V1(facette->som2.x - facette->som1.x, facette->som2.y - facette->som1.y);
208  Math::coord2d V2(facette->som3.x - facette->som1.x, facette->som3.y - facette->som1.y);
209 
210 
211  Math::coord2d V2Ortho(V2.y,-V2.x);
212  Math::coord2d V1Ortho(V1.y,-V1.x);
213 
214  float div_bas = (V1.x * V2Ortho.x + V1.y * V2Ortho.y);
215 
216  if(div_bas == 0) // ON A UN SEGMENT ! changement de fonction
217  {
218  /*float alpha= P.y * facette->som1y;
219  alpha /= facette->som1y* facette->som3y;*/
220 
221  return 255;
222  //printf("alpha : %f\n",alpha);
223  }
224 
225 
226  float alpha = (V.x * V2Ortho.x + V.y * V2Ortho.y)/div_bas;
227  float beta = (V.x * V1Ortho.x + V.y * V1Ortho.y)/div_bas;
228 
229 
230  if(alpha < 0)
231  alpha *= -1;
232  if(beta < 0)
233  beta *= -1;
234 
235 
237  float s = somettransformer[0].pos.w * somettransformer[2].pos.w * alpha;
238  float temps = somettransformer[1].pos.w * somettransformer[2].pos.w;
239  temps += somettransformer[2].pos.w*(somettransformer[0].pos.w-somettransformer[1].pos.w)*alpha;
240  temps += somettransformer[1].pos.w*(somettransformer[0].pos.w-somettransformer[2].pos.w)*beta;
241  s /= temps;
242 
243  float t = somettransformer[0].pos.w * somettransformer[1].pos.w * beta;
244  temps = somettransformer[1].pos.w * somettransformer[2].pos.w;
245  temps += somettransformer[2].pos.w*(somettransformer[0].pos.w-somettransformer[1].pos.w)*alpha;
246  temps += somettransformer[1].pos.w*(somettransformer[0].pos.w-somettransformer[2].pos.w)*beta;
247  t /= temps;
248 
250  //printf(" z1 %f z2 %f z3 %f\n",somettransformer[0].pos.z,somettransformer[1].pos.z, somettransformer[0].pos.z);
251  return ((1-s-t)* somettransformer[0].intensiter) + (s*somettransformer[1].intensiter) + (t*somettransformer[2].intensiter);
252 }
Math::vecteur3d norm
Normale au sommet.
Definition: definition.h:80
Math::vecteur3d pos_originel
Definition: definition.h:78
point som2
Definition: definition.h:29
int x
Definition: definition.h:22
structure pour les vecteurs 3D (de taille 3).
Definition: libMath.h:21
point som3
Definition: definition.h:30
unsigned int IBaricentrique(Math::coord2d P, FaceteEcran *facette, Sommet *somettransformer)
IBaricentrique(Math::coord2d P,FaceteEcran *facette, Sommet *somettransformer) Fonction permetant de ...
Definition: utils.cpp:202
Math::vecteur3d PosBaricentrique(Math::coord2d P, FaceteEcran *facette, Sommet *somettransformer)
PosBaricentrique(Math::coord2d P,FaceteEcran *facette, Sommet *somettransformer) Fonction permetant d...
Definition: utils.cpp:142
float zBaricentrique(Math::coord2d P, FaceteEcran *facette, Sommet *somettransformer)
zBaricentrique(Math::coord2d P,FaceteEcran *facette, Sommet *somettransformer) Fonction permetant de ...
Definition: utils.cpp:19
Math::vecteur4d pos
Coordonnées du sommet.
Definition: definition.h:76
point som1
Definition: definition.h:28
float intensiter
Couleur au sommet.
Definition: definition.h:88
int y
Definition: definition.h:23
Math::vecteur3d NBaricentrique(Math::coord2d P, FaceteEcran *facette, Sommet *somettransformer)
NBaricentrique(Math::coord2d P,FaceteEcran *facette, Sommet *somettransformer) Fonction permetant de ...
Definition: utils.cpp:79