Curlygoth Posté(e) le 20 mai 2021 Posté(e) le 20 mai 2021 Bonjour à vous amis mathématiciens, Suite à ce Topic (Calcul d'un point pour 4 connus) Je souhaite rechercher le Z du Point P (qui est bien à l'intérieur du trinagle) Je connais : Les coordonnées X, Y, Z des 3 coins du triangle Les distances : d1 = Distance2D point P à 1 d2 = Distance2D point P à 2 d3 = Distance2D point P à 3 et tous les angles qu'on peut calculer ce qui donne une face 3D du maillage enfin bref... Comment calculez le Z du point P tout en connaissant son X et son Y ? (en dessin je trouve la valeur d'environ Z = 15.34) pour aider : Mon site Web (en cours de construction) : Site DA-CODE de @didier
CTZen Posté(e) le 20 mai 2021 Posté(e) le 20 mai 2021 Hmmmm Les maths c'est plus trop mon truc ... mais si tu fais une moyenne pondérée des Z de chaque sommet avec comme coeficient leur distance par rapport au point cherché ? Genre Zp = ((Z1*dP1)+(Z2*dP2)+(Z3*Dp3)) / (dP1 + Dp2 + Dp3) EDIT : Ouai non faut vraiment que j'arrete les maths ... ça fonctionne pas du tout mdr AutoCAD Map 3D 2025 Covadis 18.3c + AutoPiste Windows 11 Famille v.24H2 - 64 bits Toujours à l'affût des bonnes astuces
CTZen Posté(e) le 20 mai 2021 Posté(e) le 20 mai 2021 Sinon ... mais j'ai la flemme de faire le calcul : Pt1 = A Pt2 = B Pt3 = C Tu calcules un point D en XYZ sur l'une des droites de ton triangle, on va dire (BC) pour l'exemple, qui est déterminé par l'intersection de la droite (AP) et (BC). Et ensuite ... et bien en calculant la différence de Z entre les points A et D de la droite (AD), tu trouveras facilement le Z de P (qui du coup appartient à la droite (AD) et dont tu connais les distance AP, et DP ! AutoCAD Map 3D 2025 Covadis 18.3c + AutoPiste Windows 11 Famille v.24H2 - 64 bits Toujours à l'affût des bonnes astuces
Curlygoth Posté(e) le 20 mai 2021 Auteur Posté(e) le 20 mai 2021 marche pas car la grande distance a un coef plus elevé alors que le point y est le plus éloigner ! et quand tu fais l'inverse pour avoir le pourcentage inverse tu obtiens 2.... On parle en 3D la ^^ Mon site Web (en cours de construction) : Site DA-CODE de @didier
Curlygoth Posté(e) le 20 mai 2021 Auteur Posté(e) le 20 mai 2021 j'ai toutes les equations des chaque ligne du traingle mais je peux pas avoir la formule d'un point en rapport avec mon point P car je ne connais pas son Z ^^ Mon site Web (en cours de construction) : Site DA-CODE de @didier
CTZen Posté(e) le 20 mai 2021 Posté(e) le 20 mai 2021 Pas besoin de savoir son Z En gros le calcul se passe d'abord en 2D. Tu cherches la position du point D (X;Y)sur le segment [BC] grâce aux coordonnées (X;Y) des points A et P. Une fois que tu as les coordonnées (X;Y) de D, tu calcules sont Z (le Z du point D hein bien entendu) grâce aux Z des points B et C et la distance BD ou CD. Tu peux aussi avoir de ce fait la distance 2D des segments [DP] et [AP]. Du coup ensuite bah tu connais Z(D) et Z(A)comme et les distances DP et AP, un calcul d'un Z interpolé sur une droite connue. Z(P) = ((Z(D) - Z(A))/L(AD) * L(AP)) AutoCAD Map 3D 2025 Covadis 18.3c + AutoPiste Windows 11 Famille v.24H2 - 64 bits Toujours à l'affût des bonnes astuces
Curlygoth Posté(e) le 20 mai 2021 Auteur Posté(e) le 20 mai 2021 Oki merci je vais essayer ça 😉 mais ton point D tu le mets ou dans l'image ? Car deux perpendiculaire d'une droite ok mais du coup je suis sur un plan oblique Mon site Web (en cours de construction) : Site DA-CODE de @didier
didier Posté(e) le 20 mai 2021 Posté(e) le 20 mai 2021 Bonjour @Curlygoth Méthode avec fonction native définir scu par les trois points du triangle et ensuite utiliser la fonction TRANS paramètres 1 et 0 sur la paire (x y) du point cherché Je suis en train de chercher ce que j'avais fait avec une solution analytique, mais je ne retrouve rien sur ce disque ! Comment ai-je bien pu nommer cette routine d'il y a dix ans ...??? (normale du plan puis produit scalaire de mémoire, mais pas sûr du tout de ma mémoire, j'en avais bavé) Amicalement Éternel débutant… Mon site perso : Programmer dans AutoCAD
bonuscad Posté(e) le 20 mai 2021 Posté(e) le 20 mai 2021 Une procédure en lisp pour interpoler le z d'un point quelconque avec un plan défini par 3 points, le point peut être situé dans ou en dehors du triangle. ((lambda ( / pt lst_pt n X1 X2 X3 Y1 Y2 Y3 Z1 Z2 Z3 E1 E2 E3 E4 Z) (repeat 3 (initget 9) (if lst_pt (setq pt (getpoint pt "\nPoint suivant: ")) (setq pt (getpoint "\nPremier point: ")) ) (setq lst_pt (cons pt lst_pt)) ) (initget 9) (setq pt (getpoint "\nDonnez le point à interpoler: ") n 0) (foreach item '(("X" . "'car") ("Y" . "'cadr") ("Z" . "'caddr")) (mapcar '(lambda (x) (set (read (strcat (car item) (itoa (setq n (1+ n))))) x)) (mapcar (eval (read (cdr item))) lst_pt) ) (setq n 0) ) (setq E1 (+ (* X1 (- Y2 Y3)) (* X2 (- Y3 Y1)) (* X3 (- Y1 Y2))) E2 (+ (* Y1 (- Z2 Z3)) (* Y2 (- Z3 Z1)) (* Y3 (- Z1 Z2))) E3 (+ (* Z1 (- X2 X3)) (* Z2 (- X3 X1)) (* Z3 (- X1 X2))) E4 (- (- (* E2 X1)) (* E3 Y1) (* E1 Z1)) Z (- (- (* (/ E2 E1) (car pt))) (* (/ E3 E1) (cadr pt)) (/ E4 E1)) ) (command "_.point" "_none" (list (car pt) (cadr pt) Z)) (print (rtos Z)) (prin1) )) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Curlygoth Posté(e) le 20 mai 2021 Auteur Posté(e) le 20 mai 2021 Alors ok et merci bonusCad tu pourrais traduire du coup ? 😉 Mon site Web (en cours de construction) : Site DA-CODE de @didier
bonuscad Posté(e) le 20 mai 2021 Posté(e) le 20 mai 2021 Traduire ?! toute la formule est là (setq E1 (+ (* X1 (- Y2 Y3)) (* X2 (- Y3 Y1)) (* X3 (- Y1 Y2))) E2 (+ (* Y1 (- Z2 Z3)) (* Y2 (- Z3 Z1)) (* Y3 (- Z1 Z2))) E3 (+ (* Z1 (- X2 X3)) (* Z2 (- X3 X1)) (* Z3 (- X1 X2))) E4 (- (- (* E2 X1)) (* E3 Y1) (* E1 Z1)) Z (- (- (* (/ E2 E1) (car pt))) (* (/ E3 E1) (cadr pt)) (/ E4 E1)) ) donc 4 variable E1 à E4 calculées avec le XYZ des 3 points X1 Y1 Z1 ,...., qui au final donne le Z du point cliqué: (car pt) et (cadr pt) étant le X Y de ce point avec Z recherché! 1 Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
didier Posté(e) le 20 mai 2021 Posté(e) le 20 mai 2021 Bonjour @Curlygoth J'ai retrouvé la formule, je te prépare un truc en VBA Amicalement Éternel débutant… Mon site perso : Programmer dans AutoCAD
Curlygoth Posté(e) le 20 mai 2021 Auteur Posté(e) le 20 mai 2021 Ouf t'en fais pas va xD, il me faut juste la formule que je vais faire en fonction @bonuscad j'ai du mal à lire le lisp désolé Mon site Web (en cours de construction) : Site DA-CODE de @didier
didier Posté(e) le 20 mai 2021 Posté(e) le 20 mai 2021 OK, J'avais compris (tu l'as écrit je crois) que tu aimais math et trigo on est en plein dedans et on s'amuse... calcul du vecteur normal du plan défini par les trois sommets (produit vectoriel) depuis le vecteur normal et un vecteur quelconque du plan avec le produit scalaire on obtient l'équation du plan x4 et y4 sont les coordonnées 2D du point cherché et z4 = (x1*xn + y1*yn + z1*zn – x4*xn – y4*yn) / zn (xn yn zn) étant le vecteur normal Je vais préparer le truc en VBA et je le mettrai sans doute en exemple sur mon site, histoire que tout le monde en profite. Amicalement PS : j'ai toujours autant de mal à te lire avec les xD 1 Éternel débutant… Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 20 mai 2021 Posté(e) le 20 mai 2021 Bravo à tous ceux qui avancent des réponses ! Personnellement je n'ai pas compris l’énoncé. Le Z du point P, c'est par rapport au plan défini par les points 1, 2 et 3 (qui appartiennent au plan XY du SCG) ? ou c'est le Z de P dans le SCG les points 1, 2 et 3 étant des points 3D quelconques ? Comment connait-on les coordonnées X et Y de P ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Curlygoth Posté(e) le 20 mai 2021 Auteur Posté(e) le 20 mai 2021 Quote Personnellement je n'ai pas compris l’énoncé. Je résume : on a un triangle avec 3 points : (ça c'est facile) Ces 3 points on des coordonnées XYZ connu (pour l'instant ça va) et doinc comme tu le dis : un plan défini par ces 3 point Maintennant, je recherche uniquement le Z du point P (dans le repère du SCU général) qui est sur le plan ! et on connait le XY de P car il faut que je fixe une limite sur le point P sinon c'est isoluble ^^ EDIT : Pendant que @didier calcul, Moi je traduis le lisp de @bonuscad et donc si je comprend bien E1 (+ (* X1 (- Y2 Y3)) (* X2 (- Y3 Y1)) (* X3 (- Y1 Y2))) E1 = X1*(Y2-Y3) + X2*(Y3-Y1) + X3*(Y1-Y2) c'est ça ? EDIT2 : écris trop vite j'ai pas dû si bien traduire E1 (+ (* X1 (- Y2 Y3)) (* X2 (- Y3 Y1)) (* X3 (- Y1 Y2))) E2 (+ (* Y1 (- Z2 Z3)) (* Y2 (- Z3 Z1)) (* Y3 (- Z1 Z2))) E3 (+ (* Z1 (- X2 X3)) (* Z2 (- X3 X1)) (* Z3 (- X1 X2))) E4 (- (- (* E2 X1)) (* E3 Y1) (* E1 Z1)) Z (- (- (* (/ E2 E1) (car pt))) (* (/ E3 E1) (cadr pt)) (/ E4 E1)) E1 = Pa(x) * (Pb(y) - Pc(y)) + Pb(x) * (Pc(y) - Pa(y)) + (Pc(x) * (Pa(y) - Pb(y))) E2 = Pa(y) * (Pb(Z) - Pc(Z)) + Pb(y) * (Pc(Z) - Pa(Z)) + (Pc(y) * (Pa(Z) - Pb(Z))) E3 = Pa(Z) * (Pb(x) - Pc(x)) + Pb(Z) * (Pc(x) - Pa(x)) + (Pc(Z) * (Pa(x) - Pb(x))) E4 = -E2 * Pa(x) - E3 * Pa(x) - E1 * Pa(Z) Z = E2 / E1 * p(x) - (E3 / E1) * p(y) - (E4 / E1) EDIT3 : Bon ça a l'air de marcher avec la formule de @didier je teste ça au boulot demain Mon site Web (en cours de construction) : Site DA-CODE de @didier
(gile) Posté(e) le 20 mai 2021 Posté(e) le 20 mai 2021 Désolé, je ne comprends toujours pas. Si on connait les distances de P à chacun de ces points (d1, d2 et d3), il n'y a que deux points P possibles (un de chaque côté du plan défini par 1, 2 et 3) ou un seul si P appartient au plan. Ces points sont les intersections des 3 sphères de centres 1, 2 et 3 et respectivement de rayons d1, d2 et d3. Je ne vois pas ce que les coordonnées X et Y de P ont à voir là dedans ni comment elles peuvent être connues si Z est inconnue. Peut-être que si tu fournissais un petit dessin... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Curlygoth Posté(e) le 20 mai 2021 Auteur Posté(e) le 20 mai 2021 dessin au premier post Quote un seul si P appartient au plan c'est ça ! il faut juste le Z ^^ Quote Je ne vois pas ce que les coordonnées X et Y de P ont à voir là dedans ben si justement l'idée c'est que quand je deplace ma souris je puisse avoir Z de mon curseur en fonction de points que j'ai autour Quote Si on connait les distances de P à chacun de ces points (d1, d2 et d3) Mon erreur est peut etre de vous avoir diriger vers une mauvaise solutions ! car d1 d2 d3 sont des distances en plan (vue de dessus) vu qu'il me manque se foutu Z XD edit : mais ok demain je donnerais le dwg de mes 3 points ^^ Mon site Web (en cours de construction) : Site DA-CODE de @didier
(gile) Posté(e) le 20 mai 2021 Posté(e) le 20 mai 2021 Je pense que j'ai (enfin) compris. Il s'agirait de la coordonnée Z de la projection verticale du point P sur le plan. Si c'est bien ça, il te faut calculer le vecteur normal du plan, autrement dit le produit vectoriel (cross product) du vecteur de p1 à p2 et du vecteur de p1 à p3. Ensuite, la division du produit scalaire (dot product) du vecteur normal et du vecteur de p à p1 par le produit scalaire du vecteur normal et du vecteur (0, 0, 1) devrait te renvoyer la coordonnée Z. Pseudo code : normal = CrossProduct(Vector(p1, p2), Vector(p1, p3)) Z = DotProduct(normal, Vector(p, p1)) / DotProduct(normal, (0, 0, 1)) En VB.NET, ça donnerait ça : Dim normal As Vector3d = p1.GetVectorTo(p2).CrossProduct(p1.GetVectorTo(p3)) Dim z As Double = normal.DotProduct(p.GetVectorTo(p1)) / normal.DotProduct(New Vector3d(0.0, 0.0, 1.0)) En VBA, il va falloir créer une classe Vector3d avec les méthodes CrossProduct et DotProduct ou faire des équivalents avec des Variants (three-element array of doubles). C'est en partie pour ça que je n'aime pas le VBA AutoCAD, il ne fournit ni objets de type point et vecteur comme on a en .NET, ni de fonctions de traitement des Variants (three-element array of doubles) utilisés pour les points comme on a des fonctions de traitement des listes en LISP. Ce qui me semble une grosse lacune pour un logiciel de DAO. 2 Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 21 mai 2021 Posté(e) le 21 mai 2021 En VBA, ça devrait être quelque chose comme ça: Function Vector(pt1 As Variant, pt2 As Variant) As Variant Dim result(0 To 2) As Double result(0) = pt2(0) - pt1(0) result(1) = pt2(1) - pt1(1) result(2) = pt2(2) - pt1(2) Vector = result End Function Function DotProduct(v1 As Variant, v2 As Variant) As Double DotProduct = v1(0) * v2(0) + v1(1) * v2(1) + v1(2) * v2(2) End Function Function CrossProduct(v1 As Variant, v2 As Variant) As Variant Dim result(0 To 2) As Double result(0) = v1(1) * v2(2) - v1(2) * v2(1) result(1) = v1(2) * v2(0) - v1(0) * v2(2) result(2) = v1(0) * v2(1) - v1(1) * v2(0) CrossProduct = result End Function Function CoordZ(pt1 As Variant, pt2 As Variant, pt3 As Variant, pt As Variant) As Double Dim norm(0 To 2) As double norm = CrossProduct(vect(pt1, pt2), vect(pt1, pt3)) Dim zAxis(0 To 2) As Double zAxis(2) = 1.0 CoordZ = DotProduct(norm, Vector(pt, pt1) / DotProduct(norm, zAxis) End Function 1 Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Curlygoth Posté(e) le 21 mai 2021 Auteur Posté(e) le 21 mai 2021 Merci Giles pour ces précisions ! Mais en VBA je fais ça plus simple : juste une fonction qui calcule la normale Une autre qui me calcul le z Édit : oui ce que tu a fais mais avec boucle Mon site Web (en cours de construction) : Site DA-CODE de @didier
(gile) Posté(e) le 21 mai 2021 Posté(e) le 21 mai 2021 16 minutes ago, Curlygoth said: Mais en VBA je fais ça plus simple : juste une fonction qui calcule la normale Une autre qui me calcul le z À ta guise, mais le jour où tu auras à nouveau besoin de définir des vecteurs ou de calculer un produit vectoriel ou scalaire, tu devras tout refaire... Personnellement, si je faisait du VBA (qui sans être réellement 'orienté objet' est quand même 'basé objet') j'aurais des classes Point3d, Vector3d et Matrix3d avec des propriétés et des méthodes pour les calculs géométriques qui permettraient d'écrire du code directement explicite (CF le code VB .NET plus haut). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Curlygoth Posté(e) le 21 mai 2021 Auteur Posté(e) le 21 mai 2021 C'est pas faux ! Je vais pousser le truc de mon côté ! Il existe quand-même le transformby que j'utilise lors de mes changements de repère Mon site Web (en cours de construction) : Site DA-CODE de @didier
(gile) Posté(e) le 21 mai 2021 Posté(e) le 21 mai 2021 Une autre méthode en utilisant TranslateCoordinates comme suggéré par @didier dans sa première réponse. On convertit le point P du SCG vers le SCO du plan du triangle, puis on met sa coordonnées Z à 0.0 dans ce système de coordonnées, et enfin on re-convertit le point P dans le SCG pour récupérer sa coordonnée Z. Function CoordZ(pt1 As Variant, pt2 As Variant, pt3 As Variant, pt As Variant) As Double Dim norm(0 To 2) As double norm = CrossProduct(vect(pt1, pt2), vect(pt1, pt3)) pt = ThisDrawing.Utility.TranslateCoordinates(pt, acWorld, acOcs, False, norm) pt(2) = 0.0 pt = ThisDrawing.Utility.TranslateCoordinates(pt, acOcs, acWorld, False, norm) CoordZ = pt(2) End Function EDIT : cette méthode ne fonctionne pas. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Curlygoth Posté(e) le 21 mai 2021 Auteur Posté(e) le 21 mai 2021 OUF.. a oui je voyais pas du tout ce qu'il voulais dire ! c'est mon "xD" qui a dû le perturber ! 😝 Mon site Web (en cours de construction) : Site DA-CODE de @didier
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant