FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Form(résolu)
Aide pour trouver un problème de détection de collisions Emptypar leclode Aujourd'hui à 17:59

» trop de fichiers en cours
Aide pour trouver un problème de détection de collisions Emptypar Marc Aujourd'hui à 11:42

» Bataille navale SM
Aide pour trouver un problème de détection de collisions Emptypar jjn4 Hier à 17:39

» Une calculatrice en une ligne de programme
Aide pour trouver un problème de détection de collisions Emptypar jean_debord Hier à 8:01

» Gestion d'un système client-serveur.
Aide pour trouver un problème de détection de collisions Emptypar Pedro Jeu 25 Avr 2024 - 19:31

» Les maths du crocodile
Aide pour trouver un problème de détection de collisions Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

» Naissance de Crocodile Basic
Aide pour trouver un problème de détection de collisions Emptypar jean_debord Jeu 25 Avr 2024 - 8:45

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Aide pour trouver un problème de détection de collisions Emptypar Froggy One Mer 24 Avr 2024 - 18:38

» Dessine-moi une galaxie
Aide pour trouver un problème de détection de collisions Emptypar jjn4 Lun 22 Avr 2024 - 13:47

» Erreur END_SUB
Aide pour trouver un problème de détection de collisions Emptypar jjn4 Lun 22 Avr 2024 - 13:43

» Bug sur DIM_LOCAL ?
Aide pour trouver un problème de détection de collisions Emptypar papydall Dim 21 Avr 2024 - 23:30

» 2D_fill_color(résolu)
Aide pour trouver un problème de détection de collisions Emptypar leclode Sam 20 Avr 2024 - 8:32

» Consommation gaz électricité
Aide pour trouver un problème de détection de collisions Emptypar leclode Mer 17 Avr 2024 - 11:07

» on_key_down (résolu)
Aide pour trouver un problème de détection de collisions Emptypar leclode Mar 16 Avr 2024 - 11:01

