Tracer une courbe

Résolu
kobeymane Messages postés 58 Date d'inscription dimanche 29 janvier 2012 Statut Membre Dernière intervention 29 avril 2012 - 26 févr. 2012 à 01:13
kobeymane Messages postés 58 Date d'inscription dimanche 29 janvier 2012 Statut Membre Dernière intervention 29 avril 2012 - 16 mars 2012 à 00:29
bonjour,
je dois créer un programme qui trace une courbe sc(t).
Pour cela j'ai déja les abcisses t et les ordonnées sc qui sont prêts. donc pour le calcul il n'y a pas de problème.

maintenant je veux tracer cette courbe dans une picturebox, pour cela je veux utiliser la méthode "drawpolygon" pour cette méthode il me faut UN TABLEAU DE POINTS dont j'y vais affecter les point d'absice t et ordonnée sc(t).

Ma question est:peut on créer ce Tableau de points ? si oui comment faire pour lui affecter ces données (abcisse t et ordonnés sc(t)) sous forme de points pour que je puisse utiliser la méthode drawpolygon.

j'ai déja essayé mai ça tombe mal: une erreur se produit "point est un type et ne peut pas etre utilisé en tant qu'expression".

Comment corriger cette erreur ?
et s'il existe une autre façon pour tracer cette courbe merci de me le signaler

voici mon programme:
Public Class Form1
    Dim newBitmap As Bitmap = New Bitmap(1000, 1000)
    Dim g As Graphics = Graphics.FromImage(newBitmap)
    Dim blackPen As New Pen(Color.Black)


    Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim curvepoints As Point()

        Dim t, sc As Single
        Dim k, ord As Integer
        Dim f0, T0, amp, moy As Single



        T0 = CType(TextBox1.Text, Single) / 1000
        f0 = 1 / T0
        amp = CType(TextBox2.Text, Single)
        moy = CType(TextBox3.Text, Single)
        ord = CType(TextBox4.Text, Integer)

        For t = 0 To 100
            sc = moy
            For k = 1 To ord
                sc = sc + (4 * amp / Math.PI) * Math.Sin((2 * k - 1) * 2 * Math.PI * f0 * t) / (2 * k - 1)
            Next k

            curvepoints(t) = Point(t, sc)

            g.DrawPolygon(blackPen, curvepoints)

        Next t

    End Sub
    
    Private Sub PictureBox1_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
        PictureBox1.Image = newBitmap
    End Sub
End Class


Aidez moi SVP et Merci d'avance.

16 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
15 mars 2012 à 14:55
bon pas simple
si tu obtiens une ligne horizontal
verifie tes coordonnés
sers toi du debugger outil indispensable
tu dois savoir où dans ton prog les coordonnées
sont calculées
si elle ont toutes les memes valeur donc ça cloche et tu obtiens une ligne horizontal
3
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
26 févr. 2012 à 11:59
Salut
au lieu de
 Dim curvepoints As Point()

plutot
 Dim curvepoints() As Point

tu déclares curvepoints un array de type point
bien sur appliquer le redim preserve

 ReDim Preserve curvepoints(t)
 curvepoints(t) = Point(t, sc)


vaux mieux écrire une sub qui dessine ta courbe
Public Class Form1
    Private vertext() As PointF

    Private Function DegreeToRad(ByVal deg As Integer) As Double
        'traduit les degrée en radian
        Return deg * Math.PI / 180
    End Function
    Private Sub DrawCurves(ByVal gr As System.Drawing.Graphics)
        Dim mypen As New Pen(Color.DarkBlue, 2)
        For iter = 0 To 600
            ReDim Preserve vertext(iter)
            vertext(iter).X = iter
            Try
                vertext(iter).Y = Convert.ToSingle(Math.Sin(DegreeToRad(iter * 10))) * Convert.ToSingle(Math.Sin(DegreeToRad(iter))) * Convert.ToSingle(Math.Cos(DegreeToRad(iter * 2))) * 50 + Me.Height \ 2
                If iter > 0 Then
                    gr.DrawLine(mypen, vertext(iter - 1).X, vertext(iter - 1).Y, vertext(iter).X, vertext(iter).Y)
                End If
            Catch ex As Exception

            End Try

           
        Next

    End Sub
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        DrawCurves(e.Graphics)
    End Sub
End Class
1
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 févr. 2012 à 07:08
Bonjour,
Point est en effet une structure de VB.Net
Tapez le texte de l'url ici.
Après avoir lu le lien MSDN Ci-dessus ===>> apprends ce que sont les structures et comment on les utilise ====>> MSDN également ===>>
Tapez le texte de l'url ici.
Cela devrait te permettre de savoir ce que tu écrits.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
26 févr. 2012 à 12:01
aussi
DrawPolygon ne convient pas c'est pour dessiner
un polygone une figure fermé
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
26 févr. 2012 à 12:09
plutot dessiner dans un panel
donc

public Class Form1
    Private vertext() As PointF

    Private Function DegreeToRad(ByVal deg As Integer) As Double
        'traduit les degrée en radian
        Return deg * Math.PI / 180
    End Function
    Private Sub DrawCurves(ByVal gr As System.Drawing.Graphics, ByVal mypanel As Panel)
        Dim mypen As New Pen(Color.DarkBlue, 2)
        For iter = 0 To 600
            ReDim Preserve vertext(iter)
            vertext(iter).X = iter
            Try
                vertext(iter).Y = Convert.ToSingle(Math.Sin(DegreeToRad(iter * 10))) * Convert.ToSingle(Math.Sin(DegreeToRad(iter))) * Convert.ToSingle(Math.Cos(DegreeToRad(iter * 2))) * 50 + mypanel.Height \ 2
                If iter > 0 Then
                    gr.DrawLine(mypen, vertext(iter - 1).X, vertext(iter - 1).Y, vertext(iter).X, vertext(iter).Y)
                End If
            Catch ex As Exception

            End Try
        Next
    End Sub
    
    Private Sub Panel1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
        DrawCurves(e.Graphics, DirectCast(sender, Panel))
    End Sub
End Class
0
kobeymane Messages postés 58 Date d'inscription dimanche 29 janvier 2012 Statut Membre Dernière intervention 29 avril 2012
26 févr. 2012 à 16:46
bonjour,
après avoir lu vos précieuses réponses je n'ai pas pu saisir les deux derniers programmes mais pour ce code
ReDim Preserve curvepoints(t)
 curvepoints(t) = Point(t, sc) 

ça me parait bien. et puisque ça veut pas marcher avec drawpolygone je veux essayer avec drawcurve. je veux bien le faire avec la proposition de M.ShayW
curvepoints(t) = Point(t, sc)

mais l'erreur "point est un type et ne peut pas etre utilisé en tant qu'expression" existe encore.
Comment la résoudre? est ce que je peux faire:

Dim curvepoints() As Point

puis utiliser drawcurve ?

ça me parait plus facile en tant que débutant
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 févr. 2012 à 16:52
As-tu ouvert (et lu) les deux liens que je t'ai demandé de lire ?
Apparemment non !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
kobeymane Messages postés 58 Date d'inscription dimanche 29 janvier 2012 Statut Membre Dernière intervention 29 avril 2012
26 févr. 2012 à 18:36
je l'ai lu mais cela ne repond pas a mes besoins
ce que je veux moi c'est un tutorial a suivre pour:
Declarer un Tableau de points pt()
Affecter a chaque case de ce tableau un point de coordonnées t et sc tout au long de l'execution de la boucle for
Après avoir eu le tableau de 100 points, LIER ces points à l'aide de la méthode drawcurve et enfin affecter le bitmap à la picturebox pour afficher le graphe. C'est une simple demande qui necessite pas la lecture des pages en anglais pour enfin ne rien comprendre.
si vous avez la réponse à ma question d'ailleur c'est pourquoi je m'adresse à vous donnez la sinon dites que vous ne savez pas
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
26 févr. 2012 à 21:15
je t'ai donné un exemple pour dessiner
le graph d'une fonction trigonometrique dans
un control panel
DrawCurves qui a deux parametres
un le system.drawing.graphics
le second un control panel
important
il faut appeler la sub drawcurves dans l'évenement paint de la panel
 Private Sub Panel1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
        DrawCurves(e.Graphics, DirectCast(sender, Panel))
    End Sub

ne pas oublier les fonctions trigonometrique sont en radian

je t'ai dit
au lieu de
Dim curvepoints As Point()


Dim curvepoints() As Point

curvepoints est un array de point
for i = 0 to 100
   redim preserve curvepoints(i)
   curvepoints(i).X = abscissa
   curvepoints(i).Y = coordinates
0
kobeymane Messages postés 58 Date d'inscription dimanche 29 janvier 2012 Statut Membre Dernière intervention 29 avril 2012
26 févr. 2012 à 22:46
votre exemple était bénéfique mais avec vos retouches le nouveau programme ne me permet pas de saisir les données (voir le code) du coup le compilateur concidère les chaines vides comme des valeurs infinies et donc des erreurs de compilation:
Public Class Form1

Dim g As Graphics

Dim curvepoints() As PointF

Public Function DegreeToRad(ByVal deg As Integer) As Double

Return deg * Math.PI / 180

End Function

Public Sub DrawCurves(ByVal gr As System.Drawing.Graphics, ByVal mypanel As Panel)

Dim blackPen As New Pen(Color.Black)
Dim t, sc As Single
Dim k, ord As Integer
Dim f0, T0, amp, moy As Single

