website logo
Auteur
avatar
Fab

Forum » » Création-Développement » » Question math 3D


Posté : 05-09-2013 12:34 icone du post

Citation : thellier?

Mais y reste toujours un problème x n'a plus de signe alors que x peut être négatif si il se trouve "devant" A
Evidemment on peut calculer les distance AH et BH et AB et comparer et déterminer si il se trouve "devant" A ... mais que de calculs.... Y doit y avoir plus simple
Personne connais un prof de math ??? ;-P

Alain
?


Cette façon de calculer la distance du point par rapport à A est un peu longue, mais elle a le mérite de la démontrer (simplement).

En fait, en utilisant le produit vectoriel, on arrive à un résultat plus rapidement utilisable : soit la droite d passant par A et B, et V un point quelconque de l'espace, alors la distance h de V à la droite d est h = norme(AV ^ AB)?/ norme(AB). (on passera sur la représentation vectorielle difficile à faire passer sur un forum :)).
Après, pour avoir ce fameux x en valeur absolue que tu cherches, il suffit d'utiliser pythagore, soit |x| = sqrt( norme(AV)? - h?)

Après que ce soit avec ce résultat ou celui du document précédemment cité, il va de soi qu'il n'a pas de signe puisque c'est une distance. Alors pour savoir si le signe de x est positif ou négatif, il suffit de calculer le produit scalaire AV . AB : si le produit scalaire est positif, AV et AB sont dans le même sens, ce qui signifie que H est entre A et B (ou plus loin que B, éventuellement); si il est négatif, alors AV et AB sont de sens contraire, et donc A est situé entre B et H.

Pour rappel :
produit scalaire de deux vecteurs u(u1, u2, u3) et v(v1, v2, v3) : u.v = u1*v1 + u2*v2 + u3*v3
produit vectoriel de deux vecteurs u(u1, u2, u3) et v(v1, v2, v3) : u^v = (u2*v3 - u3*v2, u3*v1 - u1*v3, u1*v2 - u2*v1)
norme du vecteur AB avec A(x, y, z) et B(x',y',z') = sqrt( (x'-x)? + (y'-y)? + (z'-z)? )

Donc en pratique, et pour essayer d'économiser quelques opérations inutiles (on peut sans doute faire mieux de côté), ça devrait donner :

AV = (V.x - A.x, V.y - A.y, V.z - A.z), qu'on remplacera par AV de coordonnées (u1, u2, u3)
AB = (B.x - A.x, B.y - A.y, B.z - A.z), qu'on remplacera par AB de coordonnées (v1, v2, v3)

AV ^ AB = (u2*v3 - u3*v2, u3*v1 - u1*v3, u1*v2 - u2*v1) = (p1, p2, p3)

D'après la formule de la distance d'un point à une droite, on a donc h? = || AV ^ AB || ? / ||?AB || ? = (p1? + p2? + p3?) / (v1? + v2? + v3?)

Soit |x| = sqrt( u1?+ u2? + u3? - h?)
et signe(x) = signe ( u1*v1 + u2*v2 + u3*v3 )

Voilà (en espérant ne pas m'être planté dans les calculs (mais sur le principe c'est bon)... :)

Message édité par : Fab / 05-09-2013 13:14
Message édité par : Fab / 05-09-2013 13:30

Cet article provient de Le site des utilisateurs francophones actuels et futurs d'AmigaOS 4.x
https://amiga-ng.org/viewtopic.php?topic=1651&forum=14