» Sous-programme(résolu)
Aide pour trouver un problème de détection de collisions Emptypar jjn4 Jeu 4 Avr 2024 - 14:42

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Avril 2024
LunMarMerJeuVenSamDim
1234567
891011121314
15161718192021
22232425262728
2930     
CalendrierCalendrier
-20%
Le deal à ne pas rater :
Ecran PC GIGABYTE 28″ LED M28U 4K ( IPS, 1 ms, 144 Hz, FreeSync ...
399 € 499 €
Voir le deal

 

 Aide pour trouver un problème de détection de collisions

Aller en bas 
3 participants
AuteurMessage
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Aide pour trouver un problème de détection de collisions Empty
MessageSujet: Aide pour trouver un problème de détection de collisions   Aide pour trouver un problème de détection de collisions EmptyVen 8 Mai 2015 - 1:44

Bonsoir, est-ce que quelqu'un voit l'erreur que j'ai fais dans ce programme ?
La détection marche mal dans le coin en haut à gauche du rectangle.

Je suis trop fatigué pour continuer à réfléchir. J'espère que quelqu'un trouvera
Code:
DIM Collision_Point_AABB_resultat%
DIM Collision_AABB_resultat%
DIM Collision_cercle_point_resultat%
DIM Collision_Cercle_AABB_resultat%
DIM ProjectionSurSegment_resultat%
DIM cercle1_x% : cercle1_x% = 70
DIM cercle1_y% : cercle1_y% = 40
DIM cercle1_r  : cercle1_r  = 15
DIM rect1_x% : rect1_x% = 50
DIM rect1_y% : rect1_y% = 80
DIM rect1_width  : rect1_width  = 50
DIM rect1_height : rect1_height = 50

label Appuie_touche

' Création des images pour les sprites de notre cercle et de notre rectangle
picture 100 : hide 100 : height 100,rect1_height : width 100,rect1_width
color 100,255,0,0 : file_save 100,"sprite_1.bmp"
height 100,2*cercle1_r : width 100,2*cercle1_r : color 100,0,0,0
2d_fill_color 0,0,255 : 2d_target_is 100 : 2d_circle cercle1_r,cercle1_r,cercle1_r
file_save 100,"sprite_2.bmp" : 2d_target_is 0 : delete 100

scene2d 100 : hide 100 : full_space 100
sprite 1 : sprite_file_load 1,"sprite_1.bmp" : file_delete "sprite_1.bmp"
sprite_position 1,rect1_x%,rect1_y%
sprite 2 : sprite_file_load 2,"sprite_2.bmp" : file_delete "sprite_2.bmp"
sprite_position 2,cercle1_x%,cercle1_y%
on_key_down 0,Appuie_touche
Collision_Cercle_AABB(cercle1_x%,cercle1_y%,cercle1_r,rect1_x%,rect1_y%, rect1_width,rect1_height)
show 100
end


SUB Collision_Point_AABB(point_x%,point_y%,rect_x%,rect_y%,rect_width,rect_height)
Collision_Point_AABB_resultat% = 0
IF rect_x% <= point_x% AND point_x% < rect_x% + rect_width
    IF rect_y% <= point_y% AND point_y% < rect_y% + rect_height
        Collision_Point_AABB_resultat% = 1
    END_IF
END_IF
END_SUB


SUB Collision_AABB(r1_x%,r1_y%,r1_width,r1_height,r2_x%,r2_y%, r2_width,r2_height)
  Collision_AABB_resultat% = 1
  IF ((r2_x% >= (r1_x% + r1_width)) OR ((r2_x% + r2_width) <= r1_x%) OR (r2_y% >= (r1_y% + r1_height)) OR ((r2_y% + r2_height) <= r1_y%)) THEN Collision_AABB_resultat% = 0
END_SUB


SUB Collision_cercle_point(c1_x%,c1_y%,c1_r,x%,y%)
DIM_LOCAL d
  Collision_cercle_point_resultat% = 0
  d=(c1_x% - x%)*(c1_x% - x%) + (c1_y% - y%)*(c1_y% - y%)
  IF (d < (c1_r*c1_r)) THEN Collision_cercle_point_resultat% = 1
END_SUB


SUB Collision_Cercle_AABB(c1_x%,c1_y%,c1_r,r1_x%,r1_y%,r1_width,r1_height)
Collision_Cercle_AABB_resultat% = 1
    Collision_AABB(c1_x%,c1_y%,2*c1_r,2*c1_r,r1_x%,r1_y%,r1_width,r1_height)
    IF Collision_AABB_resultat% = 0
      Collision_Cercle_AABB_resultat% = 0
    ELSE
      Collision_cercle_point(c1_x%,c1_y%,c1_r,r1_x%,r1_y%)
      IF Collision_cercle_point_resultat% = 0
          Collision_cercle_point(c1_x%,c1_y%,c1_r,r1_x%,r1_y%+r1_height)
          IF Collision_cercle_point_resultat% = 0
            Collision_cercle_point(c1_x%,c1_y%,c1_r,r1_x%+r1_width,r1_y%)
            IF Collision_cercle_point_resultat% = 0
              Collision_cercle_point(c1_x%,c1_y%,c1_r,r1_x%+r1_width,r1_y%+r1_height)
              IF Collision_cercle_point_resultat% = 0 THEN Collision_Cercle_AABB_resultat% = 0
            END_IF
        END_IF
      END_IF
      IF Collision_Cercle_AABB_resultat% = 0
          Collision_Point_AABB(c1_x%,c1_y%,r1_x%,r1_y%,r1_width,r1_height)
          IF Collision_Point_AABB_resultat% = 1
            Collision_Cercle_AABB_resultat% = 1
          ELSE
            ProjectionSurSegment(c1_x%,c1_y%,r1_x%,r1_y%,r1_x%,r1_y%+r1_height)
            IF ProjectionSurSegment_resultat% = 0
                ProjectionSurSegment(c1_x%,c1_y%,r1_x%,r1_y%,r1_x%+r1_width,r1_y%)
                IF ProjectionSurSegment_resultat% = 0
                  Collision_Cercle_AABB_resultat% = 0 : ' Cas B
                ELSE
                  Collision_Cercle_AABB_resultat% = 1 : ' Cas E
                END_IF
            ELSE
              Collision_Cercle_AABB_resultat% = 1    : ' Cas E
            END_IF
          END_IF
      END_IF
    END_IF
    IF Collision_Cercle_AABB_resultat% = 1
      CAPTION 0,"Il y a collision entre le cercle et le rectangle"
    ELSE
      CAPTION 0,"Il n'y a pas collision entre le cercle et le rectangle"
    END_IF
END_SUB


SUB ProjectionSurSegment(Cx%,Cy%,Ax%,Ay%,Bx%,By%)
DIM_LOCAL ACx%, ACy%, ABx%, ABy%, BCx%, BCy%, s1%, s2%
  ACx% = Cx%-Ax% : ACy% = Cy%-Ay%
  ABx% = Bx%-Ax% : ABy% = By%-Ay%
  BCx% = Cx%-Bx% : BCy% = Cy%-By%
  s1% = (ACx%*ABx%) + (ACy%*ABy%) : s2% = (BCx%*ABx%) + (BCy%*ABy%)
  IF ((s1%*s2%)>0)
    ProjectionSurSegment_resultat% = 0
  ELSE
    ProjectionSurSegment_resultat% = 1
  END_IF
END_SUB


Appuie_touche:
 if key_down_code = 37 and cercle1_x% > 0 then cercle1_x% = cercle1_x% - 5
 if key_down_code = 39 and cercle1_x% < (width(100) - 2*cercle1_r) then cercle1_x% = cercle1_x% + 5
 if key_down_code = 38 and cercle1_y% > 0 then cercle1_y% = cercle1_y% - 5
 if key_down_code = 40 and cercle1_y% < (height(100) - 2*cercle1_r) then cercle1_y% = cercle1_y% + 5
 sprite_position 2,cercle1_x%,cercle1_y%
 Collision_Cercle_AABB(cercle1_x%,cercle1_y%,cercle1_r,rect1_x%,rect1_y%, rect1_width,rect1_height)
return
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Aide pour trouver un problème de détection de collisions Empty
MessageSujet: Re: Aide pour trouver un problème de détection de collisions   Aide pour trouver un problème de détection de collisions EmptyVen 8 Mai 2015 - 11:07

C'est bon, j'ai relu et j'ai corrigé les problèmes de logiques
Le bon code c'est donc:
Code:
DIM Collision_Point_AABB_resultat%
DIM Collision_AABB_resultat%
DIM Collision_cercle_point_resultat%
DIM Collision_Cercle_AABB_resultat%
DIM ProjectionSurSegment_resultat%
DIM cercle1_x% : cercle1_x% = 70
DIM cercle1_y% : cercle1_y% = 40
DIM cercle1_r  : cercle1_r  = 80
DIM rect1_x% : rect1_x% = 80
DIM rect1_y% : rect1_y% = 80
DIM rect1_width  : rect1_width  = 120
DIM rect1_height : rect1_height = 120

label Appuie_touche

' Création des images pour les sprites de notre cercle et de notre rectangle
picture 100 : hide 100 : height 100,rect1_height : width 100,rect1_width
color 100,255,0,0 : file_save 100,"sprite_1.bmp"
height 100,2*cercle1_r : width 100,2*cercle1_r : color 100,0,0,0
2d_fill_color 0,0,255 : 2d_target_is 100 : 2d_circle cercle1_r,cercle1_r,cercle1_r
file_save 100,"sprite_2.bmp" : 2d_target_is 0 : delete 100

scene2d 100 : hide 100 : full_space 100
sprite 1 : sprite_file_load 1,"sprite_1.bmp" : file_delete "sprite_1.bmp"
sprite_position 1,rect1_x%,rect1_y%
sprite 2 : sprite_file_load 2,"sprite_2.bmp" : file_delete "sprite_2.bmp"
sprite_position 2,cercle1_x%,cercle1_y%
on_key_down 0,Appuie_touche
Collision_Cercle_AABB(cercle1_x%,cercle1_y%,cercle1_r,rect1_x%,rect1_y%, rect1_width,rect1_height)
show 100
end


SUB Collision_Point_AABB(point_x%,point_y%,rect_x%,rect_y%,rect_width,rect_height)
Collision_Point_AABB_resultat% = 0
IF rect_x% <= point_x% AND point_x% < rect_x% + rect_width
    IF rect_y% <= point_y% AND point_y% < rect_y% + rect_height
        Collision_Point_AABB_resultat% = 1
    END_IF
END_IF
END_SUB


SUB Collision_AABB(r1_x%,r1_y%,r1_width,r1_height,r2_x%,r2_y%, r2_width,r2_height)
  Collision_AABB_resultat% = 1
  IF ((r2_x% >= (r1_x% + r1_width)) OR ((r2_x% + r2_width) <= r1_x%) OR (r2_y% >= (r1_y% + r1_height)) OR ((r2_y% + r2_height) <= r1_y%)) THEN Collision_AABB_resultat% = 0
END_SUB


SUB Collision_cercle_point(c1_x%,c1_y%,c1_r,x%,y%)
DIM_LOCAL d
  Collision_cercle_point_resultat% = 0
  d=(c1_x% - x%)*(c1_x% - x%) + (c1_y% - y%)*(c1_y% - y%)
  IF (d < (c1_r*c1_r)) THEN Collision_cercle_point_resultat% = 1
END_SUB


SUB Collision_Cercle_AABB(c1_x%,c1_y%,c1_r,r1_x%,r1_y%,r1_width,r1_height)
DIM_LOCAL r1%,r2%,r3%,r4%
    Collision_AABB(c1_x%,c1_y%,2*c1_r,2*c1_r,r1_x%,r1_y%,r1_width,r1_height)
    IF Collision_AABB_resultat% = 0
      Collision_Cercle_AABB_resultat% = 0
    ELSE
      Collision_cercle_point(c1_x%+c1_r,c1_y%+c1_r,c1_r,r1_x%,r1_y%)
      r1% = Collision_cercle_point_resultat%
      Collision_cercle_point(c1_x%+c1_r,c1_y%+c1_r,c1_r,r1_x%,r1_y%+r1_height)
      r2% = Collision_cercle_point_resultat%
      Collision_cercle_point(c1_x%+c1_r,c1_y%+c1_r,c1_r,r1_x%+r1_width,r1_y%)
      r3% = Collision_cercle_point_resultat%
      Collision_cercle_point(c1_x%+c1_r,c1_y%+c1_r,c1_r,r1_x%+r1_width,r1_y%+r1_height)
      r4% = Collision_cercle_point_resultat%
      IF r1% = 1 OR r2%=1 OR r3%=1 OR r4%=1
          Collision_Cercle_AABB_resultat% = 1
      ELSE
        Collision_Point_AABB(c1_x%+c1_r,c1_y%+c1_r,r1_x%,r1_y%,r1_width,r1_height)
        IF Collision_Point_AABB_resultat% = 1
        Collision_Cercle_AABB_resultat% = 1
        ELSE
            ProjectionSurSegment(c1_x%+c1_r,c1_y%+c1_r,r1_x%,r1_y%,r1_x%,r1_y%+r1_height)
            r1% = ProjectionSurSegment_resultat%
            ProjectionSurSegment(c1_x%+c1_r,c1_y%+c1_r,r1_x%,r1_y%,r1_x%+r1_width,r1_y%)
            r2% = ProjectionSurSegment_resultat%
            IF r1% = 1 OR r2% =  1
                Collision_Cercle_AABB_resultat% = 1 : ' Cas E
            ELSE
                Collision_Cercle_AABB_resultat% = 0 : ' Cas B
            END_IF
          END_IF
      END_IF
    END_IF
    IF Collision_Cercle_AABB_resultat% = 1
      CAPTION 0,"Il y a collision entre le cercle et le rectangle"
    ELSE
      CAPTION 0,"Il n'y a pas collision entre le cercle et le rectangle"
    END_IF
'    CAPTION 0,"X : " + STR$(cercle1_x%) + "  Y : " +STR$(cercle1_y%)
END_SUB


SUB ProjectionSurSegment(Cx%,Cy%,Ax%,Ay%,Bx%,By%)
DIM_LOCAL ACx%, ACy%, ABx%, ABy%, BCx%, BCy%, s1%, s2%
  ACx% = Cx%-Ax% : ACy% = Cy%-Ay%
  ABx% = Bx%-Ax% : ABy% = By%-Ay%
  BCx% = Cx%-Bx% : BCy% = Cy%-By%
  s1% = (ACx%*ABx%) + (ACy%*ABy%) : s2% = (BCx%*ABx%) + (BCy%*ABy%)
  IF ((s1%*s2%)>0)
    ProjectionSurSegment_resultat% = 0
  ELSE
    ProjectionSurSegment_resultat% = 1
  END_IF
END_SUB


Appuie_touche:
 if key_down_code = 37 and cercle1_x% > 0 - cercle1_r then cercle1_x% = cercle1_x% - 5
 if key_down_code = 39 and cercle1_x% < (width(100) - 2*cercle1_r) then cercle1_x% = cercle1_x% + 5
 if key_down_code = 38 and cercle1_y% > 0 - cercle1_r then cercle1_y% = cercle1_y% - 5
 if key_down_code = 40 and cercle1_y% < (height(100) - 2*cercle1_r) then cercle1_y% = cercle1_y% + 5
 sprite_position 2,cercle1_x%,cercle1_y%
 Collision_Cercle_AABB(cercle1_x%,cercle1_y%,cercle1_r,rect1_x%,rect1_y%, rect1_width,rect1_height)
return

Voilà, c'est le code final pour mon article (le premier d'une série sur les détection de collision que je terminerais dès que je peux pour le numéro de mai)
Revenir en haut Aller en bas
Marc

