Ich habe dieses Problem jetzt seit ein paar Tagen angestarrt. Ich habe diese Grafik zusammengestellt, um das Problem besser veranschaulichen zu können: (Aus der Grafik wissen wir, dass sich die Linie schneidet [1, 1], [1, 2], [2, 2], [2, 3] und endet mit [ 3,3])
Ich möchte entlang der Linie zu jedem Gitterraum gehen und prüfen, ob das Material des Gitterraums fest ist. Ich habe das Gefühl, dass ich die Mathematik bereits kenne, aber ich konnte sie noch nicht aneinander reihen. Ich verwende dies, um die Sichtlinie zu testen und Knoten zu entfernen, nachdem ein Pfad über meine Pfadfindungsalgorithmen gefunden wurde. Meine Agenten können nicht durch einen festen Block sehen, daher können sie sich nicht durch einen bewegen, daher wird der Knoten nicht aus dem Pfad entfernt, weil er ist erforderlich, um eine Ecke zu navigieren.
Ich brauche also einen Algorithmus, der entlang der Linie zu jedem Gitterraum geht, den er schneidet. Irgendwelche Ideen?
Ich habe mir viele gängige Algorithmen wie den von Bresenham angesehen, die in vordefinierten Intervallen entlang der Linie ausgeführt werden (bei dieser Methode werden leider Kacheln übersprungen, wenn sie sich mit einem kleineren Keil als der Schrittgröße schneiden).
Ich fülle mein Whiteboard jetzt mit einer Vielzahl von Funktionen für Boden () und Decke () - aber es wird zu kompliziert und ich befürchte, es könnte zu einer Verlangsamung führen.
quelle
Antworten:
Wenn Sie den Startblock kennen (Sie kennen Punkt X und Sie nehmen Block [0,1] nicht in die Blockliste auf, also kennen Sie wahrscheinlich auch den Startblock), sollten Sie sicher den Bresenham-Algorithmus verwenden. Du hast geschrieben, du hast es angeschaut.
Es ist ein geeigneter Algorithmus für dieses Problem. Es kann auch so geschrieben werden, dass es nur mit ganzen Zahlen berechnet. Im Internet finden Sie viele Implementierungen.
BEARBEITEN:
Es tut mir leid, ich habe nicht bemerkt, dass Bresenham nicht alle Blöcke findet. Also habe ich eine bessere Lösung gefunden . Es gibt auch Code in C ++, aber ich denke, es sollte nicht schwer zu verstehen sein :)
quelle
Der Code im Beispiel, auf den die akzeptierte Antwort verweist, muss für perfekt diagonale Linien angepasst werden. Hier ist eine vollständige Demo-Anwendung, die mit Qt (C ++ und QML) geschrieben wurde.
Relevanter C ++ - Code:
quelle