Aller au contenu

Donnez-moi un Z !


Curlygoth

Messages recommandés

Alors

Méthode @didier : 13.16

Méthode @(gile) : -0.42

EXO.dwg

 

Methode didier



Function MATH_ALTI_POINT_TRIANGLE(Pa, Pb, Pc, Pm)
Vab = VECTEUR(Pa, Pb)
Vac = VECTEUR(Pa, Pc)
Vn = PROD_SCALAIRE(Vab, Vac)
MATH_ALTI_POINT_TRIANGLE = Z_VECTEUR_NORMAL_Pa(Pa, Pm, Vn)
End Function


Function VECTEUR(Pa, Pb)
Dim V(0 To 2) As Double
For i = 0 To 2
    V(i) = Pb(i) - Pa(i) 'Vecteur ab
Next i
VECTEUR = V
End Function
Function PROD_SCALAIRE(Vab, Vac)
Dim V(0 To 2) As Double
V(0) = Vab(1) * Vac(2) - Vab(2) * Vac(1)
V(1) = Vab(2) * Vac(0) - Vab(0) * Vac(2)
V(2) = Vab(0) * Vac(1) - Vab(1) * Vac(0)
PROD_SCALAIRE = V
End Function
Function Z_VECTEUR_NORMAL_Pa(Pa, Pm, Vn)
T1 = Pa(0) * Vn(0) + Pa(1) * Vn(1)
T2 = Pa(2) * Vn(2)
T3 = Pm(0) * Vn(0)
T4 = Pm(1) * Vn(1)
Z_VECTEUR_NORMAL_Pa = (T1 + T2 - T3 - T4) / Vn(2)
End Function

methode gilles

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(Vector(pt1, pt2), Vector(pt1, pt3))
    pt = ThisDrawing.Utility.TranslateCoordinates(pt, acWorld, acOCS, False, norm_)
    pt(2) = 0#
    pt = ThisDrawing.Utility.TranslateCoordinates(pt, acOCS, acWorld, False, norm_)
    CoordZ = pt(2)
End Function


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

 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @Curlygoth

Je vois que tu y es arrivé, c'est ok.

Je vais sans doute me servir de cet exemple pour mon site, d'ailleurs j'ai plein d'exemples en LSP que je vais migrer en VBA pour que tout le monde ait les mêmes chances de progresser.

Je rends (encore une fois) hommage à @(gile) qui, très tôt, nous a orienté sur le travail avec les vecteurs, on a tous fait un grand pas en avant à la suite de ses explications.

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

@Curlygothla fonction que tu appelles PROD_SCALAIRE dans la "méthode didier" calcule en fait le produit vectoriel.
À définir des fonctions réutilisables, autant les nommer correctement...

EDIT : et le nom de la fonction Z_VECTEUR_NORMAL_Pa n'est pas très explicite.

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @Curlygoth

Je ne comprends pas ce que tu as écrit dans le dessin que tu proposes en téléchargement.
Il semblerait que tu obtiennes deux résultats différents, comment est-ce possible ?
Je veux bien quelques explications… Je trouve 15.3507 pour l'altitude du point cherché, on est OK ?


En espérant que tu ne prennes pas la mouche :
Tu n'es pas très ancien sur le site aussi je me permets de te demander de faire quelques efforts d'explication,
déposer un dessin sans commentaires, faire une réponse lapidaire n'est pas forcément une bonne chose, car quand on écrit sur les forums, les gens qui lisent n'ont pas forcément ton cheminement intellectuel ni ton niveau de connaissance et se retrouvent avec plus de questions que de réponses en te lisant.

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Quote

Il semblerait que tu obtiennes deux résultats différents, comment est-ce possible ?
Je veux bien quelques explications...

Oui c'est bien le problème 😊 avec ta méthode : je trouve 13 et des patates (ce qui est faux car je dois etre entre 14,51 et 16,41)

et je trouve -0.4282 avec la méthodes de transformation de @(gile) qui est aussi erroné

@(gile) J'ai jamais été bon pour donner des noms aux fonctions XD

et j'ai un probleme avec :

