Bonjour ,
Ici mon code pour ayant pour objectif de gérer l'intersection d'une droite qui se propage à l'intérieur d'un cylindre dont l'axe est z . Je vous laisse le soin de le lire avec les commentaires. Puis , trouver ma question par la suite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 %%la fonction qui gère les reflexions function [toucher,t0]= verif_ray_cylindre_intersection(ydep,rayon,longueur) %% Ray position and orientation (Space xyz) x0 = ydep(1); y0 = ydep(2); z0 = ydep(3); % coordonnées position de départ kx = ydep(4); ky = ydep(5); kz = ydep(6); % composantes de mon vecteur directeur toucher =false; t0 = -1; % initialisation du toucher à faux et t0 à -1 % Ma droite a comme équation y= ydep(1:3) + ydep(4:6) * t valable pour x , y et z et mon cylindre a comme équation x^2+y^2=r^2 ; 0=< z =< longueur. trouver l'intersection revient à résoudre une équation de second degré , donc discriminant et deux solutions si le discriminant est positif ... deltap= (kx*x0+ky*y0)^2-(kx^2+ky^2)*(x0^2+y0^2-rayon^2); %discriminant-prime if deltap >= 0 deltap = sqrt(deltap); %racine carrée du discriminant-prime t0partiel = -(kx*x0+ky*y0); t1 = (t0partiel-deltap) / (kx^2+ky^2); % premier t t2 = (t0partiel+deltap) / (kx^2+ky^2); % deuxième t if kz*t1 > 0 % pour se propager dans le sens z positif t0=t1; elseif kz*t2 > 0 % sinon t2 t0=t2; end end if ( t0 >= 0 && longueur >= kz*t0+z0 && kz*t0+z0 >= 0), toucher=true; end% il faut pas que ma droite ( rayon ) déborde des deux limites inf et sup de mon cylindre
Problème : mon code me donne des valeurs de t de l'ordre de 1e-17 , ce qui empêche mon rayon de se propager correctement . Comment faire pour y remédier dans le code de facon mathématique sans magouiller ?
Je vous remercie d'avance.
Partager