2009-08-30 4 views

Répondre

4

Ce code devrait faire l'affaire. Il vérifie où la ligne intersecte les côtés, puis vérifie si cela est dans la largeur du carré. Le nombre d'intesections est renvoyé.

float CalcY(float xval, float x0, float y0, float x1, float y1) 
{ 
    if(x1 == x0) return NaN; 
    return y0 + (xval - x0)*(y1 - y0)/(x1 - x0); 
} 

float CalcX(float yval, float x0, float y0, float x1, float y1) 
{ 
    if(x1 == x0) return NaN; 
    return x0 + (yval - y0)*(y1 - y0)/(x1 - x0); 
} 

int LineIntersectsSquare(int x0, int y0, int x1, int y1, int left, int top, int right, int bottom) 
{ 
    int intersections = 0; 
    if(CalcX(bottom, x0, y0, x1, y1) < right && CalcX(bottom, x0, y0, x1, y1) > left ) intersections++; 
    if(CalcX(top , x0, y0, x1, y1) < right && CalcX(top , x0, y0, x1, y1) > left ) intersections++; 
    if(CalcY(left , x0, y0, x1, y1) < top && CalcY(left , x0, y0, x1, y1) > bottom) intersections++; 
    if(CalcY(right , x0, y0, x1, y1) < top && CalcY(right , x0, y0, x1, y1) > bottom) intersections++; 
    return intersections; 
} 

NB: ce code est théorique et ne peut pas être correct, car il n'a pas été testé

+1

Je pense que CalcX doit être retourné x0 + (yval - y0) * (x1 - x0)/(y1 - y0); –

1

Vous pouvez le faire en lançant un vecteur et en comptant le nombre d'arêtes qu'il traverse.

Si les bords qu'il traverse sont égaux, il est à l'extérieur de l'objet, si les bords qu'il traverse sont impairs, il est à l'intérieur.

Cela fonctionne pour tous les polygones fermés.

+0

Cependant, la question posée est de savoir si la ligne et le rectangle se croisent, et non si la ligne est contenue dans le rectangle. – Eric

+0

Dans ce cas, vous avez juste besoin de chercher n'importe quel avantage. – FlySwat

+0

Ce qui était ce qui devait être fait en premier lieu. La question originale a demandé à peu près "comment puis-je vérifier si la ligne coupe un bord du carré?". Et vous venez de dire "cherchez n'importe quel avantage". – Eric

0

Voici une manière:
- trier les points de sommet de la place par x-coord
- trier le point final de la ligne X-Coord
- angle calculer à partir de l'extrémité minX de la ligne à chacune des deux du milieu (x-Coord) sommets carrés
- calculer l'angle de la ligne
- si de la ligne l'angle est dans le possible angles, tout ce que vous avez à faire est un contrôle de longueur, est maxX fin de la ligne> minX sommet du carré

Cela va probablement casser si le carré est directement en face de la ligne, dans ce cas je voudrais juste spécial- le cas en vérifiant le premier bord du carré.

Questions connexes