Function CoordZ_(pt1 As Variant, pt2 As Variant, pt3 As Variant, pt As Variant) As Double
    Dim norm_1(0 To 2) As Double
    norm_1 = CrossProduct(Vector(pt1, pt2), Vector(pt1, pt3))
    Dim zAxis(0 To 2) As Double
    zAxis(2) = 1#
    CoordZ_ = DotProduct(norm_1, Vector(pt, pt1)) / DotProduct(norm_1, zAxis)
End Function

Me dit : "impossible d’affecter à un tableau sur norm_1"

La je comprends pas tout à l'air carré...

d'ailleurs diviser deux matrices en VBA...

@didier J'ai mis le dwg sans explication car gile me l'a demander hier 😉 désolé ^^

mais ok oui je note ^^

Pour le dessin

J'ai voulu dessiner en 3D la face3D des 3 pts, pour avoir une surface

ensuite j'ai dessiné "physiquement et manuellement" une polyligne verticale pour avoir sa longueur (et donc le Z attendu (environ 15.34))

vu que j'ai "dessiner géométriquement" le résultat, et bien je me suis lancer dans des calculs (voir au début du posts avec CTzen)

donc vous ENORMEMENT aidé !! et je vous en remercie beaucoup !

mais il y a des couacs (peut-être du a mes connaissances erronés justement 😝)

Quote

ton niveau de connaissance

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Coucou

Ah c'est donc pas si simple que ça, si tu trouves deux résultats différents l'un des deux est forcément faux, et il semblerait qu'en l'occurrence les deux sont faux.
Est-ce que la valeur que je t'ai proposée est correcte à tes yeux ?
J'ai vérifié (comme à chaque fois que j'écris quelque chose) et pour moi c'est bon...

Dans quelle mesure on peut t'aider sur ce coup ?
Tu connais les formules et il n'y a plus qu'à les appliquer, tu n'aurais pas des variables déconnantes ? Sont-elles correctement déclarées ?

À suivre

Lien vers le commentaire
Partager sur d’autres sites

Quote

Est-ce que la valeur que je t'ai proposée est correcte à tes yeux ?

 

Quote

Je trouve 15.3507 pour l'altitude du point cherché, on est OK ?

 

Oui ce sera ça donc j'ai fait un boulette c'est sur !

Function MATH_ALTI_POINT_TRIANGLE(Pa, Pb, Pc, Pm)
Vab = VECTEUR(Pa, Pb)
Vac = VECTEUR(Pa, Pc)
Vn = PROD_SCALAIRE(Vab, Vac)
MATH_ALTI_POINT_TRIANGLE = Z_VECTEUR_NORMAL_Pa(Pa, Pm, Vn)
End Function
Function VECTEUR(Pa, Pb)
Dim V(0 To 2) As Double
For i = 0 To 2
    V(i) = Pb(i) - Pa(i) 'Vecteur ab
Next i
VECTEUR = V
End Function
Function PROD_SCALAIRE(Vab, Vac)
Dim V(0 To 2) As Double
V(0) = Vab(1) * Vac(2) - Vab(2) * Vac(1)
V(1) = Vab(2) * Vac(0) - Vab(0) * Vac(2)
V(2) = Vab(0) * Vac(1) - Vab(1) * Vac(0)
PROD_SCALAIRE = V
End Function
Function Z_VECTEUR_NORMAL_Pa(Pa, Pm, Vn)
T1 = Pa(0) * Vn(0) + Pa(1) * Vn(1)
T2 = Pa(2) * Vn(2)
T3 = Pm(0) * Vn(0)
T4 = Pm(1) * Vn(1)
Z_VECTEUR_NORMAL_Pa = (T1 + T2 - T3 - T4) / Vn(2)

 

Lien vers le commentaire
Partager sur d’autres sites

18 minutes ago, Curlygoth said:

J'ai jamais été bon pour donner des noms aux fonctions

Avec PROD_SCALAIRE ce n'est pas seulement "ne pas être bon" c'est carrément "être faux" en donnant comme à une opération celui d'un autre. Je vais essayer de prendre le temps pour une petite explication des base du calcul vectoriel.

22 minutes ago, Curlygoth said:

et j'ai un probleme avec :


