J'essaie de combiner deux choses. J'écris un jeu et je dois déterminer les carrés de la grille se trouvant sur une ligne avec les points d'extrémité à virgule flottante.
De plus, j'en ai besoin pour inclure tous les carrés de la grille qu'il touche (c'est-à-dire pas seulement la ligne de Bresenham mais la bleue):
Quelqu'un peut-il me donner une idée de la façon de procéder? La solution évidente consiste à utiliser un algorithme de ligne naïf, mais existe-t-il quelque chose de plus optimisé (plus rapide)?
c#
algorithm
grid
interpolation
floating-point
SmartK8
la source
la source
Réponses:
Vous recherchez un algorithme de traversée de grille. Ce document donne une bonne mise en œuvre;
Voici l'implémentation de base en 2D trouvée sur le papier:
Il existe également une version de lancer de rayons 3D sur le papier.
Dans le cas où le lien pourrit , vous pouvez trouver de nombreux miroirs avec son nom: Un algorithme de traversée de voxels plus rapide pour le raytracing .
la source
L'idée de Blue est bonne, mais la mise en œuvre est un peu maladroite. En fait, vous pouvez facilement le faire sans sqrt. Supposons pour le moment que vous excluez les cas dégénérés (
BeginX==EndX || BeginY==EndY
) et que vous vous concentrez uniquement sur les directions de ligne dans le premier quadrantBeginX < EndX && BeginY < EndY
. Vous devrez également implémenter une version pour au moins un autre quadrant, mais c'est très similaire à la version pour le premier quadrant - vous ne vérifiez que les autres bords. En pseudo code C'ish:Maintenant , pour les autres quarts de cercle, vous changez juste le
++cx
ou++cy
et la condition de la boucle. Si vous l'utilisez pour la collision, vous devrez probablement implémenter les 4 versions, sinon vous pouvez vous en tirer avec deux en échangeant de manière appropriée les points de début et de fin.la source
Votre hypothèse n'est pas nécessairement de trouver les cellules mais les lignes qu'elle traverse sur cette grille.
Par exemple en prenant votre image on peut mettre en évidence non pas les cellules, mais les lignes de la grille qu'elle traverse:
Cela montre alors que s'il traverse une ligne de grille, les cellules de chaque côté de cette ligne sont celles qui sont remplies.
Vous pouvez utiliser un algorithme d'intersection pour déterminer si votre ligne à virgule flottante les traversera en mettant à l'échelle vos points en pixels. Si vous avez un rapport 1,0: 1 de coordonnées flottantes: pixels, vous êtes trié et vous pouvez simplement le traduire directement. En utilisant l'algorithme d'intersection de segment de ligne, vous pouvez vérifier si votre ligne inférieure gauche (1,7) (2,7) croise votre ligne (1.3,6.2) (6.51,2.9). http://alienryderflex.com/intersect/
Une traduction de c en C # sera nécessaire, mais vous pouvez vous en inspirer. Je mettrai le code ci-dessous au cas où le lien se romprait.
Si vous devez savoir uniquement quand (et où) les segments de ligne se croisent, vous pouvez modifier la fonction comme suit:
la source
Démo JS:
Afficher l'extrait de code
la source
J'ai rencontré le même problème aujourd'hui et j'ai fait une assez grande montagne de spaghettis à partir d'une colline de taupes, mais j'ai fini avec quelque chose qui fonctionne: https://github.com/SnpM/Pan-Line-Algorithm .
Du ReadMe:
Le ReadMe explique la solution bien mieux que le code. Je prévois de le réviser pour qu'il induise moins de maux de tête.
Je sais que j'ai un an de retard sur cette question, mais j'espère que cela parviendra à ceux qui recherchent une solution à ce problème.
la source