ça avance doucement mais surement
un petit bug
si on ferme (clique sur X) pendant le mouvement
il faut après cliquer sur le carré end
pour terminer
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionAllez maintenant tu nous code ça en .NET Si si ....
Option Explicit On Public Class Form1 Private Structure mes_params Dim coef As Single Dim constante As Single Dim incli As String Dim sensx As Integer Dim sensy As Integer End Structure Dim pt_d, pt_f As Point Dim encours As Boolean Dim Temoin As New PictureBox Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 'tout ce qui estr ici est sans intérêt : juste pour initialiser chaque chose. With Me .WindowState = FormWindowState.Maximized End With With Temoin .Bounds = New Rectangle(100, 100, 20, 20) .BackColor = Color.White .BorderStyle = BorderStyle.FixedSingle End With Me.Controls.Add(Temoin) pt_d = New Point(0, 200) End Sub Private Sub Form_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseDown 'chaque fois que l'on clique sur le form, on modifie la position de l'extrêmité et on donne à la première les coordonées de la précédente If encours Then Exit Sub pt_f = New Point(e.X, e.Y) allons() End Sub Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint e.Graphics.DrawLine(Pens.Black, pt_d, pt_f) End Sub Private Sub allons() ' on utilise ici les résultats algébriques (mais aussi autres) de la fonction param_droite encours = True Dim x1 As Integer, x2 As Integer, y1 As Integer, y2 As Integer, i As Integer, duree As Single x1 = pt_d.X x2 = pt_f.X y1 = pt_d.Y y2 = pt_f.Y duree = 0.1 With param_droite(x1, x2, y1, y2) Select Case .incli Case "V" ' on traite bien évidemment différemment le cas d'une droite parfaitement verticale For i = y1 To y2 Step 3 * .sensy temoin.Left = x1 temoin.Top = i attente(duree) Next encours = False Case "H" ' ' on traite bien évidemment différemment le cas d'une droite parfaitement horizontale For i = x1 To x2 Step 3 * .sensx temoin.Left = i temoin.Top = y1 attente(duree) Next encours = False Case Else ' pour "modérer" la vitesse, on va détermier le "décalage" le plus important : celui des ordonnées ou celui des abscisses ? If Math.Abs(x1 - x2) >= Math.Abs(y1 - y2) Then ' si décalage abscisses plus important ; on fit varier les abscisses For i x1 To x2 Step 3 * .sensx ' sensx -1 ou +1 selon que abscisses décroissantes ou croissantes Temoin.Left = i Temoin.Top = (.coef * i) + .constante attente(duree) Next Else ' si décalage ordonnées plus important, on fait varier les ordonnées For i y1 To y2 Step 3 * .sensy ' sensx -1 ou +1 selon que ordonnées décroissantes ou croissantes Temoin.Top = i Temoin.Left = (i - .constante) / .coef attente(duree) Next End If End Select End With encours = False End Sub Private Function param_droite(ByVal x1 As Integer, ByVal x2 As Integer, ByVal y1 As Integer, ByVal y2 As Integer) As mes_params 'voilà la seule fonction intéressante : celle qui utilise l'algèbre ' et traite les cas particuliers (horizontale et verticales pures) With param_droite .sensx = 1 .sensy = 1 If x1 = x2 Then .coef = 0 .constante = 0 .incli = "V" If y2 < y1 Then .sensy = -1 Else If y1 y2 Then .incli "H" .coef = (y1 - y2) / (x1 - x2) .constante = y1 - (.coef * x1) If x2 < x1 Then .sensx = -1 ' on est dans le cas d'abscisses décroissantes If y2 < y1 Then .sensy = -1 ' on est dans le cas d'ordonnées décroissantes End If End With Return param_droite End Function Private Sub attente(ByVal duree As Single) Threading.Thread.Sleep(duree) Me.Refresh() End Sub End Class
Option Explicit On Public Class Form1 Private Structure mes_params Dim coef As Single Dim constante As Single Dim incli As String Dim sensx As Integer Dim sensy As Integer End Structure Dim pt_d, pt_f As Point Dim encours As Boolean Dim Temoin As New PictureBox Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 'tout ce qui estr ici est sans intérêt : juste pour initialiser chaque chose. With Me .WindowState = FormWindowState.Maximized End With With Temoin .Bounds = New Rectangle(100, 100, 20, 20) .BackColor = Color.White .BorderStyle = BorderStyle.FixedSingle End With Me.Controls.Add(Temoin) pt_d = New Point(0, 200) End Sub Private Sub Form_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseDown 'chaque fois que l'on clique sur le form, on modifie la position de l'extrêmité et on donne à la première les coordonées de la précédente If encours Then Exit Sub pt_f = New Point(e.X, e.Y) allons() End Sub Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint e.Graphics.DrawLine(Pens.Black, pt_d, pt_f) End Sub Private Sub allons() ' on utilise ici les résultats algébriques (mais aussi autres) de la fonction param_droite encours = True Dim x1 As Integer, x2 As Integer, y1 As Integer, y2 As Integer, i As Integer, duree As Single x1 = pt_d.X x2 = pt_f.X y1 = pt_d.Y y2 = pt_f.Y duree = 50 With param_droite(x1, x2, y1, y2) Select Case .incli Case "V" ' on traite bien évidemment différemment le cas d'une droite parfaitement verticale For i = y1 To y2 Step 3 * .sensy temoin.Left = x1 temoin.Top = i attente(duree) Next encours = False Case "H" ' ' on traite bien évidemment différemment le cas d'une droite parfaitement horizontale For i = x1 To x2 Step 3 * .sensx temoin.Left = i temoin.Top = y1 attente(duree) Next encours = False Case Else ' pour "modérer" la vitesse, on va détermier le "décalage" le plus important : celui des ordonnées ou celui des abscisses ? If Math.Abs(x1 - x2) >= Math.Abs(y1 - y2) Then ' si décalage abscisses plus important ; on fit varier les abscisses For i x1 To x2 Step 3 * .sensx ' sensx -1 ou +1 selon que abscisses décroissantes ou croissantes Temoin.Left = i Temoin.Top = (.coef * i) + .constante attente(duree) Next Else ' si décalage ordonnées plus important, on fait varier les ordonnées For i y1 To y2 Step 3 * .sensy ' sensx -1 ou +1 selon que ordonnées décroissantes ou croissantes Temoin.Top = i Temoin.Left = (i - .constante) / .coef attente(duree) Next End If End Select End With If encours Then pt_d = pt_f encours = False End Sub Private Function param_droite(ByVal x1 As Integer, ByVal x2 As Integer, ByVal y1 As Integer, ByVal y2 As Integer) As mes_params 'voilà la seule fonction intéressante : celle qui utilise l'algèbre ' et traite les cas particuliers (horizontale et verticales pures) With param_droite .sensx = 1 .sensy = 1 If x1 = x2 Then .coef = 0 .constante = 0 .incli = "V" If y2 < y1 Then .sensy = -1 Else If y1 y2 Then .incli "H" .coef = (y1 - y2) / (x1 - x2) .constante = y1 - (.coef * x1) If x2 < x1 Then .sensx = -1 ' on est dans le cas d'abscisses décroissantes If y2 < y1 Then .sensy = -1 ' on est dans le cas d'ordonnées décroissantes End If End With Return param_droite End Function Private Sub attente(ByVal duree As Single) Threading.Thread.Sleep(duree) Me.Refresh() End Sub End Class
Ce n'est pas ici, qu'il faut le mettre (il va être perdu).
C'est en déposer le source, qu'il te faut faire !