Ok, meine idiotischen Fehler bei p4 habe ich gefunden.
p3 habe ich jetzt mal laufen lassen und auch nach 10 Minuten kein Ergebnis bekommen. Ist das normal?
p10 und p11 müssen sicher vorher abgefangen werden, da der Anstieg ja identisch ist und somit kein Schnittpunkt zu ermitteln ist.
Code: Alles auswählen
import sympy as sp
import numpy as np
import matplotlib.pyplot as plt
from pprint import pprint
# ## Points
# general
p1 = [
{'name': '1097', 'x': 87883.671, 'y': 45384.496, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': 0, 'dny': 0, 'dnz': 0},
{'name': '13', 'x': 87833.852, 'y': 45388.750, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': 0, 'dny': 0, 'dnz': 0},
{'name': '4', 'x': 87839.347, 'y': 45408.780, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': 0, 'dny': 0, 'dnz': 0},
{'name': '3', 'x': 87877.157, 'y': 45376.062, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': 0, 'dny': 0, 'dnz': 0}
]
# parallel general
p2 = [
{'name': '1', 'x': 193.500, 'y': 233.500, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '2', 'x': 20.500, 'y': 455.500, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '3', 'x': 205.500, 'y': 270.500, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '4', 'x': 32.500, 'y': 492.500, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None}
]
# line 1 parallel y-axis
p3 = [
{'name': '1', 'x': 62.655, 'y': 581.080, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '2', 'x': 62.655, 'y': 1296.034, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '3', 'x': 280.366, 'y': 797.596, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '4', 'x': 11.051, 'y': 850.639, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None}
]
# line 1 parallel x-axis
p4 = [
{'name': '1', 'x': 1300, 'y': 3200, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '2', 'x': 80, 'y': 3200, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '3', 'x': 800, 'y': 2900, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '4', 'x': 500, 'y': 3400, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None}
]
# line 1 and line 2 orthogonal general
p5 = [
{'name': '1', 'x': 830.4180, 'y': 3683.1586, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None,
'dny': None, 'dnz': None},
{'name': '2', 'x': 626.1359, 'y': 3374.6642, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None,
'dny': None, 'dnz': None},
{'name': '3', 'x': 875.4828, 'y': 3461.4174, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None,
'dny': None, 'dnz': None},
{'name': '4', 'x': 608.6768, 'y': 3638.0938, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None,
'dny': None, 'dnz': None}
]
# line 1 and line 2 orthogonal parallel axis
p6 = [
{'name': '1', 'x': 2800, 'y': 2800, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '2', 'x': 3500, 'y': 2800, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '3', 'x': 3100, 'y': 2400, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '4', 'x': 3100, 'y': 3500, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None}
]
# glancing intersection
p7 = [
{'name': '1', 'x': 1302.775, 'y': 2227.863, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '2', 'x': 905.775, 'y': 2416.439, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '3', 'x': 1344.637, 'y': 2342.931, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '4', 'x': 969.363, 'y': 2575.557, 'z': None, 'sx': None, 'sy': None, 'sz': None, 'dnx': None, 'dny': None,
'dnz': None}
]
# short base line
p8 = [
{'name': '1', 'x': 1302.775, 'y': 2227.863, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '2', 'x': 905.775, 'y': 2416.439, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '3', 'x': 1150.483, 'y': 2620.745, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None,
'dnz': None},
{'name': '4', 'x': 1152.410, 'y': 2678.668, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None,
'dnz': None}
]
# short base line - line1 line2 100gon
p9 = [
{'name': '1', 'x': 200, 'y': 200, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None, 'dnz': None},
{'name': '2', 'x': 500, 'y': 500, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None, 'dnz': None},
{'name': '3', 'x': 500, 'y': 200, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None, 'dnz': None},
{'name': '4', 'x': 481.1950, 'y': 218.8050, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None,
'dnz': None}
]
# parallel and ortogonal y axis
p10 = [
{'name': '1', 'x': 200, 'y': 500, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None, 'dnz': None},
{'name': '2', 'x': 200, 'y': 200, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None, 'dnz': None},
{'name': '3', 'x': 350, 'y': 350, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None, 'dnz': None},
{'name': '4', 'x': 350, 'y': 800, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None, 'dnz': None}
]
# parallel and ortogonal x axis
p11 = [
{'name': '1', 'x': 200, 'y': 200, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None, 'dnz': None},
{'name': '2', 'x': 500, 'y': 200, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None, 'dnz': None},
{'name': '3', 'x': 900, 'y': 300, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None, 'dnz': None},
{'name': '4', 'x': 350, 'y': 300, 'z': 0, 'sx': 0, 'sy': 0, 'sz': 0, 'dnx': None, 'dny': None, 'dnz': None}
]
def set_deviation(points, **args):
for point in points:
# print(f'Old point: {point}')
point.update(args)
# print(f'New point: {point}\n')
def draw_labels(x, y, names):
for x, y, name in zip(x, y, names):
plt.annotate(
f"{name}", # text
(x, y), # label position
textcoords="offset points", # how to position the text
xytext=(2, 5), # distance from text to points (x,y)
ha='left' # horizontal alignment can be left, right or center
)
def draw_sketch(points, xs, ys, draw_intersection=False):
# setup points
x_g1 = [points[0]['x'], points[1]['x']]
y_g1 = [points[0]['y'], points[1]['y']]
x_g2 = [points[2]['x'], points[3]['x']]
y_g2 = [points[2]['y'], points[3]['y']]
# plot the lines
plt.plot(y_g1, x_g1)
plt.plot(y_g2, x_g2)
# plot the points
plt.scatter(y_g1, x_g1)
plt.scatter(y_g2, x_g2)
# setup labels
point_x = [point['x'] for point in points]
point_y = [point['y'] for point in points]
point_names = [point['name'] for point in points]
if draw_intersection:
plt.scatter(ys, xs)
point_x.append(xs)
point_y.append(ys)
point_names.append('S')
draw_labels(point_y, point_x, point_names)
# setup axis
plt.axis('equal') # same scale in all axis
plt.show()
def calculate(points):
x1, y1, x2, y2, x3, y3, x4, y4 = all_symbols = sp.symbols('x1 y1 x2 y2 x3 y3 x4 y4')
m1 = (y2 - y1) / (x2 - x1)
m2 = (y4 - y3) / (x4 - x3)
xs = (y3 - y1 + m1 * x1 - m2 * x3) / (m1 - m2)
ys = y1 + m1 * (xs - x1)
derivatives_xs = [sp.diff(xs, s) for s in all_symbols]
derivatives_ys = [sp.diff(ys, s) for s in all_symbols]
if points[0]['x'] == points[1]['x']:
print('Fall A')
xs = sp.limit(xs, x2, x1)
ys = sp.limit(ys, x2, x1)
derivatives_xs = [sp.limit(f, x2, x1) for f in derivatives_xs]
derivatives_ys = [sp.limit(f, x2, x1) for f in derivatives_ys]
elif points[2]['x'] == points[3]['x']:
print('Fall B')
xs = sp.limit(xs, x4, x3)
ys = sp.limit(ys, x4, x3)
derivatives_xs = [sp.limit(f, x4, x3) for f in derivatives_xs]
derivatives_ys = [sp.limit(f, x4, x3) for f in derivatives_ys]
set_deviation(points, sx=0.005, sy=0.005, sz=0.000, dnx=0.00001, dny=0.00001, dnz=0.00001)
sub = {
x1: points[0]['x'], y1: points[0]['y'],
x2: points[1]['x'], y2: points[1]['y'],
x3: points[2]['x'], y3: points[2]['y'],
x4: points[3]['x'], y4: points[3]['y'],
}
deviations = [
points[0]['sx'], points[0]['sy'],
points[1]['sx'], points[1]['sy'],
points[2]['sx'], points[2]['sy'],
points[3]['sx'], points[3]['sy'],
]
xs_value = xs.subs(sub)
ys_value = ys.subs(sub)
standard_deviation_xs = sum(
dxs.subs(sub) ** 2 * ds ** 2 for dxs, ds in zip(derivatives_xs, deviations)
) ** 0.5
standard_deviation_ys = sum(
dys.subs(sub) ** 2 * ds ** 2 for dys, ds in zip(derivatives_ys, deviations)
) ** 0.5
print(f'yS = {ys_value} \u00B1{standard_deviation_ys}')
print(f'xS = {xs_value} \u00B1{standard_deviation_xs}')
draw_sketch(points, xs_value, ys_value, draw_intersection=True)
def main():
calculate(p11)
# p1 ...OK - general
# p2 ...no tolerance implemented yet - parallel general
# p3 ... line 1 parallel y-axis
# p4 ...OK - line 1 parallel x-axis
# p5 ...OK - line 1 and line 2 orthogonal general
# p6 ...OK, but - line 1 and line 2 orthogonal parallel axis
# p7 ...OK - glancing intersection
# p8 ...OK - short base line general
# p9 ...OK - short base line - line1 line2 100gon
# p10... parallel and ortogonal y axis
# p11... parallel and ortogonal x axis
#
# missing:
# negativ signs
# (partially) negativ sign
if __name__ == "__main__":
main()