Exercice VB: TP Distances inter-atomiques
Rédigé par GC Team, Publié le 03 Janvier 2012, Mise à jour le Vendredi, 16 Décembre 2022 21:50Participez au vote ☆☆☆☆☆★★★★★
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é :
- 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
- 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.
- 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.
- Calcul de la distance et affichage
Interface graphique :
Voici les étapes à suivre pour construire l’interface
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
Code 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 Sub Code à placer dans un module : Public Type XYZ x As Double y As Double z As Double End Type Public Type Maille_type a As Double b As Double c As Double alpha As Double beta As Double gamma As Double End Type Public A1 As XYZ, A2 As XYZ Public At1 As XYZ, At2 As XYZ Public D As Double Public M As Maille_type Public Const Pi = 3.14159265358979 Public 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 Function Public 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 Function Public Function degrad(D As Double) As Double 'Convertion degrés >>> radians degrad = D * Pi / 180# End Function |