Marc


Nombre de messages : 2380
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Aide pour trouver un problème de détection de collisions Empty
MessageSujet: Re: Aide pour trouver un problème de détection de collisions   Aide pour trouver un problème de détection de collisions EmptyVen 8 Mai 2015 - 11:40

Bonjour Jicehel,

J'ai essayé ton programme en long en large et en travers : pas de problème !
Pas d'anomalie trouvée.

Bonne continuation.

Marc37
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Aide pour trouver un problème de détection de collisions Empty
MessageSujet: Re: Aide pour trouver un problème de détection de collisions   Aide pour trouver un problème de détection de collisions EmptyVen 8 Mai 2015 - 11:49

Dans l'article je traiterais des point, ségments, rectangles de formes AABB (rectangles parallèles aux axes de l'écran), et des cercles.
Les autres formes (les polygones), des detections par masques pour des objets et des zones sur l'écran, etc .. ce sera pour un prochain article (si j'ai le temsp et que j'y arrive Wink ).
J'ai encore un peu de rédaction à faire et quelques codes plus simples mais je dois faire d'autres choses aujourd'hui alors je pense que je le mettrais que ce soir sur le webdav d'Ygeronimi
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 6996
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Aide pour trouver un problème de détection de collisions Empty
MessageSujet: Re: Aide pour trouver un problème de détection de collisions   Aide pour trouver un problème de détection de collisions EmptyVen 8 Mai 2015 - 17:06