T0 = CType(TextBox1.Text, Single) / 1000 'conversion de la période en (ms)
f0 = 1 / T0
amp = CType(TextBox2.Text, Single) 'amplitude
moy = CType(TextBox3.Text, Single) 'moyenne
ord = CType(TextBox4.Text, Integer) 'ordre

For t = 0 To 100 Step 0.1
sc = moy
For k = 1 To ord
sc = sc + (4 * amp / Math.PI) * Math.Sin(DegreeToRad((2 * k - 1) * 2 * Math.PI * f0 * t)) / (2 * k - 1)
Next k

ReDim Preserve curvepoints(t)
curvepoints(t).X = t
curvepoints(t).Y = sc

Next t

End Sub

Public Sub Panel1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint

DrawCurves(e.Graphics, DirectCast(sender, Panel))

End Sub

End Class

Que dois-je faire pour résoudre le problème ??
0
kobeymane Messages postés 58 Date d'inscription dimanche 29 janvier 2012 Statut Membre Dernière intervention 29 avril 2012
26 févr. 2012 à 22:48
salut,
votre exemple était bénéfique mais avec vos retouches le nouveau programme ne me permet pas de saisir les données (voir le code) du coup le compilateur concidère les chaines vides comme des valeurs infinies et donc des erreurs de compilation:
Public Class Form1

    Dim g As Graphics

    Dim curvepoints() As PointF

    Public Function DegreeToRad(ByVal deg As Integer) As Double

        Return deg * Math.PI / 180

    End Function

    Public Sub DrawCurves(ByVal gr As System.Drawing.Graphics, ByVal mypanel As Panel)

        Dim blackPen As New Pen(Color.Black)
        Dim t, sc As Single
        Dim k, ord As Integer
        Dim f0, T0, amp, moy As Single

        T0 = CType(TextBox1.Text, Single) / 1000    'conversion de la période en (ms)
        f0 = 1 / T0
        amp = CType(TextBox2.Text, Single) 'amplitude
        moy = CType(TextBox3.Text, Single) 'moyenne
        ord = CType(TextBox4.Text, Integer) 'ordre

        For t = 0 To 100 Step 0.1
            sc = moy
            For k = 1 To ord
                sc = sc + (4 * amp / Math.PI) * Math.Sin(DegreeToRad((2 * k - 1) * 2 * Math.PI * f0 * t)) / (2 * k - 1)
            Next k

            ReDim Preserve curvepoints(t)
            curvepoints(t).X = t
            curvepoints(t).Y = sc

        Next t

    End Sub

    Public Sub Panel1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint

        DrawCurves(e.Graphics, DirectCast(sender, Panel))

    End Sub

End Class


Que dois-je faire pour résoudre le problème ??
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
26 févr. 2012 à 23:26
For t = 0 To 100 Step 0.1 ?
pourquoi step 0.1
puisque t représente un pixel pour chaque
abscisse
c'est un écran pas une feuille millimetrée
sert toi du debugger et verifie la valeur de
t sc
0
kobeymane Messages postés 58 Date d'inscription dimanche 29 janvier 2012 Statut Membre Dernière intervention 29 avril 2012
15 mars 2012 à 00:39
salut,
voila que j'ai copié le premier programme qou vous m'avez donné ça a bien marché, j'ai bien vu votre courbe c'était bon, alors maintenant j'ai essayé de l'appliquer dans mon programme mais ça tombe mal et je ne sais pas pourquoi cela m'affiche en fin de compte une ligne horizentale et c'est tout
voici le programme donc. il fournit deux tableaux: temps(1200) pour l'axe des abcisses et sc(1200) pour l'axe des ordonnées:
'module pour les declarations
Public Module Module1
    Public T0, amp, moy, rap, coup, bandemin, bandemax, gain, puissmoy, puissdef As Single
    Public Cn, an, bn, phin, puls As Single
    Public ord As Short
    Public temps(1201) As Integer
    Public Cnnn(1201), phinnn(1201) As Single
    Public omegaa(1201) As Single
    Public Cnfiltre(1201), phinfiltre(1201) As Single
    Public frequ(1201) As Single
    Public A, omega, omegac, Q As Single
    Public i, j, k As Integer
    Public sc(1200), st(1200), sds(1200), sma(1200), sba(1200) As Single


    Public Function DegreeToRad(ByVal deg As Integer) As Double
        Return deg * Math.PI / 180
    End Function

End Module

'la sub poour la saisie
Public Sub valider_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles valider.Click
T0 = CType(periode.Text, Single) / 1000
        amp = CType(amplitude.Text, Single)
        ord = CType(ordre.Text, Short)
        moy = CType(moyenne.Text, Single)
