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

JavaScript Discussion :

Gérer des collisions avec tableau (T[])


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Gérer des collisions avec tableau (T[])
    Bonsoir,

    J'ai le code suivant:
    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
    var collisions = function() {
    var n = T.length;
    var Mp = masse.value*(1/5);
        for (var i = 1 ; i < n-1 ; i++) {
            var xP = T[i].x;
        var yP = T[i].y;
            var distanceObjet = Math.sqrt((x-xP)*(x-xP)+(y-yP)*(y-yP));
            if (distanceObjet<(10+(Mp/2))){
                T[i].style.backgroundColor="red";
            }
            else{T[i].style.backgroundColor="blue"}
        }
     
        for (var j = i+1 ; j < n ; j=j++) {
            var xP2 = T[j].x;
            var yP2 = T[j].y;
     
                var distancePlanetes = Math.sqrt((xP-xP2)*(xP-xP2)+(yP-yP2)*(yP-yP2));
                if (distancePlanetes<Mp){
                    T[j].style.backgroundColor="red";
     
                }
            else {T[j].style.backgroundColor="blue"}
        }
    }

    x et y représentent les coordonnées d'un div se déplaçant et rencontrant un div de coordonnées xP2 et yP2 fixe, stocké dans un tableau lorsqu'il est créé.

    La collision entre ces 2 éléments fonctionne bien, je cherche désormais à tester la collision entre 2 divs dans le tableau (Mp représente le diamètre d'un div dans le tableau, donc quand la distance entre le centre de ces 2 divs est inférieure à la somme des rayons de ces 2 div = Mp = diamètre, il y a collision)

    J'ai créé la variable j qui désigne un div dans le tableau tel que j=i+1, c'est à dire le div suivant dans le tableau T[]: lorsque je crée le div de coordonnées T[j].x = T[i+1].x et T[j].y= T[i+1].y, il est censé vérifier la collision avec un div créé précédemment, pas uniquement le dernier, c'est à dire tous les div présents dans le tableau avant que je crée celui-là.

    Je cherche donc un moyen d'organiser ça, qui serait visible par un changement de couleur, mais pas moyen..

    Merci pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Cela se résume à un calcul de combinaisons. Si tu as 4 objets A,B,C,D et que tu veux tester toutes les collisions, ce serait dans l'ordre : AB AC AD BC BD CD = 6 éléments (3 + 2 + 1).

    Mais du coup je ne comprends pas pourquoi tes boucles sur i et j ne sont pas imbriquées. Quand tu arrives à la boucle sur j, la boucle sur i est terminée et i vaut (n-1) donc cette seconde boucle ne sert à rien. Il y a donc une erreur de logique.
    One Web to rule them all

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    J'ai modifié le code en conséquence:
    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
     
    var collisions = function() {
    var n = T.length;
    var Mp = masse.value*(1/5);
        for (var i = 1 ; i < n+1; i++) {
            var xP = T[i].x;
    		var yP = T[i].y;
    		var distanceObjet = Math.sqrt((x-xP)*(x-xP)+(y-yP)*(y-yP));
    		if (distanceObjet<(10+(Mp/2))){
    		    T[i].style.backgroundColor="red";
    		}
    		else{T[i].style.backgroundColor=couleurPlaneteVecteur.value}
    	}
     
        for (var j = i+1 ; j < n+1 ; j++) {
    		var xP2 = T[j].x;
    		var yP2 = T[j].y;
     
    			var distancePlanetes = Math.sqrt((xP-xP2)*(xP-xP2)+(yP-yP2)*(yP-yP2));
    			if (distancePlanetes<Mp){
    				T[j].style.backgroundColor="red";
     
    			}
    		else {T[j].style.backgroundColor="blue"}
    	}
     
    }
    Ce que je comprends de mon code, c'est que lorsqu'une planète est créé, elle est dans le rang i du tableau. Lorsqu'une seconde planète est créé, elle est stockée au rang j (i+1), lorsque j'en crée une troisième au rang j, les précédentes sont au rang i, et ainsi de suite. Donc lorsque je crée une planète, seule cette dernière a le rang j qui équivaut à la dernière créée dans le tableau, et toutes les planètes précédentes ont le rang i.

    Ainsi lorsque je crée une planète (au rang j donc) elle doit vérifier la 2nde condition (if (distancePlanetes<Mp)) pour toutes les planètes précédant son rang donc précédemment créées, au rang i.

    Je dois avoir une erreur de compréhension entre ce que je veux et le code, pourtant c'est le même principe que le 1er for et celui-ci fonctionne...

  4. #4
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Tes boucles ne semblent toujours pas imbriquées... Indente ton code correctement et tu verras peut-être plus clairement ton erreur
    One Web to rule them all

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    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
    var collisions = function() {
    var n = T.length;
    var Mp = masse.value*(1/5);
        for (var i = 0 ; i < n; i++) {
            var xP = T[i].x;
    		var yP = T[i].y;
    		var distanceObjet = Math.sqrt((x-xP)*(x-xP)+(y-yP)*(y-yP));
    		if (distanceObjet<(10+(Mp/2))){
    		    T[i].style.backgroundColor="red";
    		}
    		else{T[i].style.backgroundColor=couleurPlaneteVecteur.value}
     
     
        for (var j = i+1 ; j < n+1 ; j++) {
    		var xP2 = T[j].x;
    		var yP2 = T[j].y;
     
    			var distancePlanetes = Math.sqrt((xP-xP2)*(xP-xP2)+(yP-yP2)*(yP-yP2));
    			if (distancePlanetes<Mp){
    				T[j].style.backgroundColor="red";
     
    			}
    		else {T[j].style.backgroundColor=couleurPlaneteVecteur.value}
    	}
    }
    }
    dans ce cas là mes boucles sont imbriquées ? j'ai supprimé l'accolade du 1er for pour que les variables utilisés dans celui-là soient prises en compte dans le second for. Par contre mon premier for ne fonctionne plus car il ne détecte que la collision avec la première planète créée..

Discussions similaires

  1. gestion des collisions avec sdl
    Par kirtap1969 dans le forum SDL
    Réponses: 3
    Dernier message: 18/10/2007, 21h16
  2. gérer des utilisateurs avec un fichier XML
    Par ryoussef19 dans le forum Général Dotnet
    Réponses: 5
    Dernier message: 08/06/2007, 10h20
  3. Réponses: 2
    Dernier message: 05/01/2006, 10h43
  4. [MySQL] conseils pour gérer des images avec mysql
    Par briiice dans le forum Administration
    Réponses: 9
    Dernier message: 04/01/2006, 09h52

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