Suivi de trajectoire

Soyez le premier à donner votre avis sur cette source.

Vue 10 661 fois - Téléchargée 393 fois

Description

Bonsoir,
Ca fait un petit moment que j'ai rien poster... Faut dire que je sais pas vraiment quoi mettre, malgré le fait que j'ai pas mal de projets terminés, et pas mal.

Bref ce programme permet de faire suivre une trajectoire à un objet (ici une PictureBox), en créant des points à n'importe quel endroit de la feuille.

Source / Exemple :


Public Class Form1

    Dim Trajet(0, 1), Max, n As Integer
    Dim Dwn As Boolean

    Sub Projeter(ByVal Element As PictureBox)
        'Cette procédure sert à projeter l'objet en fonction de la trajectoire.
        'Le déplacement est basique ici^^.
        '----------------------------------------NOTE (IMPORTANTE?)-------------------------------
        'Note: Trajet(x,0) représente l'abscisse, et Trajet(x,1) représente l'ordonnée (au cas où_
        'vous ne l'auriez pas deviné^^).
        '-----------------------------------------------------------------------------------------
        With Element
            'Width/2 et Height/2 permettent de placer le centre de l'objet sur le point (ça fait moins moche ;-)^^).
            .Left = Trajet(n, 0) - (.Width / 2)
            .Top = Trajet(n, 1) - (.Height / 2)
        End With
        'On passe à la ligne suivante du tableau.
        n = n + 1
    End Sub

    Private Sub timLoad_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timLoad.Tick
        'Ce Timer permet de générer aléatoirement des points pour constituer la trajectoire.
        Dim a As Integer
        'Tant qu'on peut faire des points,
        For a = 0 To Max
            'On active la fonction Randomize pour plus de suspense^^.
            Randomize()
            'On génère une valeur aléatoire à l'aide de la fonction Rnd() pour les 2 coordonnées.
            Trajet(a, 0) = Int(Rnd() * Me.Width)
            Trajet(a, 1) = Int(Rnd() * Me.Height)
            'On dessine le point correspondant à cette dernière trajectoire.
            Me.CreateGraphics.FillEllipse(Brushes.Black, Trajet(a, 0), Trajet(a, 1), 10, 10)
        Next
        'Une fois les points de la trajectoire générés, on n'a plus besoin de ce Timer.
        timLoad.Enabled = False
        'Du coup, on active celui qui permet de déplacer l'objet en fonction de cette trajectoire.
        timTrj.Enabled = True
    End Sub

    Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
        'Si l'utilisateur appuie sur la touche "Entrée", on lance le Timer permettant de déplacer l'élément_
        'en fonction de la trajectoire, tout en remettant n à zéro.
        If e.KeyCode = Keys.Return Then
            n = 0
            timTrj.Enabled = True
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'On demande si la trajectoire doit être générée aléatoirement ou si l'utilisateur_
        'préfère tracer lui-même la trajectoire.
        If MsgBox("Voulez-vous générer la trajectoire?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
            timLoad.Enabled = True
        Else
            MsgBox("Cliquez pour créer un point." & vbCrLf & "Appuyez sur ""Entrée"" pour suivre la trajectoire.", MsgBoxStyle.Information)
        End If
        'Note: vous pouvez modifier les 2 valeurs suivantes à votre guise (accès plus simple ici qu'ailleurs^^).
        '-------------------------------------------------------------------------------------------------------
        'On fixe le maximum de points permettant de tracer la trajectoire de l'objet.
        Max = 1000
        'On règle l'intervalle
        timTrj.Interval = 100
        'On redimensionne le tableau mémorisant la trajectoire en fonction de la valeur du maximum.
        'Note: ça ne sert à rien de préserver les valeurs du tableau, puisqu'il n'y en n'a pas^^.
        ReDim Trajet(Max, 1)
        'Ces instructions permettaient de faire un test.
        '-----------------------------------------------
        'Dim a As Integer
        'For a = 0 To 4
        'Trajet(a, 0) = 50
        'Trajet(a, 1) = 250 - (50 * (a + 1))
        'Next
        'For a = 5 To 7
        'Trajet(a, 0) = 50 + (30 * (a - 4))
        'Trajet(a, 1) = 0
        'Next
        'timTrj.Enabled = True
    End Sub

    Private Sub timTrj_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timTrj.Tick
        'Timer permettant de déplacer l'objet selon la trajectoire.
        '----------------------------------------------------------
        'Si les coordonnées sont différentes de (0,0) (->ça signifie qu'aucun point n'est mémorisé dans cette ligne,_
        'bien qu'on puisse définir un point à cet endroit... Mais ça évite de déplacer l'objet alors que ça n'a pas_
        'été demandé.
        If Not (Trajet(n, 0) = 0 And Trajet(n, 1) = 0) Then
            'On vérifie qu'on ne dépasse pas le maximum de points autorisés.
            If n <= Max Then Projeter(picMain) Else GoTo Condition
        Else
            GoTo Condition
        End If
        Exit Sub