Function CoordZ_(pt1 As Variant, pt2 As Variant, pt3 As Variant, pt As Variant) As Double
    Dim norm_1(0 To 2) As Double
    norm_1 = CrossProduct(Vector(pt1, pt2), Vector(pt1, pt3))
    Dim zAxis(0 To 2) As Double
    zAxis(2) = 1#
    CoordZ_ = DotProduct(norm_1, Vector(pt, pt1)) / DotProduct(norm_1, zAxis)
End Function

Me dit : "impossible d’affecter à un tableau sur norm_1"

La je comprends pas tout à l'air carré...

Ça c'est ton domaine, c'est du VBA, je n'ai jamais vraiment compris ces histoires de variants (je n'ai jamais vraiment cherché non plus), mais tu peux essayer :

Dim norm_1 As Variant = CrossProduct(Vector(pt1, pt2), Vector(pt1, pt2))

Dim norm_1 As Variant = CrossProduct(Vector(pt1, pt2), Vector(pt1, pt2))

 

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

J'ai fait différemment :

Vu qu'on ne peut apparement pas mettre un tableau dans un tableau (ça le fait aussi quand je doit mettre une list dans une liste) et je fait ça :

    temp = CrossProduct(Vector(pt1, pt2), Vector(pt1, pt3))
    For i = 0 To 2
    norm_1(i) = temp(i)
    Next i

bah le variant, je l'appelle le joker... il peut varié dans ton code ! c'est à la fois génial et surtout très casse gueule ! 😝

@didier Par contre là c'est bon !!!! j'avais une erreur de frappe... j'avais donc un Z=0 dans mon point A...

MERCI CHAMPION

@(gile)

Tu trouve combien quand tu fais tourner tes codes ?

Édit: sinon t'embête pas je peux rester avec ce j'ai 😉

En tout cas merci merci beaucoup !!

 

image.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @Curlygoth

C'est avec ce genre de code que la notion de rigueur prend de l'importance.
Tant qu'on "joue" avec des entités, qu'il faut les déplacer ou les copier, ou encore les changer de couleur, on trouve des bidouilles et c'est vite et facilement vérifiable.
Avec la géométrie analytique ou les mathématiques on ne peut plus "bidouiller" et la rigueur prend tout son sens.

Autre chose que je ne comprends pas, tu dis  :
"bah le variant, je l'appelle le joker... il peut varié dans ton code ! c'est à la fois génial et surtout très casse gueule !"

J'espère que tu t'es mal exprimé, car c'est FAUX, il est impossible de changer de type en cours de code
Si la variable n'est pas déclarée (mauvaise pratique) elle est typé implicitement en variant, Dès qu'une valeur lui est attribuée, VBE type la variable suivant la valeur (string, integer...) et ensuite, c'est figé. Je guette les réponses pour exprimer mes excuses si je suis dans l'erreur

Tu nous expliques s'il te plaît.

Par ailleurs je ne comprends pas non plus : "mais je comprned pas le Ac"
C'est quoi Ac ?

Et en dernier je dirais qu'il est possible de mettre un tableau dans un tableau.

Ça fait beaucoup de commentaires pour un message, mais je me contente du maximum à commencer par la rigueur dans les propos exprimés, on n'est pas sur un réseau Asocial à déblatérer sur le clébard de la concierge.

Amicalement

 

Lien vers le commentaire
Partager sur d’autres sites

@Curlygoth Manifestement, tu ne sais pas ce que sont produit scalaire et produit vectoriel et tu ne comprends pas complètement les codes qu'on te donne.

Le produit scalaire de deux vecteurs (dot product en anglais) est un nombre réel (appelé scalaire). Le produit vectoriel de deux vecteurs (cross product en anglais) est un vecteur, donc un simple tableau unidimensionnel en VBA, il n'est pas question de "tableau dans un tableau".
Le corps de la fonction CrossProduct que j'ai donné est exactement le même que celui de celle que tu as improprement appelée PROD_SCALAIRE. La seule différence est dans la déclaration des arguments et du type de retour et là on touche à un autre truc qui me sort par les yeux en VBA : le typage plus ou moins dynamique et les déclarations optionnelles. Donc je te laisse te dépatouiller avec ça, c'est toi qui connais le VBA.

