Aller au contenu

Donnez-moi un Z !


Curlygoth

Messages recommandés

 

 

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 :

 

image.thumb.png.225e59885990b9087497a4e02b102433.png

Lien vers le commentaire
Partager sur d’autres sites

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 2023 (26.0.37.2 base T.53.0.0)
Covadis 18.0 + AutoPiste
Windows 11 Famille v.21H2 - 64 bits

Toujours à l'affût des bonnes astuces

Lien vers le commentaire
Partager sur d’autres sites

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 2023 (26.0.37.2 base T.53.0.0)
Covadis 18.0 + AutoPiste
Windows 11 Famille v.21H2 - 64 bits

Toujours à l'affût des bonnes astuces

Lien vers le commentaire
Partager sur d’autres sites

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 2023 (26.0.37.2 base T.53.0.0)
Covadis 18.0 + AutoPiste
Windows 11 Famille v.21H2 - 64 bits

Toujours à l'affût des bonnes astuces

Lien vers le commentaire
Partager sur d’autres sites

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

 

 

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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é!

  • Upvote 1

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

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

 

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 ^^

Lien vers le commentaire
Partager sur d’autres sites

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.

  • Like 2

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

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

 

  • Like 1

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité