Abstand ermitteln

Fragen zu Tkinter.
Antworten
Humpanickel
User
Beiträge: 7
Registriert: Donnerstag 13. November 2014, 09:08

Hallo Leute :)
Ich habe vor den Abstand zwischen 2 Objekten zu ermitteln. Ich habe mich dabei der analytischen Geometrie bedient und stelle mir die Koordinaten als Vektoren vor. Dann bilde ich den Betrag mit der Formel: (x²+y²)^0.5

Ich stelle mal mein Beispiel dar:

id_Objekt1=canvas.create_polygon (100, 200)
id_Objekt2=canvas.create_polygon (50, 150)


Um den Vektor der Strecke zu erhalten müsste ich x1-x2 und y1-y2 berechnen. Jedoch weiß ich nicht, wie ich die einzelnen Koordinaten herausnehmen kann, ohne sie manuell einzugeben. Das ähnliche Problem würde sich dann auch darauf beim einsetzen in die obige Formel ergeben.
Ich wäre euch wirklich sehr dankbar, wenn ihr mir helfen könntet.
Benutzeravatar
HarteWare
User
Beiträge: 69
Registriert: Samstag 23. Februar 2013, 21:16
Wohnort: localhost

Kannst du vielleicht ein minimales Beispiel geben? Ich persönlich habe noch nicht ganz verstanden, was das Problem ist.
Da du aber mit Vektoren arbeiten willst, würde ich mal sagen schau dir numpy an.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Was glaubst du warum unser Chefkryptograph sich diesen Problems noch nicht angenommen hat?
Wenn x und y irgendwelche Koordinaten sind, dann bekommt man diese sicher auch aus dem TK-Canvas Objekt.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@Humpanickel: Die Koordinaten zu einer ID bekommt man vom `Canvas`-Exemplar mit der `coords()`-Methode. Falls das die Frage ist. Stellt sich allerdings die Frage ob man diese Information tatsächlich nur im `Canvas` gespeichert haben sollte.

Beim Beispiel verwirrt mich das Polygone mit nur einem Punkt nicht besonders sinnvoll sind. Da wird nichts angezeigt.
Humpanickel
User
Beiträge: 7
Registriert: Donnerstag 13. November 2014, 09:08

Sollte es einen Befehl geben, der den Abstand zwischen 2 Objekten automatisch berechnet, dann würde mir den Rest ersparen. ^^

Da ich diesen Befehl nicht kenne, wollte ich die Koordinaten herausnehmen und mit ihnen weiterrechnen. ich weiß, dass ich mit coords() die Koordinaten ablesen kann, jedoch brauche ich für die Rechnung immer nur eine Koordinate. Also meine Frage besteht darin, wie ich z.B. nur den X-Wert angezeigt bekomme, ohne den Y-Wert, sodass ich nur mit der X-Koordinate weiterrechnen kann.

Das mit dem Polygon kann von mir aus auch durch was anderes wie circle ersetzt werden.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Humpanickel: Du weißt, was ein Indexzugriff auf eine Liste ist?
Humpanickel
User
Beiträge: 7
Registriert: Donnerstag 13. November 2014, 09:08

Nein tut mir Leid, das weiß ich leider nicht :/
BlackJack

@Humpanickel: Dann solltest Du mal ein Grundlagentutorial durcharbeiten. Listen sind ein grundlegender Datentyp in Python, mit dem man umgehen können sollte, bevor man kompliziertere Sachen wie GUIs angeht.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hallo Humpanickel,
Humpanickel hat geschrieben: Ich stelle mal mein Beispiel dar:

id_Objekt1=canvas.create_polygon (100, 200)
id_Objekt2=canvas.create_polygon (50, 150)
wofür soll dieses Beispiel repräsentativ sein? Für Daten, die Du so in dieser Form hast, oder wolltest Du damit einfach ausdrücken, dass Du zwei Punkte hast, deren Abstand Du berechnen möchtest?
BlackJack spielte darauf an, dass die Polygonfiguren bzw. ihre Daten irgendwo her kommen (z.B. eine Liste von Ausgangskoordinaten) und dass es unnötiger Aufwand wäre, erst Polygonfiguren mit den Daten zu zeichnen - zumal ein Punkt pro Polygonfigur gar nichts bringt, wie BJ schon sagte, oder siehst Du damit etwas auf dem Schirm?
Wahrscheinlich meintest Du sowas?:

Code: Alles auswählen

l = [(100, 200), (50, 150)]
id_Objekt0 = c.create_line(l)
In der Ausgangsliste findest Du bereits die x-y-Paare.

Wenn es Dir darum geht, eine Liste in Paare zu trennen, kannst Du die Standardfunktion zip mit (Listen-)Slices verwenden:

Code: Alles auswählen

>>> l = [100, 200, 50, 150]
>>> l_pairs = zip(l[::2], l[1::2])
>>> print l_pairs
[(100, 200), (50, 150)]
Auch hier kann ich BlackJack nur zustimmen, dass Du Dich als erstes zu Listen, aber auch Dictionaries und Tupeln belesen solltest.

Das eigentliche Problem an Deiner Aufgabenstellung ist die Frage, welche Punkte Du miteinander vergleichst. Stell Dir die Eckpunkte eines gleichseitigen Dreiecks mit Seitenlänge 10 cm vor. Zwei der Punkte sind verbunden. Dann ist der Abstand des einzelnen Punktes von den anderen Punkten 10 cm, aber der Abstand zur Strecke als geometrischem Objekt ist kürzer. Solche Abstände im freien Raum genau zu berechnen, ist deutlich aufwändiger als den Pythagoras zu bemühen.

Grüße
sky
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Humpanickel
User
Beiträge: 7
Registriert: Donnerstag 13. November 2014, 09:08

Das Beispiel war vielleicht nicht ganz so repräsentativ. Um mich nur auf mein Problem zu beschränken stelle ich es etwas anders dar:
Ich habe nämlich einen Punkt, den ich per Mausklick auf einer Fläche setzen kann. Die Koordinaten kann ich bereits mit coords() auslesen. Da der Punkt aber variabel ist sind die Koordinaten natürlich nicht einheitlich. Angenommen ich setze den Punkt beliebig und der Befehl coords() zeigt mir an, dass der Punkt bei (100,250) liegt. Nun will ich einfach mit der X-Koordinate 100 weiterrechnen(oder einfach mit print ausgeben). Meine Frage ist also, wie ich diese X-Koordinate verwenden kann, da sie ja variabel ist.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Humpanickel: Wenn etwas variabel ist, speichert man es in einer Variablen. Aber wie BlackJack schon angesprochen hat, wird das in jedem Grundlagentutorial durchgenommen.
Humpanickel
User
Beiträge: 7
Registriert: Donnerstag 13. November 2014, 09:08

Und wo kann ich ein solches Tutorial finden?
Malta
User
Beiträge: 83
Registriert: Samstag 8. Januar 2011, 23:51

Im Thread http://www.python-forum.de/viewtopic.php?f=9&t=32715 findest du das Projekt SimpleImageRuler
Von einem technischen Gegenstand wird ein Foto gemacht und als Größenvergleich rückt der Fotograf einen Maßstab ins Bild oder vielleicht einen Zollstock. Was, wenn ich jetzt wirklich was auf dem Foto nachmessen möchte?
Dafür benutzt man SimpleImageRuler (SIR):
Fotos einladen
eine bekannte Strecke abgreifen, um das System zu kalibrieren
beliebig viele Stecken messen, als Einzelstrecken (line-mode) oder als Pfad (path-mode)
bei Ein- und Auszoomen die Kalibrierung beibehalten
https://github.com/luggels/simpleImageRuler
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Humpanickel: mit was lernst Du Python?
Antworten