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.
A voir également:
Tracer courbe
Tracer une courbe a partir d'un tableau de valeur - Meilleures réponses
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
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
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
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
ç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:
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
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
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
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
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
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
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
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
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
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