Comment vérifier si le segment coupe un rectangle?
Si vous avez 2 points (x1, y1) et (x2, y2), qui représentent les deux coins opposés d'un rectangle, et les 2 autres points, (x3,y3) et (x4,y4), qui représentent les 2 extrémités d'un segment de ligne, comment pouvez-vous vérifier si le segment de ligne coupe le rectangle?
(Le segment de ligne est juste le segment compris entre la donnée des points de terminaison. Il n'est pas d'une infinie longueur de la ligne définie par ces deux points.)
- double possible de ligne de rectangle de détection de collision
- votre ligne est appelée segment
Vous devez vous connecter pour publier un commentaire.
Une option très simple serait d'utiliser un algorithme standard pour vérifier si deux segments se coupent pour vérifier si les segments de ligne coupe l'un des quatre segments qui composent les coins de la boîte. Il est calcul très efficace pour vérifier si deux segments de ligne se croisent, donc je m'attends à ce que ce pouvait courir très vite.
Espérons que cette aide!
x1 < x3 && x3 < x2 && y1 < y3 && y3 < y2
.De comprendre comment obtenir la formule pour tester si une ligne du segment coupe un rectangle, il est important de se rappeler les propriétés de la vecteur produit scalaire.
Représenter la ligne du segment comme une unité, et un vecteur de distance entre la ligne du segment du point de départ et l'origine. Voici un code C# pour calculer qu'à partir de la
PointF
variablesa_ptStart
eta_ptEnd
, à l'aide d'unVector
:Vous aurez aussi besoin de calculer le vecteur perpendiculaire, et sa distance par rapport à l'origine, pour le segment de ligne. La rotation d'un vecteur unitaire de 90° est facile.
En supposant que les quatre coins du rectangle sont en
Vector
des variables appeléesvecRect1
,vecRect2
,vecRect3
, etvecRect4
, calculer la distance entre la ligne de segment et de tous les quatre coins de la cible de sélection rectangle:Si toutes les distances sont positives, ou toutes les distances sont négatifs, alors le rectangle est sur un côté de la ligne ou de l'autre, donc il n'y a pas d'intersection. (Zéro-mesure rectangles ne sont pas considérés comme à l'intersection avec une ligne-segment.)
Prochain, d'un projet, tous les quatre coins de la cible du rectangle de délimitation sur la ligne du segment. Cela nous donne la distance entre la ligne de l'origine et de la projection du rectangle de coin sur cette ligne.
Si le rectangle de points ne tombent pas dans le segment de la ligne de mesure, alors il n'y a pas d'intersection.
Je crois que c'est suffisant.
Obtenir le produit scalaire de tous les 4 sommets (les coins du rectangle) avec le vecteur de direction du segment de ligne. Si tous les 4 ont des valeurs de même signe, alors tous les sommets sont sur le même côté de la ligne (pas le segment de la ligne, mais la ligne infinie) et donc la ligne ne coupe pas le rectangle. Cette approche est viable que pour la 2D intersection de détection. Ceci peut être utilisé pour filtrer au travers de la plupart d'entre eux rapidement (en utilisant seulement les multiplications et d'additions). Vous aurez à faire d'autres vérifications pour des segments de ligne, au lieu de lignes.