Option Explicit Private Type Point x As Single y As Single End Type Private Type Segment Point1 As Point Point2 As Point Longueur As Single End Type
Private Sub Procéder(Lst() As Point, Pas As Single) Dim i As Long, n As Long, Sgm As Segment, Sgms() As Segment Dim x1 As Single, x2 As Single, dx As Single, y1 As Single, y2 As Single, dy As Single Dim L() As Single, a As Long, b As Long, c As Long Dim u As Single, k As Single, d As Single Dim xa As Single, ya As Single, xb As Single, yb As Single, x As Single, y As Single Dim a0 As Long 'Récupération du nombre de segments n = UBound(Lst) - 1 'Construction et dessin des segments ReDim Sgms(0 To n) For i = 1 To n With Sgm .Point1 Lst(i): .Point2 Lst(i + 1) x1 .Point1.x: x2 .Point2.x: dx = x1 - x2 y1 .Point1.y: y2 .Point2.y: dy = y1 - y2 .Longueur = Sqr(dx * dx + dy * dy) Accueil.Line (x1, y1)-(x2, y2) Accueil.PSet (x2, y2) End With Sgms(i) = Sgm Next i 'Construction de la fonction de linéarisation ReDim L(0 To n + 1) L(1) = 0 For i = 2 To n + 1 L(i) = L(i - 1) + Sgms(i - 1).Longueur Next i 'Calcul et affichage des points i 0: a0 1 Do d = i * Pas If d > L(n + 1) Then Exit Do Else 'Calcul et affichage du point If d = L(n + 1) Then a n: u Sgms(n).Longueur Else a a0: b n + 1 Do If b - a = 1 Then Exit Do Else c = Int((a + b) / 2) If d < L(c) Then b c Else a c End If Loop End If Sgm = Sgms(a) u = d - L(a) k = u / Sgm.Longueur With Lst(a) xa .x: ya .y End With With Lst(b) xb .x: yb .y End With x = xa + k * (xb - xa) y = ya + k * (yb - ya) Accueil.Circle (x, y), 2, RGB(255, 0, 0) 'Itération i i + 1: a0 a End If Loop End Sub
AutoRedraw True, ScaleMode 3 (Pixel)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionComment peux-tu penser à calculer/définir une vitesse sans les deux paramètres qui sont à la base même de sa définition (durée et distance) ???
Je ne cherche pas à calculer la vitesse de déplacement, c'est une donnée de départ.
c'est que je souhaiterais un clignotement du point régulier (sauf pour la toute fin du mouvement), donc je ne souhaite pas faire varier la période du timer. Si c'est possible, bien entendu.
Si tu as des explication un peu plus précises sur ce que tu suggères, je pourrais peut-être mieux l'appréhender et le développer
(sauf pour la toute fin du mouvement)
Option Explicit Private Type Point x As Single y As Single End Type Private Type Segment Point1 As Point Point2 As Point Longueur As Single End Type Dim Points() As Point Dim PointsDuFilm() As Point Dim IterationAffichage As Integer Private Sub Form_Load() ReDim PointsDuFilm(0 To 0) ReDim Points(0 To 6) Points(0).x = 0 ' ignoré Points(0).y = 0 'ignoré Points(1).x = 100 Points(1).y = 220 Points(2).x = 100 Points(2).y = 300 Points(3).x = 120 Points(3).y = 300 Points(4).x = 500 Points(4).y = 130 Points(5).x = 510 Points(5).y = 140 Points(6).x = 500 Points(6).y = 340 End Sub Private Sub Proceder(Lst() As Point, Pas As Single) Dim i As Long, n As Long, Sgm As Segment, Sgms() As Segment Dim x1 As Single, x2 As Single, dx As Single, y1 As Single, y2 As Single, dy As Single Dim L() As Single, a As Long, b As Long, c As Long Dim u As Single, k As Single, d As Single Dim xa As Single, ya As Single, xb As Single, yb As Single, x As Single, y As Single Dim a0 As Long 'Récupération du nombre de segments n = UBound(Lst) - 1 'Construction et dessin des segments ReDim Sgms(0 To n) For i = 1 To n With Sgm .Point1 Lst(i): .Point2 Lst(i + 1) x1 .Point1.x: x2 .Point2.x: dx = x1 - x2 y1 .Point1.y: y2 .Point2.y: dy = y1 - y2 .Longueur = Sqr(dx * dx + dy * dy) Accueil.Line (x1, y1)-(x2, y2) Accueil.PSet (x2, y2) End With Sgms(i) = Sgm Next i 'Construction de la fonction de linéarisation ReDim L(0 To n + 1) L(1) = 0 For i = 2 To n + 1 L(i) = L(i - 1) + Sgms(i - 1).Longueur Next i 'Calcul et affichage des points i 0: a0 1 Do d = i * Pas If d > L(n + 1) Then Exit Do Else 'Calcul et affichage du point If d = L(n + 1) Then a n: u Sgms(n).Longueur Else a a0: b n + 1 Do If b - a = 1 Then Exit Do Else c = Int((a + b) / 2) If d < L(c) Then b c Else a c End If Loop End If Sgm = Sgms(a) u = d - L(a) k = u / Sgm.Longueur With Lst(a) xa .x: ya .y End With With Lst(b) xb .x: yb .y End With x = xa + k * (xb - xa) y = ya + k * (yb - ya) ReDim Preserve PointsDuFilm(0 To UBound(PointsDuFilm) + 1) PointsDuFilm(UBound(PointsDuFilm)).x = x PointsDuFilm(UBound(PointsDuFilm)).y = y 'Accueil.Circle (x, y), 2, RGB(255, 0, 0) 'Itération i i + 1: a0 a End If Loop End Sub Private Sub Command1_Click() Accueil.Cls Call Proceder(Points(), CSng(Text1.Text)) IterationAffichage = 1 Timer1.Interval = CSng(Text2.Text) Timer1.Enabled = True End Sub Private Sub Timer1_Timer() Accueil.AutoRedraw = False Accueil.Cls Accueil.Circle (PointsDuFilm(IterationAffichage).x, PointsDuFilm(IterationAffichage).y), 2, RGB(255, 0, 0) If IterationAffichage UBound(PointsDuFilm) Then Timer1.Enabled False IterationAffichage = IterationAffichage + 1 End Sub