Bonjour à toutes et à tous,
Je me heurte à une erreur de précision lors d'un calcul. Il s'agit de déterminer bêtement si un rayon passe par une case d'un maillage (un maillage est constitué de plusieurs cases).
A l'heure actuelle, pour déterminer si le rayon étudié passe par une case je regarde la position des points extrêmes constituant les diagonales d'un carré pour voir s'ils sont tous du même coté (ou colinéaires) du rayon. J'ai 4 points à tester.
Mon problème vient du fait que lorsque que j'applique la formule ((b.x - a.x)*(c.y - a.y) - (b.y - a.y)*(c.x - a.x)) > 0 (deux points a et b (rayon) à tester contre c (point d'une diagonale)), j'obtiens des erreurs d'arrondi. que je corrige par une recherche près de eps.
J'aimerais pouvoir certifier ce résultat sans avoir à corriger cette erreur d'arrondi. Est-ce possible?
Je précise que je suis sur des contraintes rapides (pas temps réel, mais rapide quand même).
un sample du code que j'utilise actuellement:
Merci par avance pour vos remarques et suggestions.
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 % ((b.x - a.x)*(c.y - a.y) - (b.y - a.y)*(c.x - a.x)) > 0 t1 = (R2(1) - R1(1))*(cells(1:4,2,ilayers(i)) - R1(2)) - (R2(2) - R1(2))*(cells(1:4,1,ilayers(i)) - R1(1)); %find & correct the rounding errors: inds = find(t1> 0 & t1 < (eps + 1e-14)); if(~isempty(inds)) t1(inds) = 0; end %if <0 or >0 lie from one side of the line %if == 0 points are colinear: no interest t1 = sign(t1(t1~=0)); if(sum(t1) ~= size(t1,1) & sum(t1) ~= -size(t1,1)) %intersect once, then the ray pass throught the cell clayers(k) = ilayers(i); k = k+1; end end
Gian
Partager