bonjour,
j'écris un petit programme où 2 cylindres se promènent dans l'espace, mais je suis bloqué par un problème de géométrie.
J'aimerai connaitre la distance minimum entre les 2 axes (des 2 cylindres)...
j'ai pas mal fouillé et on trouve facilement distance d'un point à une droite, distance entre 2 droites mais pas distance entre 2 segments.
la formule de distance entre 2 droites n'est pas applicable. En effet soient 2 segments dans (O,x,y) :
le 1er : entre (0,0) et (0,1)
le 2nd : entre (1,0) et (6,0)
la formule de distance de droite donne 0 (comme par hasard...) alors que la distance minimale entre ces 2 segments est 1.
alors, comment calculer la distance (dans l'espace) entre 2 segments ?
merci d'avance.
je suis en train d'essayer un truc, mais je suis pas sûr que se soit correct.
soit [A;B] et [C;D] mes 2 segments, I le milieu de [A;B] et J le milieu de [C;D]
je calcule les distances de "sommets" :|AC|, |AD|, |BC|, |BD|
plus la distances des milieux |IJ|
si une distance des sommets est inférieure à celle des milieux, je prend le Min
sinon, j'applique la formule des distances entre 2 droites : c'est correct ?
Bonjour,
Je suis confronté au même problème, avez vous trouvé une solution?
Si oui est elle extensible en 3D?
Cordialement
En dimension quelconque n > 0 .
Tu as donc a, b , u , v 4 points de n et tu cherches la distance d (euclidienne je suppose) entre les segments S := [a , b] et T := [u , v] .
Par définition c'est Inf{ d(x,y) | (x,y) S
T} .
Tu as S = { s.b + (1 - s).a | 0 s
1 } et T = { t.u + (1 - t).v | 0
t
1 } .
(d(s.b + (1 - s).a , t.u + (1 - t).v))² = 1n (s.bj + (1 - s).aj - t.uj - (1 - t).vj)² = f(s,t) (c'est polynômial de degré 2 en s et t .
Il s'agit alors de trouver Inf {f(s,t) | (s,t) [0 , 1]² }
Merci pour ta réponse si rapide kybjm,
Mais est ce qu'il n'existerait pas une solution moins "brute" que celle que tu présentes.
En effet, mon problème c'est que j'ai un nombre n de segments(ou plutot domaine en 3D) evoluant dans l'espace au cours du temps, et je voudrais savoir si un ou plusieurs segments vont se rencontrer.
Le tout devra etre implementé dans un algorithme donc je cherche la manière la plus efficace et rapide pour trouver une solution.
Bonjour Dam29,
Essaye ceci :
Première droite AB ==> vecteur AB
Deuxième doite CD ==> vecteur CD
Ajoute le vecteur AC qui joint les deux droites
==>
(1) le volume du parallélépipède engendré par 3 vecteurs non coplanaires se calcule grâce au produit mixte des trois vecteurs :
= Dét (AB, AC, CD)
(2) le module du produit vectoriel (AB x CD) donne l'aire de la base
(3) volume / aire base = hauteur = distance minimale
A+
Sorry,
en relisant bien...tu connais la distance entre deux droites... c'est strictement entre deux segments qui t'intéresse ==> je regarderai ce soir...
A+
Bonjour,
Ceci n'est qu'une proposition intuitive...
En reprenant les notations de kybjm :
Segment ab ==> point courant S = { s.b + (1 - s).a | 0 <= s <= 1 }
Segment uv ==> point courant T = { t.u + (1 - t).v | 0 <= t <= 1 }
C'est la distance ST qu'il faut minimiser.
Elle est donnée par
f(s,t) = (s.bx + (1 - s).ax - t.ux - (1 - t).vx)² +(s.by + (1 - s).ay - t.uy - (1 - t).vy)² + (s.bz + (1 - s).az - t.uz - (1 - t).vz)²
df/ds = 0
df/dt = 0
te donnent un système de deux équations à deux inconnues (s et t)
dont la solution te donnera des valeurs de s et t en fonction des coordonnées des extrémités des segments.
si leur valeur est en dehors de [0;1], tu prends l'extrémité la plus proche...
et finalement tu calcules la distance
A+
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :