 | Forum Le CBNA Le Forum du CBNA a pour but de vous aider dans l'utilisation de GameMaker. Premier forum Francophone sous GameMaker, vous trouverez des .gmd, .gm6, .gmk, scripts, logiciels et d'autres ressources sur Le CBNA. |
| | Collision entre rectangle et un triangle | |
| | | Auteur | Message |
|---|
CoDeAVE Très bonne participation

Age : 17 Inscrit le : 06 Oct 2007 Messages : 148 Localisation : †[[Dans un monde réel]]† : ────────── : Projet Actuel : Projet en C++ Avancement :
   (5/100)
| Sujet: Collision entre rectangle et un triangle Mer 7 Mai - 18:21 | |
| Tout est dans le titre j'aurais besoin d'un script qui renvoie si un rectangle non orienté et un triangle sont en collision du style :
collision_rectangle_to_triangle(rect_x,rect_y,rect_w,rect_h,tri_x1,tri_y1,tri_x2,tri_y2,tri_x3,tri_y3) |
|  | | M@d_Doc Modérateur 'Programmation'

Age : 18 Inscrit le : 12 Fév 2005 Messages : 3761 Localisation : 47°44'8.04 : ────────── : Projet Actuel : trouver un contrat Avancement :
  (100/100)
| Sujet: Re: Collision entre rectangle et un triangle Mer 7 Mai - 18:35 | |
| aucune idée pour la partie triangle, mais un rectangle non orienté reviens à faire :
if (x<... && x>...) && (y<... && y>...) { ... }
Si la dedans il y a un point du triangle, c'est ok. _________________
 |
|  | | edi9999 Utilisateur confirmé: Rang ****

Age : 16 Inscrit le : 27 Jan 2006 Messages : 1445 Localisation : ben.. ici bien sur : ────────── : Projet Actuel : Theatre flashy Avancement :
   (20/100)
| Sujet: Re: Collision entre rectangle et un triangle Mer 7 Mai - 19:45 | |
| j ai pas vraiment d idée mais je vais essayer d inventer
Un point appartient à un triangle si : -ce point se situe sous les droites d'équations de tous les segments ( ou au dessus)
donc d'abord tu commences par calculer les trois droites d'équations:
explication avec un dessin: 
comme tu peux le voir tous les points qui sont blancs appartiennent au triangle sont blancs, autrement dit, les points qui sont à gauche de la droite verte, au dessus de la rouge et en dessous de la bleu.
On commence donc tout d'abord par calculer les droites d'équations: [code] collision_rectangle_to_triangle(rect_x,rect_y,rect_w,rect_h,tri_x1,tri_y1,tri_x2,tri_y2,tri_x3,tri_y3) d_eqp1=(triy2-triy1)/(trix2-trix1) d_eqo1=triy1-d_eqp1*trix1 d_eqp2=(triy3-triy2)/(trix3-trix2) d_eqo2=triy2-d_eqp2*trix2 d_eqp3=(triy1-triy3)/(trix1-trix3) d_eqo1=triy3-d_eqp3*trix3
je continue après manger mais tu as déjà l'idée _________________ I am an in the GM Quiz!
tuto gamemaker integral disponible sur mon site: http://gameplay.c.la Postez vos commentaires sur http://cbna.forumactif.com/game-maker-f7/tuto-integral-debutant-intermediaire-comfirme-t7263.htm |
|  | | Gab666 Modérateur 'Zut' & 'Ablationer'

Age : 17 Inscrit le : 02 Aoû 2005 Messages : 5241 Localisation : **I move away from the mic to breathe in : ────────── : Avancement :
  (0/100)
| |  | | CoDeAVE Très bonne participation

Age : 17 Inscrit le : 06 Oct 2007 Messages : 148 Localisation : †[[Dans un monde réel]]† : ────────── : Projet Actuel : Projet en C++ Avancement :
   (5/100)
| Sujet: Re: Collision entre rectangle et un triangle Sam 10 Mai - 6:28 | |
| Merci beaucoup de vos réponses Mais le probleme c'est que le triangle peu etre petit et etre totalement dedans le triangle ou bien juste avoir un point dedans ou meme pas du tout O_oAlors il a plein de possibilité a véifier et comment faire cela performant
désolé du temps de réponse j'avais oublier avoir posté ici  |
|  | | edi9999 Utilisateur confirmé: Rang ****

Age : 16 Inscrit le : 27 Jan 2006 Messages : 1445 Localisation : ben.. ici bien sur : ────────── : Projet Actuel : Theatre flashy Avancement :
   (20/100)
