Elégant/Propre (cas spécial) en ligne Droite de la Grille de la Traversée de l'Algorithme?

Je suis de dépoussiérer un vieux projet de la mine. Une des choses qu'il avait à faire, étant donné une grille Cartésienne du système, et de deux places sur la grille, trouver une liste de toutes les cases d'une ligne joignant le centre de ces deux carrés permettrait de passer à travers.

Le cas particulier ici, c'est que tous les points de début et fin sont confinés à l'exact centre de places/cellules.

Voici quelques exemples -- avec des couples de l'échantillon de départ et les points de fin. Les places ombragées sont celles qui devraient être retourné par l'appel de fonction

retiré morts ImageShack lien - exemple

De départ et les points d'extrémité sont visés par les carrés ils sont. Dans l'image ci-dessus, en supposant que la partie inférieure gauche est [1,1], la ligne en bas à droite serait identifié comme [6,2] à [9,5].

Qui est, à partir de la (centre de l') carré sur la sixième colonne de la gauche, sur la deuxième rangée à partir du bas vers le centre (de la) carré sur la neuvième colonne de gauche, sur la cinquième rangée à partir du bas

Qui vraiment ne semble pas si compliqué que ça. Cependant, j'ai en quelque sorte semblait avoir trouvé un peu complexe algorithme en ligne et de les mettre en place.

Je me souviens que c'était très, très rapide. Comme, optimisé-pour-une-des centaines ou des milliers de fois par les cadres rapide.

Fondamentalement, il a sauté d'une frontière à la carrés de, le long de la ligne (les points où la ligne traverse les lignes de la grille). Il savait où le prochain point de passage était pour voir quels point de passage était plus proche-une horizontale ou une verticale -- et s'installe à la suivante.

Qui est une sorte de bon dans le concept, mais la mise en œuvre effective s'est avéré être assez pas-si-jolie, et j'ai peur que le niveau d'optimisation pourrait être trop élevé pour ce que j'ai pratiquement besoin (je suis à l'appel de cette traversée de l'algorithme de peut-être cinq ou six fois par minute).

Est-il un simple, facile à comprendre, transparent en droite ligne de la grille de la traversée de l'algorithme?

En termes de programmes:

def traverse(start_point,end_point)
  # returns a list of all squares that this line would pass through
end

où la donnée des coordonnées d'identifier les carrés eux-mêmes.

Quelques exemples:

traverse([0,0],[0,4])
# => [0,0], [0,1], [0,2], [0,3], [0,4]
traverse([0,0],[3,2])
# => [0,0], [0,1], [1,1], [2,1], [2,2], [3,2]
traverse([0,0],[3,3])
# => [0,0], [1,1], [2,2], [3,3]

Notez que les lignes qui se déplacent directement dans les virages ne devrait pas inclure des carrés sur le "aile" de la ligne.

(Bon ol' Bresenham de travail ici, mais c'est un peu en arrière de ce que je veux. Autant que je sache, pour l'utiliser, j'avais au fond de l'appliquer à la ligne, puis la numérisation de chaque carré de la grille pour de vrai ou faux. Impossible, ou au moins inélégante -- pour les grands réseaux)

(Je suis re-regarder dans Bresenham, et Bresenham algorithmes, en raison d'un malentendu de la mine)


Pour plus de précisions, une application possible de ce serait, si j'étais le stockage de tous mes objets dans un jeu à l'intérieur de zones (une grille), et j'ai un rayon, et que vous voulez voir quels objets le rayon touche. À l'aide de cet algorithme, j'ai pu tester le rayon de seulement les objets qui sont à l'intérieur des zones, à la place de chaque objet sur la carte.

La réelle utiliser dans mon application, c'est que chaque tuile a un effet associé avec elle, et un objet qui se déplace à travers un segment de ligne à chaque tour. À chaque tour, il est nécessaire de vérifier pour voir ce qui les places de l'objet a parcouru à travers, et par conséquent, les effets à appliquer à l'objet.

Noter que, à ce stade, la mise en œuvre actuelle, j'ai fait le travail. Cette question est surtout de la curiosité du but. Il y a un moyen plus simple...en quelque sorte...pour un problème simple.


Ce que je cherche exactement? Quelque chose de conceptuellement/soigné et propre. Aussi, j'ai réalisé que grâce à ce que je suis exactement de préciser, de tous les points de début et fin sont toujours au centre des carrés ou des cellules; donc peut-être quelque chose qui prend avantage de cette serait bien ainsi.

  • Où voulez-vous que les extrémités de la ligne à coins des carrés (si oui, lesquelles) ou dans les centres?
  • merci pour souligner l'ambiguïté; j'ai ajouté une photo de la clarification. Je veux dire les centres.
  • merci pour la clarification et de l'image - il est beaucoup plus claire
InformationsquelleAutor Justin L. | 2010-07-13