Jicehel a écrit:
…. ce sera pour un prochain article (si j'ai le temsp et que j'y arrive   ).

Tu as fait un bon départ, donc tu y arriveras.
Pour le temsp je ne peux rien pour toi, mais je te souhaite bon courage !
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Jicehel

Jicehel


Nombre de messages : 5947
Age : 51
Localisation : 77500
Date d'inscription : 18/04/2011

Aide pour trouver un problème de détection de collisions Empty
MessageSujet: Re: Aide pour trouver un problème de détection de collisions   Aide pour trouver un problème de détection de collisions EmptyVen 8 Mai 2015 - 17:39

Ca te plaiera, je pense Papydall, il y a des maths dans le tuto Wink
Revenir en haut Aller en bas
Contenu sponsorisé





Aide pour trouver un problème de détection de collisions Empty
MessageSujet: Re: Aide pour trouver un problème de détection de collisions   Aide pour trouver un problème de détection de collisions Empty

Revenir en haut Aller en bas
 
Aide pour trouver un problème de détection de collisions
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Bonjour, probleme pour trouver l'IDE à telecharger
» Problème de détection de virus.
» aide pour button
» Aide-mémoire des mots-clés Panoramic
» Aide pour la création d'un wrapper pour le langage Linotte.

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: A l'aide!-
Sauter vers: