Hi,
hier die Routine, welche prüft, ob das Feld betreten werden darf.
Code:
int Navigation::FeldFrei(int x, int y, void *p)
{
int i;
unsigned long lngOffset; // Daten offset in der Karten
char *pointer; // Daten pointer
if (x > KARTENGROESSE-2) return false; // Bereichskontrolle x
if (y > KARTENGROESSE-2) return false; // Bereichskontrolle y
if (x < 2 ) return false; // Zu nah am Rand
if (y < 2 ) return false; // Zu nah am Rand
pointer = (char*)p; // Pointer von Basisadresse legen
lngOffset= x + (y * KARTENGROESSE); // Y Adresse in der Karten ermitteln
pointer += lngOffset; // Adresse berechnen
if (*pointer > 20)
return false; // Mit groesser Sicherheit ein Hindernis !
// Pruefe inneren Roboterbereich / aesserer Bereich erster Teil
for(i=0;i<8;i++)
{
if( *(pointer + InnerArray[i]) > 20 ) // Ist eine Schwellwert überschritten
return false; // Ist ein Hindernis im Inneren Kreis
if( *(pointer + OuterArray[i]) > 20 ) // Ist eine Schwellwert überschritten
return false; // Ist ein Hindernis im aeusseren Kreis
}
// Pruefe auesseren Roboterbereich
for(i=8;i<16;i++)
{
if( *(pointer + OuterArray[i]) > 20 ) // Ist eine Schwellwert überschritten
return false; // Ist ein Hindernis im Aeusseren Kreis
}
return true; // Feld kann betreten werden
}
Diese Routine wird innerhalb des A* hier aufgerufen (via udValid()):
Code:
void CPathFinder::CreateChildren(_asNode *node)
{
int x = node->x; // X / Y Werte aus performancegruenden
int y = node->y; // in lokale Variablen
for (int i=-1;i<2;i++) // Durchsuche alle umgebenen Knoten fuer den Weg
{
for (int j=-1;j<2;j++) // in alle Richtungen
{
if (i == 0 && j == 0 || // Ist der aktuelle Knoten aktiv !
!udValid(x+i, y+j, m_pCBData)) // oder darf dieses Feld nicht betreten werden
{
continue; // Dann Schleife hier abbrechen (kein Linkchild)
}
LinkChild(node, x+i, y+j);
}
}
}
Die Seite von "Patrick Leste" ist mir bekannt und sie war schon eine gute Hilfe:
Leider sind die Links für eine "falsche Heuristik" für mich nicht klar genug.
Leider kann ich seine Implemetierung nicht mit der meinigen vergleichen.
Gruss Ritchie
P.S: Fehler in der KostenRoutine gefunden . Überbewertet.
Lesezeichen