Exercice VB: TP Distances inter-atomiques

On se propose d'écrire un programme permettant le calcul de la longueur d'une liaison entre deux atomes dans un matériau, à partir des paramètres de maille (a, b, c, a , b , g ) et des coordonnées atomiques (x, y, z). Pour cela, on transforme les coordonnées (x,y,z) de chaque atome en coordonnées cartésiennes (Xt, Yt, Zt) de la façon suivante:

Une fois la transformation faite, l'expression pour la distance entre les atomes A1 et A2 est simplement:

Programme demandé :

  1. Interface (voir exemple ci-dessous):
  • Six zones de texte pour saisir les paramètres de maille (a, b, c, a , b , g )
  • Six autres pour la saisie des coordonnées (x, y, z) des atomes A1 et A2
  • Un bouton Calcul
  • Six zones de texte pour afficher les coordonnées pour A1 et A2 après transformation – repère cartésien
  • Une zone de texte pour l'affichage de la distance calculée entre A1 et A2 dans le nouveau repère
  1. Vous devrez écrire trois fonctions à placer de préférence dans un module (Public Function) :
  • DegRad, la première, aura pour simple objectif de convertir des degrés en radians. Elle recevra donc un seul argument de type double pour retourner une valeur du même type.
  • MTransform recevra les paramètres de la maille et les coordonnées d'un atome exprimées dans ce système. Le but de cette fonction est de retourner les coordonnées de cet atome transformées selon la formule expliquée plus haut.
  • Distance, enfin, retournera la distance entre les deux atomes dont les coordonnées respectives lui auront été passées en arguments. Le résultat de ce calcul sera de type double.
  1. Le bouton Calcul ordonnera successivement les trois taches suivantes :
  • Lecture des valeurs des paramètre de la maille avec conversion des angles (a , b et g ) en radians à l'aide de DegRad. Lecture des coordonnées (x, y, z) des atomes A1 et A2.
  • Transformation des coordonnées de A1 et A2 dans le nouveau repère – à l'aide de MTransform. Affichage des nouvelles coordonnées.
  1. Calcul de la distance et affichage

Interface graphique :

Voici les étapes à suivre pour construire l’interface

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172Code de la feuille Form1 :Private Sub Command1_Click() 'Lecture des valeurs M.a = Val(Ta.Text) M.b = Val(Tb.Text) M.c = Val(Tc.Text) M.alpha = degrad(Val(Talpha.Text)) M.beta = degrad(Val(Tbeta.Text)) M.gamma = degrad(Val(Tgamma.Text)) A1.x = Val(TA1x.Text) A1.y = Val(TA1y.Text) A1.z = Val(TA1z.Text) A2.x = Val(TA2x.Text) A2.y = Val(TA2y.Text) A2.z = Val(TA2z.Text) 'Transformation des coordonnées At1 = MTransform(M, A1) At2 = MTransform(M, A2) 'Affichage des coordonnées transformées TTA1x.Text = Str(At1.x) TTA1y.Text = Str(At1.y) TTA1z.Text = Str(At1.z) TTA2x.Text = Str(At2.x) TTA2y.Text = Str(At2.y) TTA2z.Text = Str(At2.z) 'calcul de la distance et affichage D = Distance(At1, At2) Tdistance = Str(D)End SubCode à placer dans un module :Public Type XYZ x As Double y As Double z As DoubleEnd TypePublic Type Maille_type a As Double b As Double c As Double alpha As Double beta As Double gamma As DoubleEnd TypePublic A1 As XYZ, A2 As XYZPublic At1 As XYZ, At2 As XYZPublic D As DoublePublic M As Maille_typePublic Const Pi = 3.14159265358979Public Function MTransform(M As Maille_type, Atom As XYZ) As XYZ Dim V As Double V = M.a * M.b * M.c * _ Sqr(1 - Cos(M.alpha) ^ 2 - Cos(M.beta) ^ 2 - Cos(M.gamma) ^ 2 + 2 * Cos(M.alpha) * Cos(M.beta) * Cos(M.gamma)) MTransform.x = M.a * Atom.x + _ M.b * Cos(M.gamma) * Atom.y + _ M.c * Cos(M.beta) * Atom.z MTransform.y = M.b * Sin(M.gamma) * Atom.y + _ M.c * (Cos(M.alpha) - Cos(M.beta) * Cos(M.gamma)) * Atom.z / Sin(M.gamma) MTransform.z = V * Atom.z / (M.a * M.b * Sin(M.gamma))End FunctionPublic Function Distance(A1 As XYZ, A2 As XYZ) As Double Distance = Sqr((A1.x - A2.x) ^ 2 + (A1.y - A2.y) ^ 2 + (A1.z - A2.z) ^ 2)End FunctionPublic Function degrad(D As Double) As Double 'Convertion degrés >>> radians degrad = D * Pi / 180#End Function
Article publié le 03 Janvier 2012 Mise à jour le Vendredi, 16 Décembre 2022 21:50 par GC Team