Déplacement aléatoire d'une PictureBox dans une Form [Résolu]

gege1505 54 Messages postés lundi 2 novembre 2009Date d'inscription 7 août 2012 Dernière intervention - 16 déc. 2011 à 18:46 - Dernière réponse : ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

59 réponses

Meilleure réponse
Utilisateur anonyme - 17 déc. 2011 à 23:25
3
Merci
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

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
Meilleure réponse
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 déc. 2011 à 14:00
3
Merci
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

Merci ucfoutu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de ucfoutu
Utilisateur anonyme - 16 déc. 2011 à 19:10
0
Merci
Bonsoir,

Donne donc le bout de code qui cloche.
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 16 déc. 2011 à 23:54
0
Merci
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
Commenter la réponse de Utilisateur anonyme
ehjoe 728 Messages postés samedi 4 avril 2009Date d'inscription 30 mars 2014 Dernière intervention - 17 déc. 2011 à 22:47
0
Merci
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.
Commenter la réponse de ehjoe
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 18 déc. 2011 à 10:42
0
Merci
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
Commenter la réponse de cs_ShayW
Utilisateur anonyme - 18 déc. 2011 à 12:17
0
Merci
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
Commenter la réponse de Utilisateur anonyme
gege1505 54 Messages postés lundi 2 novembre 2009Date d'inscription 7 août 2012 Dernière intervention - 18 déc. 2011 à 13:52
0
Merci
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 !
Commenter la réponse de gege1505
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 déc. 2011 à 14:21
0
Merci
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
Commenter la réponse de ucfoutu
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 18 déc. 2011 à 15:06
0
Merci
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
Commenter la réponse de cs_ShayW
gege1505 54 Messages postés lundi 2 novembre 2009Date d'inscription 7 août 2012 Dernière intervention - 18 déc. 2011 à 15:08
0
Merci
Merci, impeccable, je n'avais pas fait le rapprochement avec mes vieux cours de math ^^
Merci, encore !
Commenter la réponse de gege1505
ehjoe 728 Messages postés samedi 4 avril 2009Date d'inscription 30 mars 2014 Dernière intervention - 18 déc. 2011 à 20:36
0
Merci
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.
Commenter la réponse de ehjoe
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 déc. 2011 à 20:56
0
Merci
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
Commenter la réponse de ucfoutu
ehjoe 728 Messages postés samedi 4 avril 2009Date d'inscription 30 mars 2014 Dernière intervention - 18 déc. 2011 à 21:03
0
Merci
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.
Commenter la réponse de ehjoe
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 déc. 2011 à 21:08
0
Merci
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
Commenter la réponse de ucfoutu
Utilisateur anonyme - 18 déc. 2011 à 21:09
0
Merci
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
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 18 déc. 2011 à 21:14
0
Merci
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
Commenter la réponse de Utilisateur anonyme
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 déc. 2011 à 21:14
0
Merci
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
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 18 déc. 2011 à 21:15
0
Merci
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
Commenter la réponse de ucfoutu
ehjoe 728 Messages postés samedi 4 avril 2009Date d'inscription 30 mars 2014 Dernière intervention - 18 déc. 2011 à 21:34
0
Merci
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
Commenter la réponse de ehjoe

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.