If- Schleife falsche Bedingung ausgeführt

Code-Stücke können hier veröffentlicht werden.
Antworten
jnkws
User
Beiträge: 7
Registriert: Dienstag 15. Dezember 2020, 11:47

Dienstag 15. Dezember 2020, 11:59

Hallo Leute,

ist mein erster Post in diesem Forum. Hoffe ich mache alles richtig.

Ich habe eine If-Schleife geschrieben die bei einer falschen Bedingung ausgelöst wird. Im Bild unten habe ich den Debugger drüberlaufen lassen und ich kann mir einfach nicht erklären warum die erste If-Schleife ausgeführt wird.

Hoffe ihr könnt mir helfen. Bin noch Neuling in Python und offen für Tipps.

Gruß
Janik

Code: Alles auswählen

def punkte_Kreisbogen(inputGCodeKreis):
    """
    Ähnliche Funktion wie Kreislänge bestimmen. Unterteilt Kreis in gleichmäßig verteilte Punkte anhand des Bogenmaßes

    :param inputGCodeKreis:
    :return:
    """
    # Kreis parametrisieren
    start = [position[0], position[1]]    #start = np.array([position[0], position[1], position[2], position[3]])
    ende = [inputGCodeKreis[1], inputGCodeKreis[2]]
    mittelpunkt = [inputGCodeKreis[3] + start[0], inputGCodeKreis[4] + start[1]]
    radius = np.hypot(ende[0] - mittelpunkt[0], ende[1] - mittelpunkt[1])
    global schritt_Rest

    # Winkelberechnung, alle Winkel werden in Grad ausgegeben
    if ((start[0] - mittelpunkt[0]) > 0) and ((start[1] - mittelpunkt[1]) >= 0):    # x>0 und y>=0 --> arctan(y/x)
        startWinkel = np.degrees(np.arctan((start[1] - mittelpunkt[1]) / (start[0] - mittelpunkt[0])))
    elif start[0] - mittelpunkt[0] > 0 and start[1] - mittelpunkt[1] < 0:    # x>0 und y<0 --> arctan(y/x) + 2pi
        startWinkel = np.degrees(np.arctan((start[1] - mittelpunkt[1]) / (start[0] - mittelpunkt[0]))) + 360
    elif start[0] - mittelpunkt[0] == 0 and start[1] - mittelpunkt[1] < 0:    # x=0 und y<0 --> 270
        startWinkel = 270.0
    elif start[0] - mittelpunkt[0] == 0 and start[1] - mittelpunkt[1] > 0:    # x=0 und y<0 --> 90
        startWinkel = 90.0
    elif start[0] - mittelpunkt[0] < 0:    # x<0 --> arctan(y/x) + pi
        startWinkel = np.degrees(np.arctan((start[1] - mittelpunkt[1]) / (start[0] - mittelpunkt[0]))) + 180
Bild
Sirius3
User
Beiträge: 14207
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 15. Dezember 2020, 13:20

Funktionsnamen und Variablennamen werden komplett klein geschrieben. Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen, also position. Globale Variablen sollt man gar nicht benutzen, schritt_Rest wird auch nicht benutzt. Die Funktion hat auch gar keinen Rückgabewert. Da fehlt also was.

Du solltest die selbe Berechnung nicht ständig wiederholen.

Code: Alles auswählen

def punkte_kreisbogen(position, input_gcode_kreis):
    """
    Ähnliche Funktion wie Kreislänge bestimmen. Unterteilt Kreis in gleichmäßig verteilte Punkte anhand des Bogenmaßes

    :param position, input_gcode_kreis:
    :return:
    """
    # Kreis parametrisieren
    start = [position[0], position[1]]    #start = np.array([position[0], position[1], position[2], position[3]])
    ende = [input_gcode_kreis[1], input_gcode_kreis[2]]
    mittelpunkt = [input_gcode_kreis[3] + start[0], input_gcode_kreis[4] + start[1]]
    radius = np.hypot(ende[0] - mittelpunkt[0], ende[1] - mittelpunkt[1])
    x = start[0] - mittelpunkt[0]
    y = start[1] - mittelpunkt[1]

    # Winkelberechnung, alle Winkel werden in Grad ausgegeben
    if x > 0 and y >= 0:    # x>0 und y>=0 --> arctan(y/x)
        start_winkel = np.degrees(np.arctan(y / x))
    elif x > 0 and y < 0:    # x>0 und y<0 --> arctan(y/x) + 2pi
        start_winkel = np.degrees(np.arctan(y / x)) + 360
    elif x == 0 and y < 0:    # x=0 und y<0 --> 270
        start_winkel = 270.0
    elif x == 0 and y > 0:    # x=0 und y<0 --> 90
        start_winkel = 90.0
    elif x < 0:    # x<0 --> arctan(y/x) + pi
        start_winkel = np.degrees(np.arctan(y / y)) + 180
    return start_winkel
Viele Bedingungen schließen sich gegenseitig aus, durch geschickte Umordnung läßt sich einiges an Code sparen:

Code: Alles auswählen

    # Winkelberechnung, alle Winkel werden in Grad ausgegeben
    if x == 0:
        start_winkel = 270.0 if y < 0 else 90.0
    else:
        start_winkel = np.degrees(np.arctan(y / x))
        if x > 0 and y < 0:
            start_winkel += 360
        elif x < 0:
            start_winkel += 180
Es gibt arctan2:

Code: Alles auswählen

start_winkel = np.degrees(np.arctan2(y, x))
jnkws
User
Beiträge: 7
Registriert: Dienstag 15. Dezember 2020, 11:47

Dienstag 15. Dezember 2020, 13:44

Danke für die schnelle Antwort.

Habe gerade nachgelesen das globale Variablen fehleranfälliger sind. Wieso ist das so?
Finde globale Variablen machen das Programm übersichtlicher und einfacher:) Gibt es eine alternative zu globalen Variablen? Könnte mir zum Beispiel eine Art getter oder setter Funktion vorstellen, jedoch beruht das im Endeffekt auch auf globalen Variablen.
Benutzeravatar
pillmuncher
User
Beiträge: 1253
Registriert: Samstag 21. März 2009, 22:59
Wohnort: München

Dienstag 15. Dezember 2020, 14:34

In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 14207
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 15. Dezember 2020, 15:04

Globale Variablen sind das Gegenteil von übersichtlich. Man hat keine Übersicht darüber, wo welche Variable geändert oder verwendet wird. Variablen kommen über die Argumente in eine Funktion. Dann ist die Funktion eine in sich abgeschlossene Einheit, kann separat getestet und wiederverwendet werden.
Antworten