turtle.position() liefert unterschiedliche Werte

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

print(positon(), int(position()[0]),int(position()[1]) liefert
(200.00,100.00) (200, 99)
Wie kann man das korrigieren?
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

chatGPT liefert folgende Antwort:
Hallo! Die Funktion turtle.position() gibt die aktuelle Position des Turtle-Objekts zurück. Wenn die Koordinaten der Position Ganzzahlen sind, wird ein Tupel mit Ganzzahlen zurückgegeben. Wenn die Koordinaten jedoch Fließkommazahlen sind, wird ein Tupel mit Fließkommazahlen zurückgegeben. Dies kann passieren, wenn du die Turtle mit Fließkommazahlen bewegst oder wenn du Transformationen anwendest, die zu Fließkommakoordinaten führen. Es ist wichtig zu beachten, dass die Turtle-Grafikbibliothek die Position intern als Fließkommazahlen speichert, um eine genauere Darstellung zu ermöglichen.

Aber das hilft mir nichts.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Ausgabe stimmt nicht mit Deinem Code überein. Hättest Du wirklich die Position ausgegeben lassen, dann hättest Du gesehen, dass es nicht 100 sondern irgendwas wie 99.999 lautet. Wenn Du dann per int die Nachkommastellen abschneidest, bleibt 99 übrig.
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Was ist denn falsch an
print(position()) ?
Es gibt mir eine float-Zahl mit zwei Nachkommastellen aus.
Was heißt "wirklich die Position" ?
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

hubgra hat geschrieben: Sonntag 23. Juli 2023, 16:51 print(positon(), int(position()[0]), int(position()[1])
liefert (200.00,100.00) (200, 99)
Im ersten Funktionsaufruf fehlt ein i und es fehlt die abschließende Klammer von print()
Falls position() (200.00, 100.00) ausgibt, dann würde int(position()[0]) 200 und int(position()[1]) 100 ausgeben.
Insgesamt würde

Code: Alles auswählen

(200.00, 100.00) 200 100
ausgegeben und nicht

Code: Alles auswählen

(200.00,100.00) (200, 99)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man per print ein Tuple mit zwei floats ausgibt, dann werden alle signifikanten Ziffern ausgegeben, also entweder 100.0 wenn es exakt 100 wäre, oder eben zum Beispiel 99.9984302 wenn es nicht exakt 100 ist. Du benutzt irgendwas, was floats auf zwei Nachkommastellen rundet, und das ist nicht hilfreich, weil Du dann nicht erkennen kannst, dass die Zahl in Wirklichkeit kleiner als 100 ist.
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Hier sind ein paar Ausgaben:
(190.00,-0.00) (190, 0)
(200.00,-0.00) (200, 0)
(200.00,10.00) (200, 9)
(200.00,20.00) (200, 19)
Wenn der Punkt (200,0) erreicht ist, soll left(90) gemacht werden und dann weiter vorwärts geangen werden.
Ich kenne einen Trick, wie man sich statt 12.2345999999 die Zahl 12.23446 ausgeben lassen kann, das habe ich aber nicht gemacht.
Ich vermute, dass 90° in pi/4 umgewandelt wird, und schon hat man float-Werte, die aber gerundet werden. Es gibt ja auch kein Pixel an der Stelle 99.9984302.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

In welcher Umgebung führt Du welchen Code aus?

Du mußt halt irgendwie mit der Ungenauigkeit von floats umgehen, wie genau, hängt von der jeweiligen Aufgabe ab.
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Ich wollte die Richtung ändern, wenn
position() in [(200,0), (200,200), (0,200)]
erfüllt ist; das geht eben mit left(90) nicht, der schöne rechte Winkel ist für turtle eben nichts Besonderes.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hubgra: Der tatsächliche Wert wird da sehr nah dran liegen. Musst Du halt prüfen ob `position()` sehr nah an einem dieser drei Punkte dran liegt.

Code: Alles auswählen

any(is_almost_equal(position(), point) for point in [(200,0), (200,200), (0,200)])
Mit der Definition von `is_almost_equal()` als Übung für den Leser. 😀
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Die Antwort von ChatGPT ist nicht ganz richtig.

Die Position wird offensichtlich bei Python 3.11.4 als float ausgegeben.
https://docs.python.org/3/library/turtl ... e.position

Beispiel:

Code: Alles auswählen

[andre@andre-Fujitsu-i5 ute_musik]$ ipython
iPython 3.11.4 (main, Jun  7 2023, 15:44:48) [GCC 13.1.1 20230429]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.14.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import turtle

In [2]: t = turtle.Turtle()

In [3]: t.position()
Out[3]: (0.00,0.00)

In [4]: t.pos()
Out[4]: (0.00,0.00)

In [5]: t.setpos(0, 0)

In [6]: t.pos()
Out[6]: (0.00,0.00)
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ah, damit ist jetzt auch klar wo die 0en nach dem Komma her kommen. Das ist kein normales Tupel sondern Objekte vom Typ `turtle.Vec2D` die eine leicht doofe `__repr__()`-Implementierung haben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Nee, wir sind hier gerade beim `turtle`-Modul aus der Standardbibliothek. Die dortige Klasse ist deutlich kürzer und hat wie gesagt eine doofe `__repr__()`-Implementierung, die den Typ nicht enthält, und die beiden Komponenten immer mit zwei Nachkommastellen ausgibt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Die Position wird intern als float gespeichert. Die "doofe" Repräsentation zeigt nur die letzten 2 Stellen an. Da schon bei der Initialisierung floats gespeichert werden, werden durch weitere Berechnungen nicht zufällig wieder integer entstehen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten