Quelqu'un at-il un algorithme simple pour cela? Pas besoin de rotation ou quoi que ce soit. Trouver simplement si un segment de ligne à partir de deux points croise un carréDétecter si le segment de ligne croise le carré
Répondre
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é
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.
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
Dans ce cas, vous avez juste besoin de chercher n'importe quel avantage. – FlySwat
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
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é.
- 1. détecter si le bureau est verrouillé
- 2. Vérifiez si le chemin tracé/CGPath se croise dans un jeu iPhone
- 3. Regex pour détecter urls que lorsque le dernier « segment » contient une période
- 4. récupérer le segment caché default.aspx d'une URL
- 5. Ressource introuvable pour le segment « propriété »
- 6. Stocker le segment précédemment sélectionné d'un UISegmentedControl?
- 7. Étendre un segment de ligne à un cadre de délimitation
- 8. Détecter si le type implémente ICollection <T>
- 9. détecter si NumLock est désactivé et le réactiver
- 10. Détecter si le contenu d'un dossier a changé?
- 11. Détecter si le document IFRAME est mal formé
- 12. Comment détecter si le type est un autre type générique
- 13. carré parfait
- 14. en ligne SQL si le type de déclaration question
- 15. Utiliser le contrôleur de segment pour "pousser" plutôt que UINavigationController
- 16. SQL spatial: le type de données le plus approprié pour un carré?
- 17. Détecter et supprimer le Rootkit
- 18. Boxplot carré Matplotlib
- 19. Détecter si Tooltip est affiché?
- 20. Détecter si X11 est disponible (python)
- 21. Détecter la sélection de ligne dans wxGrid
- 22. carré parfait et cube parfait
- 23. Mise en place du compte Paypal dans le sous-segment
- 24. Détecter si IIS est activé
- 25. Détecter le compilateur aveC#ifdef
- 26. détecter le fichier flash corrompu
- 27. Détecter le téléchargement dans UIWebView
- 28. Comment détecter si le visiteur de votre site Web provient d'un résultat de recherche Google?
- 29. Comment détecter le type de serveur Web
- 30. Est-il possible de détecter si le réseau cellulaire est disponible?
Je pense que CalcX doit être retourné x0 + (yval - y0) * (x1 - x0)/(y1 - y0); –