Bonjour,
Je travaille actuellement sur un projet qui consiste à développer un programme de simulation de chemin de fer, dans lequel je dois présenter une carte avec un ensemble de lignes de chemin de fer et de trains y circulant etc.., et j'en suis donc à coder les bases nécessaires à son bon fonctionnement et malgré des heures d'acharnement je n'ai pas réussi à coder la fonction "parfaite" pour le déplacement d'un train d'un point à un autre.
Ce que je veux dire par là, c'est que lorsque je déplace le point représentant mon train sur une ligne qui est oblique, le point peut prendre un chemin bizarre, une vidéo pour visualiser :
Le train (point rouge) arrive toujours à destination (points blancs) mais prend des directions que je ne comprends pas... Voici le code de la fonction :
La fonction est lancée à chaque fois que mon timer tick, elle calcule le mouvement à faire en fonction de la position actuelle, de la destination et de la vitesse prédéfinie, les mouvements horizontales/verticales marchent très bien, et ceux obliquent arrivent à destination mais font des détours inexplicables.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 Private Sub avancerTrain() Dim posActuelle = t.getTete() Dim posArrivee = t.getArrivee() Dim v = vitesse If (posActuelle = posArrivee) Then 'Si on est arrivés à destination posActuelle = posArrivee nextDestination(posArrivee) ElseIf (posActuelle.x = posArrivee.x) Then 'Si le chemin à parcourir restant est horizontal If (posActuelle.y > posArrivee.y) Then 'S'il faut descendre posActuelle.y = posActuelle.y - v If (posActuelle.y < posArrivee.y) Then 'Si on a dépassé le point d'arrivée posActuelle = posArrivee End If Else 'S'il faut monter posActuelle.y = posActuelle.y + v If (posActuelle.y > posArrivee.y) Then 'Si on a dépassé le point d'arrivée posActuelle = posArrivee End If End If ElseIf (posActuelle.y = posArrivee.y) Then 'Si le chemin à parcourir restant est vertical If (posActuelle.x > posArrivee.x) Then 'S'il faut aller vers la gauche posActuelle.x = posActuelle.x - v If (posActuelle.x < posArrivee.x) Then 'Si on a dépassé le point d'arrivée posActuelle = posArrivee End If Else 'S'il faut aller vers la droite posActuelle.x = posActuelle.x + v If (posActuelle.x > posArrivee.x) Then 'Si on a dépassé le point d'arrivée posActuelle = posArrivee End If End If Else 'Si le chemin à parcourir est oblique Dim x1 = min(posActuelle.X, posArrivee.X) Dim x2 = max(posActuelle.X, posArrivee.X) Dim y1 = min(posActuelle.Y, posArrivee.Y) Dim y2 = max(posActuelle.Y, posArrivee.Y) Dim coeff = (x2 - x1) / (y2 - y1) v = vitesse / coeff posActuelle.X = posActuelle.x + coeff * v If (posActuelle.y > posArrivee.y) Then posActuelle.y = posActuelle.y - v Else posActuelle.y = posActuelle.y + v End If End If t.setTete(posActuelle) pnlBoard.Refresh() End Sub
Je ne l'ai pas montré sur la vidéo, mais lorsque j'augmente suffisamment la vitesse du train (à partir du moment où elle est à x5) le chemin qu'il prend est tout à fait normal (j'ai testé au pas à pas), sur la vidéo elle est à x1 et j'ai le même problème en vitesse x2.
Je pourrais bien augmenter la vitesse de base mais ce serait un peu tricher...
Je sais plus vraiment quoi faire à partir de là, c'est la première fois que je me retrouve à coder des déplacements obliques et mes recherches sur le net ne m'ont pas plus aidé que ça, si quelqu'un pouvait m'apporter un indice ce serait sympa, merci d'avance.
Partager