Sinon les résultats que j'ai avec la méthode utilisant le produit scalaire donne les bon résultats (du moins en LISP). Cette méthode est équivalente à celle donnée par @didier elle met juste l'utilisation du produit scalaire sous une forme explicite.

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Alors je vais traiter vos réponses dans l'ordre et avec grand respect que j'ai pour vous 😀

Je commence par @didier

Quote

J'espère que tu t'es mal exprimé, car c'est FAUX, il est impossible de changer de type en cours de code

alors dans les faits d'exactitude tu as raison

mais j'ai appris que si on ne declare pas de variable elle se met en variant "automatiquement" et tu remarquera les guillements

du coup si tu dit dim TOTO as variant

et ensuite

toto = 1

toto = "A"

tu n'aura pas de probleme d'où l'utilisation peu abusive du mot joker, car si on mets un liste ou tableau sans le déclarer ça marche pas ! (sauf sur apel d'une "fonction")

Quote

Par ailleurs je ne comprends pas non plus : "mais je comprned pas le Ac"

Ce qui est drôle c'est que le correcteur a accepté le "comprned" mais pas le "Ac"

pt = ThisDrawing.Utility.TranslateCoordinates(pt, acOcs, acWorld, False, norm)

enfin bref c'etait par rapport au acOCS qui est le plan normal des "blocs"

ce que je n'avais pas compris et donc je ne voyais pas comment l'avoir sans le produit vectoriel... que d'ailleurs je ne maitrise pas totalement...

et c'est une belle transition pour répondre @(gile)
 

Quote

 

Manifestement, tu ne sais pas ce que sont produit scalaire et produit vectoriel et tu ne comprends pas complètement les codes qu'on te donne.

 

C'est pour ça que je préférè qu'on me donne les formules 😉

Mais pour être encore plus précis avec toi :

je ne l'ai pas vu à l'école (enfin les vecteur si quand même) mais uniquement sur du 2D !

Donc hier soir, j'ai regardé une vidéo qui explique.

Mais disons le clairement : sans pratique c'est compliqué de maitriser ! (un peu comme au échec du reste)

Voilà !

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @Curlygoth

Dans l'ordre d'apparition :

"les faits d'exactitude" On parle de quoi d'autre ? Ce qui est avéré a sa place sur un site qui sera lu par des débutants, ne rien écrire qui puisse prêter à confusion sauf spécification explicite.

Le coup de la variable qui change de type est osé pour le VBA. Le lisp n'exige pas déclaration et de typage lui et c'est sa façon intrinsèque de fonctionner, pas le VBA.
Pourquoi écris-tu "automatiquement alors que le vrai mot est "implicitement" puisque déclaration il y a tout de même avec le gâchis en réservation de mémoire qui va avec, as-tu lu mes pages sur "Option Explicit" ? Il me semble que les arguments sont recevables (pour le moins)

Il semble que certains réquisits ne sont pas acquis, le "ac" est le préfixe pour les OBJETS propres à AutoCAD, je suis quelque peu surpris de ta question pour un programmeur sur AutoCAD.
Au même titre que "vb" est le préfixe pour VBA et "ex" pour les objets Excel.
J'ai fait une page là-dessus, mais tu ne l'as pas lue visiblement, c'est celle des "constantes".

Ensuite pour les formules, assurément, c'est pas simplissime, pour (gile) comme pour moi, les souvenirs scolaires sont lointains et d'autant ténus, à dix-sept ans je travaillais déjà, tu veux qu'on parle d'école ? Par contre, la rigueur d'application des formules n'a rien à voir avec ça, on peut appliquer une formule inconnue à la lettre et faire fonctionner un programme avec, je suis d'accord que ce n'est pas valorisant, mais c'est factuel.

"C'est pour ça que je préfère qu'on me donne les formules" On ne peut pas te donner plus de formules que celles fournies, il y a tout, sans compter que (gile) s'est fendu d'une explication explicitement explicite et je le remercie explicitement.

Je vais sans doute stopper là cette discussion qui pollue le sujet et revenir à la question liminaire.

Tu en es où ? Et comment on peut t'aider ?

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Quote

Il semble que certains réquisits ne sont pas acquis, le "ac" est le préfixe pour les OBJETS propres à AutoCAD

oui je suis d'accord, mais mon correcteur orthographique lui n'en sais rien 😉

Quote

Pourquoi écris-tu "automatiquement alors que le vrai mot est "implicitement" puisque déclaration

car je n'ai pas l'art de ton écriture et je m'en excuse 😉

 

Quote

"C'est pour ça que je préfère qu'on me donne les formules" On ne peut pas te donner plus de formules que celles fournies, il y a tout, sans compter que (gile) s'est fendu d'une explication explicitement explicite et je le remercie explicitement.

moi aussi je le remercie  !

une formule :

image.png.5a2680477015a0c9da1f502aa5add1a1.png

je m'attendais plus à ça ^^

vous m'avez mâcher le travail... c'est très bien ! mais il est vrai comme dit @(gile) que je ne comprends pas du coup toutes les formules que vous m'avez donner hormis celle que j'ai écrite ou réécrite car j'ai regarder un cours hier soir ce qui malheureusement ne fait pas de moi un expert ^^

Quote

Tu en es où ? Et comment on peut t'aider ?

tu semble tracasser pourtant j'ai écrit plus haut dans ce message :

où d'ailleurs je t'ai "insulté" de champion 😈

 

 

image.png

Lien vers le commentaire
Partager sur d’autres sites

J'ai ajouté une page à la rubrique Tutoriels de gileCAD avec un petit topo sur le calcul vectoriel (en LISP).

J'ai essayé de refaire un peu ce que j'avais fait sur AcadLabs l'ancien site de @didier.

Le code VBA que, manifestement, je ne suis pas arrivé à écrire est une extrapolation pour cette demande particulière de la routine gc:IntersLinePlane à la fin de cette page.

  • Upvote 1

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

5 minutes ago, Curlygoth said:

Et merci aussi encore a @didier pour le formule du z et me disant d'avoir le vecteur normal !

Cette phrase ne veut absolument rien dire.

S'il te plait, fait un effort quand tu postes un message essaye qu'il soit compréhensible et prend le temps de te relire pour t'en assurer.

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @(gile)

Bravo, super page, très utile.
Car dans les problèmes que les gens rencontrent avec la programmation est souvent l'incapacité de résoudre le sujet "à la main" (alors le programmer ?)

@Curlygoth On va dire que c'est une faute de frappe (taquinerie), car tu écris par erreur "vecteur normal" (sans e) et il faut lire, le vecteur de la normale du plan.

Édition du message : je reviens sur le vecteur normal pour modérer mon propos ou plutôt le préciser, j'avais appris que c'était le vecteur de la normale du plan, je suis allé vérifier depuis et on trouve du vecteur normal un peu partout, donc OK dans cette acception normal signifie définissant "la normale".
On parle de normale dans le cas de talus et d'épaisseur de terre à déposer par exemple.

 

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Il a écrit son message comme un mec qui vient de finir un gros apéro :rolleyes:

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

Une dernière tentative en VBA (pas testée).
J'ai remplacé tous les Variants dans les déclarations par de Double().

Function Vector(pt1() As Double, pt2() As Double) As Double()
	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 Double, v2() As Double) As Double
	DotProduct = v1(0) * v2(0) + v1(1) * v2(1) + v1(2) * v2(2)
End Function

Function CrossProduct(v1() As Double, v2() As Double) As Double()
	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 Double, pt2() As Double, pt3() As Double, pt() As Double) As Double
	Dim norm(0 To 2) As Double = 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

 

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Pour ceux que ça intéresse, avec .NET, c'est plus simple et plus explicite.

C#

static double? CoordZ(Point3d p1, Point3d p2, Point3d p3, Point3d p)
{
    var plane = new Plane(p1, p2, p3);
    var line = new Line3d(p, Vector3d.ZAxis);
    return line.IntersectWith(plane)?[0].Z;
}

F#

let coordZ (p1: Point3d) (p2: Point3d) (p3: Point3d) (p: Point3d) =
    match (new Line3d(p, Vector3d.ZAxis)).IntersectWith(new Plane (p1, p2, p3)) with
    | null -> None
    | pts  -> Some pts.[0].Z

 

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

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é