Condition:
        'Dans les cas inverses:
        'On désactive le Timer car l'objet n'a plus à être déplacé;
        timTrj.Enabled = False
        Dim a As Integer
        'On vide le tableau afin d'effacer l'ancienne trajectoire;
        For a = 0 To Max
            Trajet(a, 0) = 0
            Trajet(a, 1) = 0
        Next
        'Et on remet n à zéro afin de recommencer la trajectoire depuis le début.
        n = 0
    End Sub

    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        'On note que le click est enclenché.
        Dwn = True
        'On s'assure de ne pas dépasser la limite des points à tracer.
        If n < Max Then
            PointIt(e)
        End If
    End Sub

    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        'C'est la même chose que pour l'instruction MouseDown, seulement on trace les points tant que_
        'l'utilisateur déplace la souris, dans la limite des points de trajectoire disponibles.
        If Dwn = True Then
            If n < Max Then
                PointIt(e)
            End If
        End If
    End Sub

    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        'On indique que le click n'est plus enfoncé pour l'instruction MouseMove.
        Dwn = False
    End Sub

    Sub PointIt(ByVal EventSouris As System.Windows.Forms.MouseEventArgs)
        'On mémorise l'emplacement du point actuel dans le tableau Trajet.
        Trajet(n, 0) = EventSouris.X
        Trajet(n, 1) = EventSouris.Y
        'On créé un point dès que l'utilisateur clique sur la form.
        Me.CreateGraphics.FillEllipse(Brushes.Black, Trajet(n, 0), Trajet(n, 1), 10, 10)
        'On incrémente n pour passer à la prochaine ligne du tableau.
        n = n + 1
    End Sub
End Class

Conclusion :


Les points sont mémorisés dans un tableau aux dimensions étirables, puis affichés un à un et enfin suivis par l'objet.

Il n'y a vraiment rien de compliqué, seulement à la base, je voulais faire chercher le chemin automatiquement par l'objet (ici c'est simplifié, ça se déplace directement sur le point).

Surement que je mettrai à jour en améliorant ça^^ (ça ferait mieux du coup :p).

Voilà, n'hésitez pas à commenter si besoin!

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
71
Date d'inscription
dimanche 12 octobre 2003
Statut
Membre
Dernière intervention
9 janvier 2009

Bonjour Podan,
Tout d'abord merci :).
Ensuite, pour ta question, il faudrait inclure des boucles incrémentant les variables dans le traçage des points (en définissant un intervalle de 1 entre chaque point) et dans lesquelles on incluerait la fonction à tracer.

Par exemple, pour une trajectoire rectiligne:

'Tracer une ligne de points
y=20
for x=0 to 100
Trajet(x,0)=x
Trajet(x,1)=y
Me.CreateGraphics.FillEllipse(Brushes.Black, Trajet(x, 0), Trajet(x, 1), 10, 10)
next
timTrj.enabled=true

Ceci devrait marcher, tenez-moi au courant ;)!
Messages postés
12
Date d'inscription
lundi 24 juillet 2006
Statut
Membre
Dernière intervention
14 novembre 2009

bonsoir je suis débutant ,prof de commande numérique
comment modifier ton code pour suivre une trajectoire rectiligne ou circulaire en traçant auparavant des segments ou des cercles au lieu de points quenconques.
bravo, merci très bien pour ce code qui correspond à ce que je cherche 10/10.
a+
Messages postés
71
Date d'inscription
dimanche 12 octobre 2003
Statut
Membre
Dernière intervention
9 janvier 2009

En fait j'ai fais ça pour la structure, mais c'est vrai que ça revient au même^^.
Merci pour ton commentaire, et pour ta note!

J'essaierai d'optimiser le déplacement de l'objet (comme je l'ai signalé plus haut).

Content de voir que tu n'aies pas soulevé le problème des points qui disparaîssent de la form^^. En fait les points devaient juste servir de repère pour voir comment l'objet se déplacerait (du point de vue de l'utilisateur).

Voilà, encore merci, et bonne soirée :)!
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
22
Salut,

Bien, sur le principe. Il y a sans doute 2 ou 3 choses qui pourraient être optimisées.
Les GoTo, en règle générale, dénotent une faiblesse dans l'algorithme.
Ici, ce gros paquet peut aisément être remplacé par un simple If.

# If Not (Trajet(n, 0) 0 And Trajet(n, 1) 0) Then
# 'On vérifie qu'on ne dépasse pas le maximum de points autorisés.
# If n <= Max Then Projeter(picMain) Else GoTo Condition
# Else
# GoTo Condition
# End If
# Exit Sub
# Condition:

deviendrait :

If Not (Trajet(n, 0) 0 And Trajet(n, 1) 0) And n <= Max Then
Projeter(picMain)
Exit Sub
End If


Pour le reste, rien à signaler, c'est propre :o)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.