If paire.Checked = True Then
            bn = 0
            paire.Enabled = False
            impaire.Enabled = False
        End If

        If impaire.Checked = True Then
            an = 0
            impaire.Enabled = False
            paire.Enabled = False
        End If
Public Sub carre_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles carre.CheckedChanged
        Dim t, k, n As Integer


        rapport.Visible = True
        Label6.Visible = True
        Label12.Visible = True

        If an = 0 Then
'la partie calcul qui me retourne le s(t) enfin
            For t = 0 To 1200

                temps(t) = t

                For k = 1 To ord

                    n = 2 * k - 1

                    sc(t) += moy + (4 * amp / (n * DegreeToRad(Math.PI))) * Math.Cos((n * 2 * DegreeToRad(Math.PI) / T0) * temps(t) - (DegreeToRad(Math.PI / 2)))

                Next k


            Next t

        End If

        If bn = 0 Then

            For t = 0 To 1200

                temps(t) = t

                For k = 1 To ord

                    n = 2 * k - 1

                    sc(t) += moy + (4 * amp / (n * DegreeToRad(Math.PI))) * Math.Cos((n * 2 * DegreeToRad(Math.PI) / T0) * temps(t) + 0)

                Next k
                
            Next t
        End If

    End Sub
'apres avoir eu le sc(t) l'axe des ordonnées on dessine la courbe (t.sc(t))

Private Sub DrawCurves(ByVal gr As System.Drawing.Graphics, ByVal mypanel As Panel)

        Dim mypen As New Pen(Color.DarkBlue, 2)

        For iter = 0 To 1200

            ReDim Preserve vertext(iter)

            vertext(iter).X = iter

            Try

                vertext(iter).Y = Convert.ToSingle(sc(iter)) * 10000 + mypanel.Height \ 2

                If iter > 0 Then

                    gr.DrawLine(mypen, vertext(iter - 1).X, vertext(iter - 1).Y, vertext(iter).X, vertext(iter).Y)

                End If

            Catch ex As Exception

            End Try

        Next

    End Sub


    Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint

        DrawCurves(e.Graphics, DirectCast(sender, Panel))

    End Sub


bn=0 si un radiobutton'paire' est coché
an=0 si un radiobutton'impaire est coché
on peut pas choisir à la fois paire et impaire.

il y a une semaine que j'essaye de detecter l'erreur mais je vois rien. j'ai besoin de vos aiiiiiiiiiiiides. Merci
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
15 mars 2012 à 12:01
Salut

j'ai essayé de l'appliquer dans mon programme mais ça tombe mal et je ne sais pas pourquoi cela m'affiche en fin de compte une ligne horizentale et c'est tout


dis moi quelle fonction veux tu tracer ?
0
kobeymane Messages postés 58 Date d'inscription dimanche 29 janvier 2012 Statut Membre Dernière intervention 29 avril 2012
15 mars 2012 à 13:45
bonjour
la fonction que je veux tracer comporte des calcculs complexes. l'expression générale d'un signal carré par exemple est:
s(t)=moyenne+ sigma de n=1 à un ordre de (Cn*Cos(n*2*pi/T0 + phin))

les paramètres sont saisis au clavier par l'utilisateur:
moy: moyenne
T0 : période
ord: ordre
Cn : amplitude déduit selon la parité du signal (elle même a une autre expression mathématique qui dépend de l'amlitude saisie et le n)
phin: le déphasage du signal dépend lui aussi des paramètres saisis par l'utilsateur.

après l'affectation de ces paramètres au variables décrites je calcul le s(t) et je stock la valeur dans le tableau sc() à l'aide des deux boucles for.

une fois j'ai les sc(t) pour t variant de 0 à 1200
j'ai donc le tableau des abcisses t et les ordonnés sc(t) donc j'utilise un tableau de points vertext(): pour les X j'affecte les 't' et pour les Y j'affecte 'sc(t)' et commeça je trace point par point ma courbe représentant le graph temporel d'un signal carré.

Voila que je vous ai expliqué le signal carré, ses paramètres, son calcul, affectation et algorithme pour tracer son graphe temporel, je vous demande de detecter pourquoi ça me donne une ligne horizentale dans le form3. MERCI
0
kobeymane Messages postés 58 Date d'inscription dimanche 29 janvier 2012 Statut Membre Dernière intervention 29 avril 2012
16 mars 2012 à 00:29
salut,
grace à l'éxecution pas à pas j'ai trouvé que l'erreur n'existait ni au niveau du calcul ni au niveau de dessin mais c'était une erreur de saisie dans mon interface.
j'ai corrigé une partie du problème mais le grand travail m'attend encore. j'ai surmonté le blocage grace à vous Shayw GRAAAAAAAND MERCI ça avance enfin
0
Rejoignez-nous