|
| Collision entre rectangle et un triangle | |
| | Auteur | Message |
---|
CoDeAVE Utilisateur confirmé: Rang **
Messages : 408 Localisation : Québec
| Sujet: Collision entre rectangle et un triangle Mer 7 Mai 2008 - 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
Messages : 6600 Localisation : 47°44'8.04 Projet Actuel : aucun
| Sujet: Re: Collision entre rectangle et un triangle Mer 7 Mai 2008 - 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. _________________ Tous les icones de gm utilisables sur le cbna ICI |
| | | edi9999 Utilisateur confirmé: Rang *****
Messages : 2480 Localisation : France Projet Actuel : theatre flashy
| Sujet: Re: Collision entre rectangle et un triangle Mer 7 Mai 2008 - 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 |
| | | Gab666 Modérateur 'Zut'
Messages : 5340 Localisation : **I move away from the mic to breathe in
| Sujet: Re: Collision entre rectangle et un triangle Jeu 8 Mai 2008 - 1:12 | |
| _________________ PIS MANIAC PREND DES BAINS !
|
| | | CoDeAVE Utilisateur confirmé: Rang **
Messages : 408 Localisation : Québec
| Sujet: Re: Collision entre rectangle et un triangle Sam 10 Mai 2008 - 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 *****
Messages : 2480 Localisation : France Projet Actuel : theatre flashy
| Sujet: Re: Collision entre rectangle et un triangle Sam 10 Mai 2008 - 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; } } |
| | | CoDeAVE Utilisateur confirmé: Rang **
Messages : 408 Localisation : Québec
| Sujet: Re: Collision entre rectangle et un triangle Sam 10 Mai 2008 - 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
Messages : 6600 Localisation : 47°44'8.04 Projet Actuel : aucun
| Sujet: Re: Collision entre rectangle et un triangle Sam 10 Mai 2008 - 19:37 | |
| si le triangle est fixe, fait une collision avec un sprite de triangle :gniah: _________________ Tous les icones de gm utilisables sur le cbna ICI |
| | | CoDeAVE Utilisateur confirmé: Rang **
Messages : 408 Localisation : Québec
| Sujet: Re: Collision entre rectangle et un triangle Dim 11 Mai 2008 - 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 *****
Messages : 2368 Projet Actuel :
-------------------
> PacWars
> The Perfect Pattern Studio
| Sujet: Re: Collision entre rectangle et un triangle Lun 12 Mai 2008 - 10:56 | |
| Patiente je te code cela |
| | | master47 Utilisateur confirmé: Rang *****
Messages : 2368 Projet Actuel :
-------------------
> PacWars
> The Perfect Pattern Studio
| Sujet: Re: Collision entre rectangle et un triangle Lun 12 Mai 2008 - 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;
|
| | | CoDeAVE Utilisateur confirmé: Rang **
Messages : 408 Localisation : Québec
| Sujet: Re: Collision entre rectangle et un triangle Mar 13 Mai 2008 - 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 Utilisateur confirmé: Rang **
Messages : 408 Localisation : Québec
| Sujet: Re: Collision entre rectangle et un triangle Mer 14 Mai 2008 - 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 :ange2: 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; }
|
| | | Contenu sponsorisé
| Sujet: Re: Collision entre rectangle et un triangle | |
| |
| | | | Collision entre rectangle et un triangle | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |