Déplacement aléatoire d'une PictureBox dans une Form

Résolu
gege1505 Messages postés 54 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 7 août 2012 - 16 déc. 2011 à 18:46
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 19 déc. 2011 à 21:11
Bonjour, je cherche depuis longtemps à faire déplacer une pictureBox de manière aléatoire dans une Form, j'ai posé plein de questions, sur plein de forum différent, mais à chaque fois l'aide apporté n'était pas constructive.

J'ai déjà le Timer, et je voudrais que toutes les 30 secondes par exemple, la PictureBox soit redessinée, à un autre endroit (une autre position aléatoire) dans ma fenêtre.

Si quelqu'un à une idée, parce qu'en théorie ça me semble plutôt facile, mais là je sèche, à chaque fois que je corrige un problème, un autre survient.

Merci beaucoup.

59 réponses

Utilisateur anonyme
17 déc. 2011 à 23:25
Re:

Allez un peu du tout cuit :

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim Rand As New Random
        PictureBox1.Left = Rand.Next(Me.Width - PictureBox1.Width)
        PictureBox1.Top = Rand.Next(Me.Height - PictureBox1.Height)
    End Sub


CF2i - Guadeloupe
Ingénierie Informatique
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2011 à 14:00
Bonjour,

Il te faut alors (et après avoir déterminé les coordonnées de la destination) :
Déterminer l'équation linéaire y = ax + b de la droite reliant le point d'origine à celui de destination
utiliser un timer et faire "avancer" ta picturebox en faisant varier x dans l'équation ci-dessus.
Que de l'algèbre, quoi !


____________________
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
3
Utilisateur anonyme
16 déc. 2011 à 19:10
Bonsoir,

Donne donc le bout de code qui cloche.
0
Utilisateur anonyme
16 déc. 2011 à 23:54
Salut,

Tu devrais faire un random sur le PictureBox1.Left et PictureBox1.Top d'après moi...

Maintenant comme dit banana on a pas la moindre idée de comment tu t'y prends...

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
17 déc. 2011 à 22:47
Bonjour,

Au moment de changer de place, tu tire au hasard Random les corrdonnées x, y, tu invusibilise ton image, tu la déplace (left, top), et de nouveau tu la rends visible.

Cordialement, Joe.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
18 déc. 2011 à 10:42
Bonjour ACIVE

du tout cuit

On peut gouter ?
Il se peut que tu obtiendras la meme position
donc il faut dans loop jusqu'à que le rand
soi different de la location actuelle
maintenant autre endroit c'est à dire au moins
3 pixels si la difference est d'un pixel c'est
plus dur à discerner
surveiller que le picture soit dans le rectclient
0
Utilisateur anonyme
18 déc. 2011 à 12:17
Salut shay,

C'est pour ça que j'ai dit 'un peu du tout cuit' (tu peux pas goûter, il est encore au four)

Déjà je gère la les limites max de left et top, c'est déjà pas mal, tout dépend de ce qu'il veux faire exactement.

C'est sûr que s'il y a un pixel de différence on ne la verra même pas bouger mais laissons à gege quelque chose à faire...





CF2i - Guadeloupe
Ingénierie Informatique
0
gege1505 Messages postés 54 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 7 août 2012
18 déc. 2011 à 13:52
Bonjour, et merci beaucoup d'avoir tous répondu, oui je tiens à m'excuser je n'ai pas était très clair, désolé, c'est ma faute

En fait ce que je voudrais faire c'est que le déplacement de l'image ne se fasse pas comme une téléportation (ce que je savais déjà faire, mais merci pour votre participation et le code, c'est quand même très gentil) mais je voudrais vraiment voir le déplacement de l'image, un déplacement fluide, vous voyez ce que je veux dire ? Qu'on la voit parcourir la distance, la séparant de son ancienne position, à sa nouvelle position.

Merci beaucoup !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2011 à 14:21
Et si cela ne te dit vraiment rien, commence par cette lecture :
http://labomath.free.fr/qcms/seconde/equadroite/droites.pdf
en t'intéressant au paragraphe "Recherche de l'équation d'une droite"
En espérant que cela t'inspire quand même un peu, hein ... (étape indispensable).

____________________
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
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
18 déc. 2011 à 15:06
Salut Ucfoutu

il faut jouer aussi sur l'interval du timer
et aussi calculer le deltax et deltay
de combien bouger sur l'axe X et sur l'axe Y

il faut faire bouger de plusieur pixel
avec un pixel cela va etre trop lent ou trop
saccadé
donc faire des caculs
0
gege1505 Messages postés 54 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 7 août 2012
18 déc. 2011 à 15:08
Merci, impeccable, je n'avais pas fait le rapprochement avec mes vieux cours de math ^^
Merci, encore !
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
18 déc. 2011 à 20:36
Ah, voici un code complet et qui semble bon au test, si quelqu'un est capable d'éméliorer les calculs, peut être qu'on peut faire plus court ? Mais chat marche !

Option Explicit On
Public Class Form1
  Dim t As Integer = 1
  Dim x0 As Double
  Dim y0 As Double

  Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    WindowState = FormWindowState.Maximized
    x0 = PictureBox1.Left
    y0 = PictureBox1.Top
    Timer1.Interval = 1000
    Timer1.Enabled = True
  End Sub

  Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    t = t + 1
    Me.Text = t
    If t <> 5 Then Exit Sub
    Dim x1 As Integer
    Dim y1 As Integer
    '
    Randomize()
    x1 = Int(Me.Width - PictureBox1.Width + 1) * Rnd() + 1
    Randomize()
    y1 = Int((Me.Height - 50) - PictureBox1.Height + 1) * Rnd() + 1
    '
    Dim sensX As Integer = 1
    Dim difX As Long = x1 - x0
    Dim difY As Long = y1 - y0
    Dim pasY As Double
    Dim j As Double = y0
    Dim sens As String = "b"
    If x0 > x1 Then sensX = -1
    If difX < 0 Then difX = difX * -1
    If difY < 0 Then
      difY = difY * -1
      sens = "h"
    End If
    pasY = 1 / difX * difY
    For i = x0 To x1 Step sensX
      PictureBox1.Left = i
      If sens "h" Then j j - pasY
      If sens "b" Then j j + pasY
      PictureBox1.Top = j
    Next i
    x0 = PictureBox1.Left
    y0 = PictureBox1.Top
    t = 1
  End Sub

End Class


Cordialement, Joe.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2011 à 20:56
Bonjour,
Mais chat marche

ah ! Je dirais que là, ça "clopine en minuscules zig-zags", plutôt !

____________________
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
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
18 déc. 2011 à 21:03
Cher Jacques,

Dans quel sens, avec humour ou un mauvais calcul ?
Car avec des pixels il n'y a que 4 lignes droites possibles, l'horizontale, la verticale et les diagonales, le reste ça ne peut que n'être pas droit puisque les déplacements ne sont pas similaires, ah... à moins... à moins de faire des déplacements au carré, comme les lits à l'armée...

Cordialement, Joe.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2011 à 21:08
Le problème, Joe, est dans les déplacements en diagolale, à coefficient angulaire donc, et les tâtonnements que tu y appliques alors que l'angle de la diagonale n'est pas forcément de 45 ° (exemple ? diagonale d'un rectangle très allongé, diagonale qui ne te fait pas avancer forcément du même nombre de pixels en abscisse et en ordonnée).


____________________
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
0
Utilisateur anonyme
18 déc. 2011 à 21:09
Re:

Public Class Form1
    Dim Déplacement As Integer = 10
    Dim NewPosLeft, NewPosTop As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        PictureBox1.Left = 0
        PictureBox1.Top = 0
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        'Timer1.Enabled = False
        Dim Rand As New Random
        NewPosLeft = Rand.Next(Me.Width - PictureBox1.Width)
        NewPosTop = Rand.Next(Me.Height - PictureBox1.Height)
        NewPosLeft = (Int(NewPosLeft / Déplacement)) * Déplacement
        NewPosTop = (Int(NewPosTop / Déplacement)) * Déplacement
        Do
            Application.DoEvents()
            System.Threading.Thread.Sleep(20)
            If PictureBox1.Top < NewPosTop Then
                PictureBox1.Top += Déplacement
            ElseIf PictureBox1.Top > NewPosTop Then
                PictureBox1.Top -= Déplacement
            End If
            If PictureBox1.Left < NewPosLeft Then
                PictureBox1.Left += Déplacement
            ElseIf PictureBox1.Left > NewPosLeft Then
                PictureBox1.Left -= Déplacement
            End If
        Loop Until PictureBox1.Left NewPosLeft And PictureBox1.Top NewPosTop
    End Sub
End Class



CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
18 déc. 2011 à 21:14
les déplacements en diagolale, à coefficient angulaire donc, et les tâtonnements que tu y appliques alors que l'angle de la diagonale n'est pas forcément de 45 °


Exact!...
Dans mon exemple c'est pareil, c'est pour ça qu'il faut aussi déterminer l'équation linéaire par la suite.



CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2011 à 21:14
Non plus !
Rien à faire : il faut nécessairement que chaque nouvel angle supérieur gauche de l'objet déplacé ait les coordonnées exactes d'un point de la droite reliant le point de départ et celui de l'arrivée. Et cela se calcule algébriquement (comme dit plus haut).


____________________
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2011 à 21:15
c'est pour ça qu'il faut aussi déterminer l'équation linéaire par la suite.

Croisé, acive ===>>> OUI !


____________________
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
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
18 déc. 2011 à 21:34
J'ai omis, digonale "de carré"... + Horizontal et Vertical, tous les reste marche en crabe, car on n'est pas sur une feuille de papier, faut bien suivre les pixels, on ne peut pas tracer avec autre chose.
Mais je devine, en faisant marcher les deux données en crabe on a une ligne un peu plus droite, oui, bof, je laisse ça à ceux qui adorent ce genre de trigonométrie, c'est l'histoire de + ou - 1 pixel...
---------------------

Le mien fait un peu de crabe, j'ai testé celui de "acive
", il semble tourner avec un angle droit au début, pour pendre ensuite sa trajectoire, impression visuelle ?

Bref, ça doit être suffisant pour le demandeur, bonsoir à vous deux
0
Rejoignez-nous