Steering path following

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Benutzeravatar
__blackjack__
User
Beiträge: 13005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hell: Funktionen sind wie alles was man in Python an einen Namen binden kann Objekte. Also Werte. Damit kann man alles machen was man auch mit anderen Objekten machen kann – an andere Namen binden, als Argumente bei Aufrufen übergeben, in Datenstrukturen wie Listen oder Wörterbücher stecken, …

Es dürfte dafür keine gesonderte Überschrift geben, denn mehr gibt es dazu ja eigentlich nicht zu sagen. Es gibt einen Haufen Funktionen die Funktionen als Argumente erwarten (`map()`, `filter()`, …) und auch welche die Funktionen als Rückgabewerte haben (`functools`-Modul, `operator`-Modul, …) und im `operator`-Modul gibt es für jeden Operator den die Python-Syntax kennt, eine Funktion, falls man so etwas irgendwo zum Übergeben an andere Funktionen braucht.

Und ``lambda``-Ausdrücke sind in dem Zusammenhang noch interessant, wenn man eine einfache Funktion braucht, für die man nicht extra eine Funktion mit Namen definieren möchte.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
hell
User
Beiträge: 40
Registriert: Montag 1. Oktober 2018, 18:01

hallo _deets_ und _blackjack_
danke für eure Antworten .
Was mich halt ziemlich verblüfft hat, war, dass im Beispiel von _deets_
nur der Name der Funktion zugewiesen wurde ( und nicht der gesamte 'Funktionsausdruck ' : strategy_a(i) ) ,
und wie ihr sagt damit an einen anderen Namen gebunden wurde.
Mit der Zuweisung: current_strategy = strategy_a wird also eine Referenz
auf strategy_a(i) erstellt?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, NICHT auf strategy_a(i). Woher soll denn das i kommen in dem Ausdruck "current_strategy = strategy_a"? Sowas kann man auch machen, das sieht dann aber anders aus.

Alles was da passiert ist, dass das callable, das du gerade unter dem Namen strategy_a finden kannst an einen anderen Namen gebunden wird. Du kannst auch

Code: Alles auswählen

foo = bar = pille = palle = furz = egal = das_objekt_formerly_known_as_strategy_a = strategy_a
machen. Dann hast du halt 7 anderen Namen, unter denen es zu finden ist.
hell
User
Beiträge: 40
Registriert: Montag 1. Oktober 2018, 18:01

ok _deets_ , ein letztes mal möchte ich deine wertvolle Zeit in Anspruch nehmen und poste diesen (nicht funktionierenden) Code zum Ausgangsproblem. Dabei habe ich dein Beispiel eins als Vorlage verwendet.

Code: Alles auswählen

def follow_path(self, path):
        
        target = vec2d(0,0)
        path.nodes = path.get_nodes()
        
            
        self.seek_function = self.seek
        
        for i in range(len(path.nodes)):
            target = path.nodes[i]
            distance = self.location.get_distance(target)
            
            if i >= len(path.nodes)-1:
                print(i)
                self.seek_function = self.seek_with_approach
            self.seek_function(i)

In meiner ersten Version wurde mit: distance <= 10: curren_node += 1 von node zu node iteriert. range iteriert ebenfalls über die Nodeliste,
ich habe keine Ahnung, wie das alles funktioniert.
An dieser Stelle will ich mich bei bei dir bedanken für deine Hilfe und Geduld, tolles Forum.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wann wird denn follow_path aufgerufen? Was macht diese Funktion konzeptionell? Wie oft wird sie aufgerufen im Verhaeltnis dazu wieviele Wegepunkte du hast?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Oder anders gefragt: was ist dem Algorithmus nach das Kriterium den nächsten Knoten zu nehmen. Ist dieses Kriterium durch deine for Schleife erfüllt? Und ist dir klar, das mein Beispiel ein Beispiel war, und das Umschalten von Strategien darzustellen? Und NICHT voll umfänglich eine Implementierung für dein eigentliches Problem?
hell
User
Beiträge: 40
Registriert: Montag 1. Oktober 2018, 18:01

hallo _deets_ ,
ich glaube du musst dir keine Mühe mehr geben, ich raffe es noch nicht.
Ich hatte mir das auch schon gedacht, dass die Methode ja ca. 60 mal/ sec aufgerufen wird, range auch.
Ich werde in nächster Zeit über deine Tipps und Ideen noch einmal genauer nachdenken. Für jetzt bin ich an meinen Grenzen angelangt.
Antworten