cs_asimengo
Messages postés280Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention18 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 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és20Date d'inscriptionsamedi 9 octobre 2004StatutMembreDernière intervention20 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és473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 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és20Date d'inscriptionsamedi 9 octobre 2004StatutMembreDernière intervention20 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és280Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention18 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és280Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention18 mars 2009 6 oct. 2006 à 11:39
cs_asimengo
Messages postés280Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention18 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és4030Date d'inscriptionmardi 13 mai 2003StatutMembreDernière intervention23 décembre 200824 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és20Date d'inscriptionsamedi 9 octobre 2004StatutMembreDernière intervention20 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és5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 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és20Date d'inscriptionsamedi 9 octobre 2004StatutMembreDernière intervention20 janvier 2008 6 oct. 2006 à 08:53
9 oct. 2006 à 14:51
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
9 oct. 2006 à 11:56
8 oct. 2006 à 18:52
Pi = Atn(1) * 4
La précision du nombre en est considérablement augmentée.
6 oct. 2006 à 15:51
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.
6 oct. 2006 à 12:53
6 oct. 2006 à 11:39
6 oct. 2006 à 11:34
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.
6 oct. 2006 à 09:53
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.
6 oct. 2006 à 09:10
6 oct. 2006 à 09:06
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)"
6 oct. 2006 à 08:53
http://perso.orange.fr/pat.deaubonne/DOWNLOAD/harmonique.zip
le serveur n'a pas aimé l'exe...