| Sujet: Re: Collision entre rectangle et un triangle Sam 10 Mai - 9:52 | |
| Ben avec les scripts de gab666
tu utilises point_in_triangle(x1,y1,x2,y2,x3,y3,x4,y4) en utilisant une boucle for
ça te donne:
collision=0 for(i=xrect;i<=xrect+wrect;i+=1) { for(j=yrect;j<=yrect+hrect;i+=1) { if (xtri1,ytri1,xtri2,ytri2,xtri3,ytri3,i,j) { collision=1 } if collision=1 { break; } } if collision=1 { break; } } _________________ I am an in the GM Quiz!
tuto gamemaker integral disponible sur mon site: http://gameplay.c.la Postez vos commentaires sur http://cbna.forumactif.com/game-maker-f7/tuto-integral-debutant-intermediaire-comfirme-t7263.htm |
|  | | CoDeAVE Très bonne participation

Age : 17 Inscrit le : 06 Oct 2007 Messages : 148 Localisation : †[[Dans un monde réel]]† : ────────── : Projet Actuel : Projet en C++ Avancement :
   (5/100)
| Sujet: Re: Collision entre rectangle et un triangle Sam 10 Mai - 19:34 | |
| | Non sa fonctionne pas de cette manière car le triangle peut etre en collision ak le rectangle sans nécésairemnt avoir de point a l'intérieur.. |
|  | | M@d_Doc Modérateur 'Programmation'

Age : 18 Inscrit le : 12 Fév 2005 Messages : 3761 Localisation : 47°44'8.04 : ────────── : Projet Actuel : trouver un contrat Avancement :
  (100/100)
| Sujet: Re: Collision entre rectangle et un triangle Sam 10 Mai - 19:37 | |
| si le triangle est fixe, fait une collision avec un sprite de triangle  _________________
 |
|  | | CoDeAVE Très bonne participation

Age : 17 Inscrit le : 06 Oct 2007 Messages : 148 Localisation : †[[Dans un monde réel]]† : ────────── : Projet Actuel : Projet en C++ Avancement :
   (5/100)
| Sujet: Re: Collision entre rectangle et un triangle Dim 11 Mai - 1:00 | |
| Non le triangle n'est pas fixe et faire par pixel comme cela demande beaucoup de ressource je cherche le coté performance pour mon jeu..  |
|  | | master47 Utilisateur confirmé: Rang ****

Age : 16 Inscrit le : 16 Nov 2006 Messages : 1415 Localisation : Bruxelles, Belgique @ Louise Gallery : ────────── : Projet Actuel : PacWars Avancement :
   (35/100)
| Sujet: Re: Collision entre rectangle et un triangle Lun 12 Mai - 10:56 | |
| Patiente je te code cela  _________________ O.Kaisin Devenez Fan
Ecouter ma dernière création musicale : In the Sky |
|  | | master47 Utilisateur confirmé: Rang ****

Age : 16 Inscrit le : 16 Nov 2006 Messages : 1415 Localisation : Bruxelles, Belgique @ Louise Gallery : ────────── : Projet Actuel : PacWars Avancement :
   (35/100)
| Sujet: Re: Collision entre rectangle et un triangle Lun 12 Mai - 12:06 | |
| Voila
Au début j'avais utilisé des équations mais c'était beaucoup trop lent :/
Donc j'ai utilisé une autre méthode, qui semble marcher correctement
| Citation: | /* collision_rectangle_with_triangle(x1,y1,x2,y2,x3,y3,recx1,recy1,w,h) */
RecX0 = argument0 RecY0 = argument1 RecW = argument2 RecH = argument3
TriX0 = argument4 TriY0 = argument5 TriX1 = argument6 TriY1 = argument7 TriX2 = argument8 TriY2 = argument9
Rec = object_add() draw_clear(0) Spr = sprite_create_from_screen(0,0,RecW,RecH,1,0,0,0,0,0) object_set_sprite(Rec,Spr) object_set_visible(Rec,1)
ID = instance_create(RecX0,RecY0,Rec)
coll = false ; while(true) { if collision_line(TriX0,TriY0,TriX1,TriY1,ID,0,1) { coll = true; break; } if collision_line(TriX1,TriY1,TriX2,TriY2,ID,0,1) { coll = true; break; } if collision_line(TriX2,TriY2,TriX0,TriY0,ID,0,1) { coll = true; break; } break ; }
with(ID) { instance_destroy() }
sprite_delete(Spr); object_delete(Rec);
return coll;
|
_________________ O.Kaisin Devenez Fan
Ecouter ma dernière création musicale : In the Sky |
|  | | CoDeAVE Très bonne participation

Age : 17 Inscrit le : 06 Oct 2007 Messages : 148 Localisation : †[[Dans un monde réel]]† : ────────── : Projet Actuel : Projet en C++ Avancement :
   (5/100)
