Ligne d'intersection avec l'AABB Rectangle?
De préférence sans utiliser toute sorte de boucle, comme ce seront utilisées dans un jeu.
Je souhaite à l'intersection d'une ligne avec un rectangle de taille arbitraire.
Mais je souhaite aussi pour le point d'intersection de[s] pour être retourné.
C'est possible, je l'ai fait un peu de recherche sur google, mais n'ont pas encore travaillé dessus.
La ligne est définie à l'aide de (x1,y1,x2,y2).
Le rectangle est de ces deux points de trop.
Commencez avec un problème plus facile. Savez-vous comment se croisent une ligne infinie avec une autre ligne infinie?
Ce n'est pas que je pense que l'on apprend mieux par la méthode Socratique; je comprends que tout le monde ne le fait. Plutôt, je suis en train d'évaluer votre niveau de connaissances existantes. Si vous ne savez pas comment réaliser l'intersection de deux lignes, alors vous allez probablement avoir à apprendre avant de vous essayez de croiser plus des géométries complexes.
J'ai fondamentalement en désaccord. Il est parfois préférable de mettre en œuvre de quelqu'un d'autre solution dans le code, vérifiez qu'il fonctionne et d'oublier, que d'apprendre la théorie derrière la solution et la mettre en œuvre vous-même. Vous n'apprenez pas autant, mais tout le monde ne veut ou a besoin de tout apprendre.
Ce n'est pas que je pense que l'on apprend mieux par la méthode Socratique; je comprends que tout le monde ne le fait. Plutôt, je suis en train d'évaluer votre niveau de connaissances existantes. Si vous ne savez pas comment réaliser l'intersection de deux lignes, alors vous allez probablement avoir à apprendre avant de vous essayez de croiser plus des géométries complexes.
J'ai fondamentalement en désaccord. Il est parfois préférable de mettre en œuvre de quelqu'un d'autre solution dans le code, vérifiez qu'il fonctionne et d'oublier, que d'apprendre la théorie derrière la solution et la mettre en œuvre vous-même. Vous n'apprenez pas autant, mais tout le monde ne veut ou a besoin de tout apprendre.
OriginalL'auteur Steffan Donal | 2010-09-19
Vous devez vous connecter pour publier un commentaire.
Je recommanderais tout simplement faire une ligne du segment de ligne-segment de l'intersection de vérifier sur chaque segment de ligne (edge) qui constitue le rectangle. Ici est un segment de droite d'intersection algorithme de détection que j'ai écrit il y a longtemps, dragués de l'un de mes vieux XNA projets:
Je vais quitter la saisie de chaque bord dans la méthode ci-dessus et la collecte des résultats comme exercice pour le lecteur 🙂
Edit 1 an plus tard je suis allé à l'université et fait un Graphique de cours:
Prendre un coup d'oeil à la Cohen–Sutherland algorithme pour le faire efficacement lorsque vous avez un grand ensemble de lignes, où la plupart ne coupent pas le rectangle. Il utilise un 9 segment de la grille et vous place à chaque extrémité de la ligne dans une région de ladite grille:
À l'aide de ce que nous pouvons dire si il n'y aura pas toutes les intersections des lignes de:
Par exemple ici
CD
ne se croisent le rectangle (indiqué en rouge dans la première image)C
etD
sont dans la rangée du haut, niAB
. Pour ceux où la ligne de croiser le rectangle nous devons essayer de le ligne ligne intersections.Ils façon dont les articles sont numérotés et étiquetés nous permet de le faire simplement
x AND y != 0
(oùx
ety
sont les étiquettes des sections pour chaque ligne de points de terminaison) afin de déterminer si il n'y aura pas une intersection.À l'aide de cette méthode signifie que nous avons beaucoup, beaucoup moins de ligne de ligne de les intersections, ce qui accélère la chose entière massivement.
Dans l'exemple de code ci-dessus, ce sont en réalité des produits croix, et non point des produits.
Cohen–Sutherland algorithme semble être le clipping et de trouver intersection plutôt que de est-il une intersection alors certes, ce serait plus lent?
Hmm, le Cohen-Sutherland algorithme suppose un espace fini est divisé en 9 les mêmes régions (ou 27 en 3d). Ce qui se passe lorsque votre espace est infini?
Vous avez mon upvote pour le modifier
OriginalL'auteur Callum Rogers