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
| double ScannerObject::Witdh_TriLinearInterpolation(FLPT3D Orig, FLPT3D Fin)
{
double dist_max = sqrt( (Fin[0] - Orig[0])*(Fin[0] - Orig[0]) +
(Fin[1] - Orig[1])*(Fin[1] - Orig[1]) +
(Fin[2] - Orig[2])*(Fin[2] - Orig[2]) );
Fin [0] /= mm_x;
Fin [1] /= mm_y;
Fin [2] /= mm_z;
Orig [0] /= mm_x;
Orig [1] /= mm_y;
Orig [2] /= mm_z;
FLPT3D V = Fin - Orig;
V = V.normalize();
// Calcul du pas qui doit s'adapter à l'angle de la droite dirigée selon V
// On compare par rapport à la droite la plus courte : perpendiculaire à l'image 2D, passant par le milieu de l'image 2D (SOi)
// -> ----> -> ---->
// Le pas doit être pas = T / V . V_ref/||V . V_ref||
Vector V_bis(V[0],V[1],V[2]);
float mags = (float)(V_bis.squared_magnitude() * vect_ref.squared_magnitude());
float dot = (float)(dot_product(V_bis, vect_ref));
float cos_angle = dot/sqrt(mags);
float pas;
// T = pas d'achantillonnage de la droite de pente nulle et dont le point de projection est le milieu de l'image 2D
if(cos_angle != 0)
pas = T/ABS(cos_angle);
else
return 0;
float x, y, z;
double current_dist = 0;
double accu = 0;
while(current_dist < dist_max)
{
x = (float) (Orig[0] + current_dist*V[0]);
y = (float) (Orig[1] + current_dist*V[1]);
z = (float) (Orig[2] + current_dist*V[2]);
accu += ImageTrilinearInterpolation(Data, x, y, z, wx_data, wy_data, wz_data)*pas;
current_dist += pas;
}
return accu;
} |
Partager