Seite 1 von 1

Geradenschnitt

Verfasst: Dienstag 10. Januar 2023, 21:13
von Feedback1000
Hallo.

Ich bastele gerade an einem Tool um verschiedenste (vermessungstechnische) Schnitt-Varianten berechnen zu lassen - als erstes den so genannten Geradenschnitt.
In einem ersten Schritt will ich ein paar Komfort-Funktionen einbauen (ich weis: in dem Stadium des Projekts viel zu früh).
Aber das ganze soll später noch viel weiter gehen: es sollen später noch ein paar Spezialfälle und Randbedingungen abgefangen werden und dann auch noch analytische UND nummerische abgeleitet werden.

Für einen mini-ersten Schritt:
Was hier bei der Funktion set_deviation passieren soll:
In Version 1 soll die Funktion zwei Parameter bekommen: dimension und value. Es sollen dann alle Einträge von points[] nach dimension durchsucht werden und der Wert auf value gesetzt werden.
In einem ersten Versuch war der Plan mir mal die Werte von 'Sx' ausgeben zu lassen und zu prüfen, ob ich Werte überhaupt ansprechen und später dann auch überschreiben kann, aber selbst das klappt nicht. Könnt ihr mir mal bitte sagen, warum nicht?


Hier Stand der Dinge:

Code: Alles auswählen

# math. bibs
import math
from sympy import *
import numpy as np
# other bibs
from pprint import pprint

# raw data
points = [
    {},
    {'name': '1097', 'x': 883.671, 'y': 384.496, 'z': None, 'Sx': None, 'Sy': None, 'Sz': None},
    {'name': '13', 'x': 833.852, 'y': 388.750, 'z': None, 'Sx': None, 'Sy': None, 'Sz': None},
    {'name': '4', 'x': 839.347, 'y': 408.780, 'z': None, 'Sx': None, 'Sy': None, 'Sz': None},
    {'name': '3', 'x': 877.157, 'y': 376.062, 'z': None, 'Sx': None, 'Sy': None, 'Sz': None}
]


def set_deviation():
    for point in points:
        print(point['Sx'])


set_deviation()
# pprint(points)


m1 = (points[2]['y'] - points[1]['y']) / (points[2]['x'] - points[1]['x'])
m2 = (points[4]['y'] - points[3]['y']) / (points[4]['x'] - points[3]['x'])
# print(m1)
# print(m2)

xs = (points[3]['y'] - points[1]['y'] + m1 * points[1]['x'] - m2 * points[3]['x']) / (m1 - m2)
ys = points[1]['y'] + m1 * (xs - points[1]['x'])
print(xs)
print(ys)

Re: Geradenschnitt

Verfasst: Dienstag 10. Januar 2023, 22:01
von Feedback1000
Habe gerade selbst eine Lösung mit einigen "Probier"-Aufwand gefunden:

Code: Alles auswählen

def set_deviation(dimension, value):
    if dimension in ['Sx', 'Sy', 'Sz']:
        for point in points:
            point[dimension] = value
    else:
        print('Invalid dimension. Only "Sx", "Sy", "Sz" are allowed.')
Danke euch trotzdem.
VG

Re: Geradenschnitt

Verfasst: Dienstag 10. Januar 2023, 22:47
von __blackjack__
@Feedback1000: Also im ersten Beitrag verschweigst Du die Ausnahme die da offensichtlich ausgelöst wird.

Funktionen bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben. `set_deviation()` greift aber einfach so auf `points` zu. Das sollte auf Modulebene nicht existieren, dann können solche Fehler auch nicht passieren.

Die Ausgabe im Fehlerfall ist nicht sinnvoll. Das sollte eine Ausnahme sein, damit der Aufrufer auch darauf reagieren kann, falls etwas falsches übergeben wird.

Wörterbücher die immer den gleichen Satz an Schlüsseln haben sind eigentlich Objekte und dafür würde man eine Klasse schreiben.