HARMONIQUES

Utilisateur anonyme - 5 oct. 2006 à 20:03
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009 - 9 oct. 2006 à 14:51
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39824-harmoniques

cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
9 oct. 2006 à 14:51
je me suis donné quelques temps pour améliorer ta source (boucles limitées aux additions et multiplications et tu pourras facilement généraliser à n harmoniques). Il faudrait déjà utiliser un groupe de contrôles pour les slider.
Ci-dessous le code complet à copier dans form1, je n'ai pas trouvé l'intérêt du timer:

Option Explicit
Dim Coef As Double
Private PI As Double, SinA As Double, CosA As Double


'Soient Uki=sin(Coef*k*i) et Vki=Cos(Coef*k*i) avec Coef=2*PI/360
'Pour k=1 on Mi=U1i=sin(Coef*i) et Ni=V1i=Cos(Coef*i)
'Soient les constantes SinA=Sin(Coef) et CosA=Cos(Coef)
'On a M0=0 et N0=1
'M(i+1)=Mi*CosA + Ni*SinA et N(i+1)=Ni*CosA - Mi*SinA
'U(k+1)i=Uki*Ni + Vki*Mi et V(k+1)i=Vki*Ni - Uki*Mi

Private Sub Command1_Click()
Dim i As Long, k As Long
Dim positionX As Long, positionY As Integer
Dim Mi As Double, Mi_ As Double, Ni As Double
Dim Uki As Double, Uki_ As Double, Vki As Double
Dim Hki As Double


If Check1.Value = Checked Then Command2_Click

Mi 0: Ni 1
positionX = 4000
For i = 1 To 720
Me.DrawWidth = 1
positionX = positionX + 10
Mi_ Mi: Mi Mi * CosA + Ni * SinA
Ni = Ni * CosA - Mi_ * SinA
Uki Mi: Vki Ni 'en effet Mi=Uki pour k=1 et Ni=Vki pour k=1
'Calcul de H2 + H3 + ... +H10
Hki = 0
For k = 2 To 10
Uki_ Uki: Uki Uki * Ni + Vki * Mi
Vki = Vki * Ni - Uki_ * Mi
Hki = Hki + Uki * 10 * (100 - Slider(k - 1).Value)
Next k

positionY = Mi * (10 * (100 - Slider(0).Value)) + Hki + 5000
PSet (positionX, positionY), vbGreen
Next i
DoEvents
End Sub

Private Sub Command2_Click()
Me.Cls
End Sub

Private Sub Command3_Click()
Slider(0) = 0
Slider(1) = 100
Slider(2) = 100
Slider(3) = 100
Slider(4) = 100
Slider(5) = 100
Slider(6) = 100
Slider(7) = 100
Slider(8) = 100
Slider(9) = 100
'Slider(10) = 100
Call Command1_Click
End Sub

Private Sub Command8_Click()
Unload Me
End Sub

Private Sub Form_Load()
PI = 4 * Atn(1)
Coef = 2 * PI / 360
SinA = Sin(Coef)
CosA = Cos(Coef)
Call Command1_Click
End Sub

'La courbe se redessine auto quand l'utilisateur scroll
Private Sub Slider_Scroll(Index As Integer)
Command1_Click
End Sub
patdbe Messages postés 20 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 20 janvier 2008
9 oct. 2006 à 11:56
Merci pour tous vos commentaires interessants, j'en tiendrais compte si j'améliore ce prog et surtout pour d'autres applis du mème genre.
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
8 oct. 2006 à 18:52
un petit truc tout bête, mais tellement utile :
Pi = Atn(1) * 4
La précision du nombre en est considérablement augmentée.
patdbe Messages postés 20 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 20 janvier 2008
6 oct. 2006 à 15:51
Dim a, b As Integer
a = " test"
b = "test"

C'est vrai le second déclenche une erreur.
Habitué aux déclarations en C, je n'ai pas vérifié , bien qu'ayant un doute tout de même en lisant certaines sources.

pour pi , oui , toujours distrait
ainsi que cosx qui sert à rien ...

For i=0 To 9
Slider(i).Value=100
Next i
Oui, j'y ai pensé , mais les valeurs ne sont pas toutes à 100 , notamment le premier qui est à 0, de plus j'ai pensé ajouté des boutons pour des formes remarquables obligeant le renseiggnement une à une les variables , donc aucun avantage.
De plus la numérotation à un trou pour l'index 1 qui n'existe pas.
J'ai choisie cette solution.A tort ou à raison, je ne sais pas,
pour les plus;
Les fonctions change seraient regrouper
pour les moins
Les cas particuliers des index 0 et 1 complique le traitement général.
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
6 oct. 2006 à 12:53
Au lieu de prendre Vk(i+1)=sqr(1-Uk(i+1)^2), c'est mieux d'avoir Vk(i+1)=Cos(A*k)*Vki - Sin(A*k)*Uki. En effet la fonction sqr (racine carrée est également autant complexe que les fonctions sin et cos.
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
6 oct. 2006 à 11:39
ptite correction : sin(a+b)=sin(a)*cos(b)+cos(a)*sin(b)
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
6 oct. 2006 à 11:34
Je te donne quelques idées pour optimiser la vitesse de calcul de tes fonctions.

D'un tes variables Hk (H2, H3, ..., H10) sont de la forme Bk*sin(A*k*i) avec A=siny un coef constant,Bk=10*(100-sliderk.valeur), i allant de 1 à 720 et k allant de 2 à 10. On voit bien que la fonction Hk depend aussi de i d'où necessité de revoir sa définition elle devient Hki.

Interessons nous uniquement à sin(A*k*i) et appelons cette expression Uki et considérons Vki=cos(A*k*i)

Partant du fait sin(a+b)=sin(a)*cos(b)+cos(b)*sin(a)
On a Uk(i+1)=Uki * Cos(A*k) + Vki * sin (A*k)
Partant également de cos(a)=sqr(1-sin(a)^2) on Vk(i+1)=sqr(1-Uk(i+1)^2)

Soient Mk=Sin(A*k) et Nk=Cos(A*k)
M(k+1)=Sin(A)*Nk + Cos(A)*Mk
Du fait cos(a+b)=cos(a)*cos(b)-sin(a)*sin(b)
N(k+1)=Nk * Cos(A) - Mk * Sin(a)

Conclusion Hki deviendra une fonction de Uki, Vki, Nk et Mk et le tour est joué, tu auras un tracé rapide comme l'éclair. Y'a pas plus rapide si je m'en tiens à tes formules.
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
6 oct. 2006 à 09:53
Oui, cette restriction n'était pas présente aux débuts de CodeS-SourceS
A partir du moment où on dispose des sources, l'exe, c'est de la redondance d'information. Donc inutile de surcharger les serveurs avec çà.

----------------------------------

Bref, concernant la source :


Quand tu écris :
Dim cosx, siny As Single
Seul siny est de type Single. cosx est alors de type Variant.

Idem pour Dim H2, H3, h4, h5, h6, h7, h8, h9, h10, h11, h12 As Integer
Seul h12 est de type Integer

----------------------------------

En utilisant un groupe de contrôles pour les Sliders, l'écriture du code s'en trouverait simplifiée. Par exemple, le code ci-dessous remplacerait allégrement 40 lignes du code présenté ci-dessus.

For i=0 To 9
Slider(i).Value=100
Next i

Private Sub Slider_Change(Index As Integer)
Command1_Click
End Sub

----------------------------------

Il est dommage de déclarer une variable Pi, et dans les formules d'utiliser 6.28 (au lieu de 2*Pi). Ca pourrait permettre de comprendre d'où viennent les formules.
patdbe Messages postés 20 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 20 janvier 2008
6 oct. 2006 à 09:10
Ce qui est étonnant c'est que certains zip que j'ai chargé sur ce site , ont un exe ..., peut être des anciens fichiers.
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
6 oct. 2006 à 09:06
-- PAS D'EXE DANS LES SOURCES ! --
C'est le réglement ! (marqué en rouge là où on peut uploader : "Evitez de mettre des exécutables dans vos zips merci de votre compréhension, les .exe seront automatiquement supprimé lors de l'upload)"
patdbe Messages postés 20 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 20 janvier 2008
6 oct. 2006 à 08:53
zip avec l'exe
http://perso.orange.fr/pat.deaubonne/DOWNLOAD/harmonique.zip
le serveur n'a pas aimé l'exe...
Rejoignez-nous