IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Rectangles de collision. [Débutant]


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Rectangles de collision.
    Bonsoir,

    Je ne poste pas souvent sur des forums mais je me pose vraiment une question depuis un moment.
    Je m'amuse pour l'instant a coder une petite application qui permet de faire apparaître une bille par clique qui agissent indépendamment (utilisation de thread)
    Maintenant j'aimerai pouvoir tester la collision entre ces billes.
    J'ai donc une liste de Sprite dans laquelle j'ai toutes mes billes

    Ma question est : "Il y a-t il une manière facile de déterminé une collision (intersection de deux rectangles) entre les billes de cette liste ?"

    J'avais pensé faire une boucle et testé une à une chaques combinaisons mais je trouve ça assez lourd.

    Quelqu'un aurait une idée ?

    Merci d'avance,

    Satochu

    Ps: Je ne suis pas encore assez habitué totalement à se langage, je ne connais pas encore toute les ficelles. Peut-être que cette question peut sembler stupide, je demande juste une voie.

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 256
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Voici une piste pour vous aider dans votre problème http://stackoverflow.com/questions/9...x-in-a-winform.

    Celle-ci explique d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pictureBox1.Bounds.Intersects
    mais il y a une erreur, la personne voulait probablement dire IntersectsWith qui renvoie bien un booléen.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour gta126,

    Déja merci de ta réponse
    j'avais effectivement pensé de base à IntersectsWith
    Mon problème vient du fait que pour pouvoir faire ce test de collision avec "IntersectsWith" , il faut les 2 objets.

    Ma question était plus du style :
    y a t il moyen de faire un genre d'intersect qui prend en paramètre n'importe quoi

    Par exemple:
    if ( maBille.rectangle.intersersect(/*anything*/) { /* code */ }

    Je cherche en gros s'il existe un test pour une collection
    Est ce que Mabille touches le rectangle d'une des billes de ma liste ?
    Je sais pas si j'explique bien. Si ça se met ça n'existe pas (si c'est le cas je passerai par le intersectWith)

    merci

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Points : 625
    Points
    625
    Par défaut
    Salut,
    il n'y a pas de fonction magique qui fasse ce que tu veux :p
    il va falloir que tu testes le intersect de chaque rectangle de ta liste avec chaque rectangle de ta liste.

    la méthode la plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for (int cpt = 0; cpt < ListeRect.Lenght; cpt++)
    {
        for (int cpt1 = 0; cpt1 < ListeRect.Lenght; cpt1++)
        {
            //ca ne sert a rien de chercher l'intersection d'un rectangle avec lui-même :
            if (ListeRect[cpt] != ListeRect[cpt1])
            {
     
                if (ListeRect[cpt].IntersectsWith(ListeRect[cpt1]))
                    Collision(ListeRect[cpt],ListeRect[cpt1]);
            }
        }
    }
    tu peux optimiser ce code car il fait des tests en double (genre rect[0] avec rect[1] puis rect[1] avec rect[0]) : moi j'ai la flemme ^^

    PS : initialiser le cpt1 à cpt au lieu de 0 peut être une bonne piste
    "Essayer est le premier pas vers l'Echec !" (Homer Simpson)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    On ne savait jamais qu'il y ait une fonction qui existe ou une astuce dommage ^^

    Je vais partir de ton exemple.

    Merci à vous deux de m'avoir accordé du temps ça m'a bien aidé.

    Bonne journée.

    Satochu.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Points : 625
    Points
    625
    Par défaut
    N'oublie pas le bouton "résolu" si la réponse te convient
    "Essayer est le premier pas vers l'Echec !" (Homer Simpson)

  7. #7
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour satochu

    En fait dans tous les tests en 2d ou 3d de "collision" entre un groupe d'objets (un List<Of Object > si tu veux) on n'echappe pas au fait qu'il faut tester chaque objet "vis à vis des autres"..
    Par contre le test lui-meme se fait en comparant simplement si l'objet X a:
    - soit sonf "LeftTop" est "superieur au "RightBottom" de l'objet Y
    - soit son "RightBottom" "inferieur" au LeftTop de l'objet Y...
    - sinon il y a "Collision".

    Par contre pour mieux factoriser le code le test de "collision" est fait dans le class Sprite (exemple qui suit)...c.à.d qu'un objet Sprite est capable de savoir s'il "collide" avec un autre (entre en collision)...

    bref voici le code exemple en question avec un bitmap memoire auquel tu pourrais rajouter d'autres raffinement (gravity,acceleration,masse etc...):

    code class sprite:
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Drawing;
     
    namespace WinMySprites
    {
        public class Sprite
        {
            public Bitmap SpriteImage { get; set; }
            public int X { get; set; }
            public int Y { get; set; }
            public int VelocityX { get; set; }
            public int VelocityY { get; set; }
            public void Draw(Graphics g)
            {
                 //        Update the location.
                X += VelocityX;
                Y += VelocityY ;
     
     
                //        Draw the sprite.
                g.DrawImage(SpriteImage, X, Y);
            }
     
            public bool  Collision(Sprite targetSprite)
            {
                //      See if two sprites overlap each other.
                int  sp1Left = X;
                int  sp1Top = Y;
                int sp1Right = sp1Left + SpriteImage.Width;
                int sp1Bottom = sp1Top + SpriteImage.Height;
     
                int sp2Left = targetSprite.X;
                int sp2Top  = targetSprite.Y;
                int sp2Right  = sp2Left + targetSprite.SpriteImage.Width;
                int sp2Bottom = sp2Top + targetSprite.SpriteImage.Height;
     
                //   Compare the positions.
     
                //cas ou sp1(this) lefttop  > sp2 bottomright 
     
                if (sp1Left > sp2Right) return false;     
                if (sp1Top > sp2Bottom) return false;     
     
                //cas ou sp1(this) bottomright  < sp2  topleft 
     
                if (sp1Right < sp2Left) return false; 
                if (sp1Bottom < sp2Top) return false;    
     
     
                //  No collision.
                return true;
            }
        }
    }
    code du form qui l'utilise:
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WinMySprites
    {
     
        public partial class Form1 : Form
        {
            private Sprite[] Sprites = new Sprite[10]; 
            public Form1()
            {
                InitializeComponent();
                this.DoubleBuffered = true;
     
            }
     
            private void Form1_Load(object sender, EventArgs e)
            { 
                    //  Prepare the sprites.
                    Graphics canvas ; 
                    Random rndPos   = new Random();
     
                    //  Create  sprites.
                    for (int i  = 0 ;i < Sprites.Length;i++)
                    {
                        Sprites[i] = new Sprite();
                        Sprites[i].X = rndPos.Next(this.Left, this.Right);
                        Sprites[i].Y = rndPos.Next(this.Top, this.Bottom);
     
                        if (i % 2 == 0)
    	                {
                            Sprites[i].VelocityX = 2;
                            Sprites[i].VelocityY = 1;
    	                }
                        else
    	                {
                            Sprites[i].VelocityX = 1;
                            Sprites[i].VelocityY = -2;
    	                }
     
                        Sprites[i].SpriteImage = new Bitmap(30, 30);
                        canvas = Graphics.FromImage(Sprites[i].SpriteImage);
                        canvas.Clear(Color.FromArgb(0, 0, 0, 0));
                        canvas.FillEllipse(Brushes.Red, 0, 0, 30, 30);
                        canvas.Dispose();
                    }
     
                //  Start the action.
                this.timer1.Interval = 10;
                this.timer1.Enabled = true;
     
     
            }
            private void timer1_Tick(object sender, EventArgs e)
            {  
                // Trigger a redraw of the form.
                this.Refresh();
     
            }
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
     
                //   Draw the sprites on a background.
     
                //    Redraw the striped background.
                for( int i = 0 ; i< this.ClientSize.Width * 2 ;i+=20)
                {
                    e.Graphics.DrawLine(new Pen(Color.LightBlue, 5), 
                        i, -5, i- this.ClientSize.Height - 10, 
                           this.ClientSize.Height + 5);
     
                }
     
                //  Draw each  sprites.
     
                for (int i = 0; i < Sprites.Length; i++)
    		    {
                    Sprites[i].Draw(e.Graphics); 
                    for (int j = 0; j < Sprites.Length; j++)
    			    {
                        // See if the  sprites have hit each other.
                        if (Sprites[i].Collision( Sprites[j]))
    	                {
    		                Sprites[i].VelocityX = -Sprites[i].VelocityX;
                            Sprites[i].VelocityY = -Sprites[i].VelocityY;
                            Sprites[j].VelocityX = -Sprites[j].VelocityX;
                            Sprites[j].VelocityY = -Sprites[j].VelocityY;
    	                }
    			    }
    		    }
     
     
                //  Move the sprites for the next update.
                for (int i=0; i<Sprites.Length ;i++)
                {
                    if (Sprites[i].X < 0)
    	            {
    		            Sprites[i].VelocityX =  Math.Abs(Sprites[i].VelocityX);
    	            }
                    if (Sprites[i].Y < 0)
    	            {
    		                Sprites[i].VelocityY =  Math.Abs(Sprites[i].VelocityY);
    	            }
                    if (Sprites[i].X >this.ClientSize.Width - 30)
    	            {
    		            Sprites[i].VelocityX = -Math.Abs(Sprites[i].VelocityX);
    	            }   
                    if (Sprites[i].Y > this.ClientSize.Height - 30)
    	            {
                        Sprites[i].VelocityY = -Math.Abs(Sprites[i].VelocityY);
    	            }
     
                }
     
            }
     
     
        }
    }

    bon code....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. collision entre des rectangles
    Par ines64 dans le forum Programmation multimédia/Jeux
    Réponses: 0
    Dernier message: 05/05/2013, 00h01
  2. [2D] Repositionner deux rectangles à la détection d'une collision
    Par pierrot la lune dans le forum Physique
    Réponses: 3
    Dernier message: 24/03/2010, 22h00
  3. Collision entre rectangles
    Par OddAnt dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 10/01/2010, 00h26
  4. Collision entre deux rectangle
    Par Ouaibou dans le forum Mathématiques
    Réponses: 4
    Dernier message: 15/04/2007, 15h16
  5. Détection de collisions entre rectangles
    Par davcha dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 13/04/2006, 18h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo