2017-02-26 1 views
1

J'essaie de tester si deux objets rectangle, dont l'un est en rotation, entrent en collision dans JavaScript.Collision rectangle avec rotation 2D

Voici la capture d'écran de ce que je suis sur.

enter image description here

Après des heures de recherche en ligne, je me demande toujours quelle est la meilleure façon (algorithme) pour détecter si l'objet de la chaux-ish laser chevauche le carré bleu.

J'apprécierais n'importe quel conseil.

Répondre

0

Vous pouvez utiliser le théorème de l'axe de séparation pour cela. Fondamentalement, si 2 polygones convexes (par exemple des rectangles) ne se coupent pas, alors il devrait y avoir au moins une ligne (formée par les bords de l'un des polygones étendus à l'infini) où tous les coins d'un polygone sont d'un côté et tous les coins de l'autre polygone sont de l'autre côté.

Vous pouvez tester le côté d'une ligne sur lequel pointe un point à l'aide d'un produit scalaire. Un vecteur devrait être la normale à la ligne, et l'autre vecteur devrait être un vecteur d'un point sur la ligne au point que vous testez. Si vous spécifiez les sommets de vos coins rectangle avec un ordre d'enroulement constant (par exemple, toujours dans le sens des aiguilles d'une montre ou dans le sens inverse des aiguilles d'une montre), vous saurez quel signe doit être le point lorsque l'autre rectangle est sur le côté la ligne correspondant à l'extérieur du rectangle.

pseudo-code:

function hasSeparatingAxis(a, b) 
{ 
    // test each side of a in turn: 
    for(i = 0; i < a.side_count; i++) 
    { 
     normal_x = a.verts[(i+1)%a.side_count].y - a.verts[i].y; 
     normal_y = a.verts[i].x - a.verts[(i+1)%a.side_count].x; 

     for(j = 0; j < b.side_count; j++) 
     { 
      dot_product = ((b.vert[j].x - a.verts[i].x) * normal_x) + 
       ((b.vert[j].y - a.verts[i].y) * normal_y); 
      if(dot_product <= 0.0) // change sign of test based on winding order 
       break; 
      if(j == b.side_count-1) 
       return true; // all dots were +ve, we found a separating axis 
     } 
    } 
    return false; 
} 

function intersects(a, b) 
{ 
    return !hasSeparatingAxis(a, b) && !hasSeparatingAxis(b, a); 
}