| Sujet: Re: Collision entre rectangle et un triangle Mar 13 Mai - 5:49 | |
| Merci beaucoup de ton aide master47 mais le script va tres jusqu'au moment ou l'une des deux forme est a l'intérieur de l'autre et je cherchais plus un truc qui ne touche pas a l'affichage et qui ne créer pas d'autre instance .. |
|  | | CoDeAVE Très bonne participation

Age : 17 Inscrit le : 06 Oct 2007 Messages : 148 Localisation : †[[Dans un monde réel]]† : ────────── : Projet Actuel : Projet en C++ Avancement :
   (5/100)
| Sujet: Re: Collision entre rectangle et un triangle Mer 14 Mai - 6:02 | |
| C'est bon j'ai réussis a trouver une solution je l'ai fait en trois script voici pour les interessés En passant j'ai aussi faite un script suplémentaire pour intersection entre triangle et triangle :
gm6: triangle_rectangle_intersect.gm6 - 0.01MB
| Spoiler: | | | Le script principal est celui ci :
//Rect_Triangle_Intersect(RectX1,RectY1,RectX2,RectY2,TriX1,TriY1,TriX2,TriY2,TriX3,TriY3) var RectX1,RectY1,RectX2,RectY2,TriX,TriY;
RectX[0]=argument0 RectY[0]=argument1 RectX[1]=argument2 RectY[1]=argument3 TriX[0]=argument4 TriY[0]=argument5 TriX[1]=argument6 TriY[1]=argument7 TriX[2]=argument8 TriY[2]=argument9
for(i=0;i<3;i+=1) { if (TriX[i]>=RectX[0]) && (TriX[i]<=RectX[1]) && (TriY[i]>=RectY[0]) && (TriY[i]<=RectY[1]) { return true; } } if Vertex_In_Triangle(RectX[0],RectY[0],TriX[0],TriY[0],TriX[1],TriY[1],TriX[2],TriY[2]) { return true; } if Vertex_In_Triangle(RectX[0],RectY[1],TriX[0],TriY[0],TriX[1],TriY[1],TriX[2],TriY[2]) { return true; } if Vertex_In_Triangle(RectX[1],RectY[0],TriX[0],TriY[0],TriX[1],TriY[1],TriX[2],TriY[2]) { return true; } if Vertex_In_Triangle(RectX[1],RectY[1],TriX[0],TriY[0],TriX[1],TriY[1],TriX[2],TriY[2]) { return true; }
if Line_Line_Intersect(RectX[0],RectY[0],RectX[0],RectY[1],TriX[0],TriY[0],TriX[1],TriY[1]) { if Line_Line_Intersect(RectX[0],RectY[0],RectX[0],RectY[1],TriX[1],TriY[1],TriX[2],TriY[2]) { if Line_Line_Intersect(RectX[0],RectY[0],RectX[0],RectY[1],TriX[2],TriY[2],TriX[0],TriY[0]) { return true; } return true; } return true; } if Line_Line_Intersect(RectX[1],RectY[0],RectX[1],RectY[1],TriX[0],TriY[0],TriX[1],TriY[1]) { if Line_Line_Intersect(RectX[1],RectY[0],RectX[1],RectY[1],TriX[1],TriY[1],TriX[2],TriY[2]) { if Line_Line_Intersect(RectX[1],RectY[0],RectX[1],RectY[1],TriX[2],TriY[2],TriX[0],TriY[0]) { return true; } return true; } return true; } if Line_Line_Intersect(RectX[0],RectY[0],RectX[1],RectY[0],TriX[0],TriY[0],TriX[1],TriY[1]) { if Line_Line_Intersect(RectX[0],RectY[0],RectX[1],RectY[0],TriX[1],TriY[1],TriX[2],TriY[2]) { if Line_Line_Intersect(RectX[0],RectY[0],RectX[1],RectY[0],TriX[2],TriY[2],TriX[0],TriY[0]) { return true; } return true; } return true; } if Line_Line_Intersect(RectX[0],RectY[1],RectX[1],RectY[1],TriX[0],TriY[0],TriX[1],TriY[1]) { if Line_Line_Intersect(RectX[0],RectY[1],RectX[1],RectY[1],TriX[0],TriX[1],TriY[1],TriX[2],TriY[2]) { if Line_Line_Intersect(RectX[0],RectY[1],RectX[1],RectY[1],TriX[0],TriX[2],TriY[2],TriX[0],TriY[0]) { return true; } return true; } return true; }
return false;
//Rect_Triangle_Intersect(TriX1,TriY1,TriX2,TriY2,TriX3,TriY3,TriX4,TriY4,TriX5,TriY5,TriX6,TriY6) var TriX,TriY;
TriX[0]=argument0 TriY[0]=argument1 TriX[1]=argument2 TriY[1]=argument3 TriX[2]=argument4 TriY[2]=argument5 TriX[3]=argument6 TriY[3]=argument7 TriX[4]=argument8 TriY[4]=argument9 TriX[5]=argument10 TriY[5]=argument11
if Vertex_In_Triangle(TriX[0],TriY[0],TriX[3],TriY[3],TriX[4],TriY[4],TriX[5],TriY[5]) { return true; } if Vertex_In_Triangle(TriX[1],TriY[1],TriX[3],TriY[3],TriX[4],TriY[4],TriX[5],TriY[5]) { return true; } if Vertex_In_Triangle(TriX[2],TriY[2],TriX[3],TriY[3],TriX[4],TriY[4],TriX[5],TriY[5]) { return true; }
if Vertex_In_Triangle(TriX[3],TriY[3],TriX[0],TriY[0],TriX[1],TriY[1],TriX[2],TriY[2]) { return true; } if Vertex_In_Triangle(TriX[4],TriY[4],TriX[0],TriY[0],TriX[1],TriY[1],TriX[2],TriY[2]) { return true; } if Vertex_In_Triangle(TriX[5],TriY[5],TriX[0],TriY[0],TriX[1],TriY[1],TriX[2],TriY[2]) { return true; }
if Line_Line_Intersect(TriX[0],TriY[0],TriX[1],TriY[1],TriX[3],TriY[3],TriX[4],TriY[4]) { if Line_Line_Intersect(TriX[0],TriY[0],TriX[1],TriY[1],TriX[4],TriY[4],TriX[5],TriY[5]) { if Line_Line_Intersect(TriX[0],TriY[0],TriX[1],TriY[1],TriX[5],TriY[5],TriX[3],TriY[3]) { return true; } return true; } return true; } if Line_Line_Intersect(TriX[1],TriY[1],TriX[2],TriY[2],TriX[3],TriY[3],TriX[4],TriY[4]) { if Line_Line_Intersect(TriX[1],TriY[1],TriX[2],TriY[2],TriX[4],TriY[4],TriX[5],TriY[5]) { if Line_Line_Intersect(TriX[1],TriY[1],TriX[2],TriY[2],TriX[5],TriY[5],TriX[3],TriY[3]) { return true; } return true; } return true; } if Line_Line_Intersect(TriX[2],TriY[2],TriX[0],TriY[0],TriX[3],TriY[3],TriX[4],TriY[4]) { if Line_Line_Intersect(TriX[2],TriY[2],TriX[0],TriY[0],TriX[4],TriY[4],TriX[5],TriY[5]) { if Line_Line_Intersect(TriX[2],TriY[2],TriX[0],TriY[0],TriX[5],TriY[5],TriX[3],TriY[3]) { return true; } return true; } return true; }
return false;
SCRIPT secondaire ...:
//Line_Line_Intersect(x1,y1,x2,y2,x3,y3,x4,y4) x1=argument0 y1=argument1 x2=argument2 y2=argument3 x3=argument4 y3=argument5 x4=argument6 y4=argument7
var bx,by,dx,dy,b,cx,cy,t,u;
bx = x2 - x1; by = y2 - y1; dx = x4 - x3; dy = y4 - y3; b= bx * dy - by * dx; if(b == 0) return false; cx = x3 - x1; cy = y3 - y1; t = (cx * dy - cy * dx) / b; if(t < 0 || t > 1) return false; u = (cx * by - cy * bx) / b; if(u < 0 || u > 1) return false; return true;
ET le dernier:
//Vertex_In_Triangle(tx,ty,x1,y1,x2,y2,x3,y3) var tx,ty,x1,y1,x2,y2,x3,y3,b0;
tx=argument0 ty=argument1 x1=argument2 y1=argument3 x2=argument4 y2=argument5 x3=argument6 y3=argument7
b0 = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1); if (b0!=0) { if(((((x2 - tx) * (y3 - ty) - (x3 - tx) * (y2 - ty)) / b0)>=0) &&((((x3 - tx) * (y1 - ty) - (x1 - tx) * (y3 - ty)) / b0)>=0) &&((((x1 - tx) * (y2 - ty) - (x2 - tx) * (y1 - ty)) / b0)>=0)) { return true; } else { return false; } } else { return false; } |
|
|  | | | Collision entre rectangle et un triangle | |
|
| Page 1 sur 1 |
| | Permission de ce forum: | Vous pouvez répondre aux sujets dans ce forum
| | |
| |
|