[VBA Autocad] dessiner la symétrie d'un point par rapport à une ligne.

dessiner la symétrie d'un point par rapport à une ligne. [VBA Autocad] - VB/VBA/VBS - Programmation

Marsh Posté le 04-02-2011 à 13:25:52    

Bonjour,
j'ai besoin d'aide pour un projet personnel.
 
je souhaiterai écrire un programme permettant de dessiner le symétrique d'un point par rapport à une ligne sans passer par la fonction miroir d'autocad.
 
Voila le sujet pour avoir plus d'information...
 
Saisies utilisateur :
P1 Point dont on doit calculer le symétrique
P2 et P3, deux points de la ligne de symétrie
 
Résultat : P4
 
Algorithme :
Déterminer l’orientation du segment P2,P3
Calculer les distances P1P2, P1P3 et P2P3
Ecrire Pythagore pour chaque triangle P1HP2 et P1HP3
Ecrire l’équation du 2nd degré traduisant que P2P3=P2H+HP3
En déduire le distance P1H en résolvant cette équation du 2nd degré, puis en déduire
le symétrique P4 de P1
 
Merci d'avance de votre aide qui me sera très très précieuse!!!

Reply

Marsh Posté le 04-02-2011 à 13:25:52   

Reply

Marsh Posté le 04-02-2011 à 13:27:15    

voila un premier jet du programme... je bloque pour la suite
 
 
Sub fonction_miroir()
 
 
Dim Pt1 As Variant, Pt2 As Variant, Pt3 As Variant, angle1 As Variant
 
Dim Ligne1 As AcadLine
Dim Point1 As ACAD_POINT
 
 
 
Pt1 = ThisDrawing.Utility.GetPoint(, "Entrer le point 1: " )
Pt2 = ThisDrawing.Utility.GetPoint(, "Entrer le point 2: " )
Pt3 = ThisDrawing.Utility.GetPoint(Pt2, "Entrer le point 3: " )
'angle1 = ThisDrawing.Utility.AngleToString(
 
Set Point1 = ThisDrawing.ModelSpace.AddPoint(Pt1)
Set Ligne1 = ThisDrawing.ModelSpace.AddLine(Pt2, Pt3)
 
 
End Sub
 
Function Distance1(Pt1, Pt2) As Double
   Distance1 = Sqr((Pt2(0) - Pt1(0)) ^ 2 + (Pt2(1) - Pt1(1)) ^ 2 + (Pt2(2) - Pt1(2)) ^ 2)
   
   End Function
   
   Function Distance2(Pt1, Pt3) As Double
   Distance2 = Sqr((Pt3(0) - Pt1(0)) ^ 2 + (Pt3(1) - Pt1(1)) ^ 2 + (Pt3(2) - Pt1(2)) ^ 2)
   
   End Function
   
   
   Function Distance3(Pt2, Pt3) As Double
   Distance3 = Sqr((Pt3(0) - Pt2(0)) ^ 2 + (Pt3(1) - Pt2(1)) ^ 2 + (Pt3(2) - Pt2(2)) ^ 2)
   
End Function
 
   

Reply

Marsh Posté le 22-02-2011 à 18:37:19    

D'abord, tu n'as pas besoin de faire 3 fonctions pour calculer les distances, une seule suffi !


Function Distance2Pts(Pt1, Pt2) As Double
  Distance2Pts = Sqr((Pt2(0) - Pt1(0)) ^ 2 + (Pt2(1) - Pt1(1)) ^ 2 + (Pt2(2) - Pt1(2)) ^ 2)
End Function


Utilisation :

Sub CalculerDistance()
  Point1 = ThisDrawing.Utility.GetPoint(, "Entrer le point 1: " )
  Point2 = ThisDrawing.Utility.GetPoint(, "Entrer le point 2: " )  
  Point3 = ThisDrawing.Utility.GetPoint(, "Entrer le point 3: " )
  msgbox("La distance totale cumulée des points est : " & distance2Pts(Point1, Point2)) + distance2Pts(Point3, Point2))
End Sub


 
Ensuite, pour faire ta symétrie, ça serait plus simple de passer par le produit des déterminants entre le vecteur V1 définissant ton axe de symétrie et le vecteur V2 défini par le point sélectionné et le projeté de ce point sur l'axe de symétrie : le point symétrisé sera le point projeté - V2 ;)
Ca fonctionnera en 3D, je sais, je l'ai déjà fait mais je vais te laisser chercher  :D . C'est pas bien compliqué :)
 
Tu peux aussi utiliser le système de coordonnés utilisateur, mais ça fait utiliser des fonctions que je trouve pas faciles à utiliser, passer par le solution du calcul vectoriel est plus simple à mon avis.
 
Tu peux jeter un coup d'œil sur les exemples que j'ai mis sur mon blog consacré à VBA et AutoCAD :
http://autocadvba.canalblog.com/ar [...] 41514.html
Ça fonctionne en 2D, mais tu ne devrais pas avoir de difficulté à adapter ça en 3D (à partir du moment où tu restes en SCG).


Message édité par otobox le 11-09-2011 à 17:34:10

---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
Reply

Marsh Posté le 10-03-2011 à 11:23:20    

désolé pour la réponse tardive, je passe une période de partiel intense! j'ai bien réussi a faire la symétrie grâce au produit des déterminant! Merci beaucoup pour ton aide. au passage ton blog est sympa ;)
 
cordialement
 
Stepos

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed