Python Programm das Koordinaten liest

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
gesa942
User
Beiträge: 1
Registriert: Mittwoch 21. Dezember 2022, 13:32

Hallo ich muss ein Python Programm schreiben das aus einer Liste (.txt) X, Y und Z Koordinaten liest, und durch klicken zuvor ausgegeben 2 Koordinaten einliest und den Abstand zwischen diesen misst. Auch muss ich die Z werte die auf der Linie zwischen P1 und P2 in einer Matplotlib darstellen. Ich bin so weit gekommen jedoch funktioniert es nicht richtig... Ich habe sehr wenig erfahrung vlt könnte ja mal jemand drüber schauen :)

Code:
import MaterialWS22
import matplotlib.pyplot as plt

print("Klicken sie bitte zwei Punkte im Bild an um die Höhenmessung durchzuführen.")
from MaterialWS22 import Klickpunkte
P1, P2 = Klickpunkte ("BO_Querenburg.jpg")
print ("Sie haben gewählt:", P1, P2)


x1 = P1[0]
y1 = P1[1]

x2 = P2[0]
y2 = P2[1]




with open("BO_Querenburg.txt", "r") as Koordinaten:
X = []
Y = []
Z = []

for Wert in Koordinaten:
parts = Wert.split(',')
X.append(int(parts[0]))
Y.append(int(parts[1]))
Z.append(float(parts[2]))

for i in range(len(X)):
x = X
y = Y
z = Z
if x1 == x and y1 <= y <= y2:
print()
elif x1 <= x <= x2 and y2 == y:
print()
Benutzeravatar
__blackjack__
User
Beiträge: 14067
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@gesa942: Anmerkungen zum Quelltext: `MaterialWS22` wird importiert, aber nirgends verwendet. Später wird *aus* dem Modul `Klickpunkte` importiert. Importe sollten am Anfang vom Modulstehen und nicht über den Quelltext verstreut, damit man dort schon sieht wovon ein Modul abhängt.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

`Klickpunkte` ist keine Klasse sondern eine Funktion, sollte also schon mal keine Grossbuchstaben enthalten. Aber auch Inhaltlich ist der Name problematisch. Der wäre prima für einen passiven *Wert* der so etwas wie ”Klickpunkte” darstellt, aber nicht für eine Funktion die etwas tut. Funktionen und Methoden werden üblicherweise nach der Tätigkeit benannt, die sie durchführen.

`P1` und `P2` werden nicht wirklich verwendet. Das wäre kürzer und lesbarer wenn man diese Zwischenwerte nicht an nichtssagende Namen bindet.

``for wert in koordinaten:`` klingt als wäre `wert` ein einzelner Wert aus Koordinaten. Das `koordinaten` eigentlich Textzeilen enthält und `wert` dementsprechend *eine* *Zeile* ist, aus der man die Werte (Mehrzahl) erst parsen muss, ist da nicht wirklich ersichtlich.

Man sollte zusammgehörende Werte nicht in ”parallelen” Datenstrukturen speichern. Das macht im Nachgang nur wieder unnötig Arbeit die Werte aus den drei Listen wieder zusammenzuführen. Das hier auch noch mit einem „anti pattern“, denn über ganze Zahlen bis zur Länge von einer Sequenz zu iterieren, nur um dann damit auf die Elemente zuzugreifen, macht man in Python nicht. Selbst wenn die Daten in ”parallelen” Sequenzen stecken nicht. Dafür gibt es `zip()`.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import matplotlib.pyplot as plt
from MaterialWS22 import erfrage_klickpunkte


def main():
    name = "BO_Querenburg"
    print(
        "Klicken sie bitte zwei Punkte im Bild an um die Höhenmessung"
        " durchzuführen."
    )
    (x_a, y_a), (x_b, y_b) = erfrage_klickpunkte(f"{name}.jpg")
    print("Sie haben gewählt:", (x_a, y_a), (x_b, y_b))

    with open(f"{name}.txt", "r", encoding="ascii") as zeilen:
        koordinaten = []
        for zeile in zeilen:
            x_text, y_text, z_text = zeile.split(",")
            koordinaten.append((int(x_text), int(y_text), float(z_text)))

    for x, y, _ in koordinaten:
        if x_a == x and y_a <= y <= y_b:
            print()
        elif x_a <= x <= x_b and y_b == y:
            print()


if __name__ == "__main__":
    main()
Was heisst denn „jedoch funktioniert es nicht richtig...“? Da steht kein Code der den Abstand zwischen den beiden Punkten ermittelt. Und auch keiner der Z-Werte auf der Linie zwischen den beiden Punkten ermitteln.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten