Python :: Aufgabe #350
4 Lösungen
Schnittpunkt zweier Geraden endlicher Länge
Fortgeschrittener - Python
von hollst
- 20.04.2021 um 10:25 Uhr
In der unendlich ausgedehnten euklidischen 2D-Eben wähle man zufällig vier unterschiedliche Punkte P1, P2, P3 und P4. Gedanklich verbinde man P1 und P2 mit einer geraden Linie L12 sowie P3 und P4 mit einer geraden Linie L34.
Man schreibe eine Funktion, die als Rückgabewert ausgibt, ob sich L12 und L34 schneiden in Abhändigkeit von den Anfangs-/Endpunkten P1 ... P4.
Viel Spaß!
Man schreibe eine Funktion, die als Rückgabewert ausgibt, ob sich L12 und L34 schneiden in Abhändigkeit von den Anfangs-/Endpunkten P1 ... P4.
Viel Spaß!
Lösungen:
"""
#350: Schnittpunkt zweier Geraden endlicher Länge
In der unendlich ausgedehnten euklidischen 2D-Eben wähle man zufällig vier unterschiedliche Punkte P1, P2, P3 und P4.
Gedanklich verbinde man P1 und P2 mit einer geraden Linie L12 sowie P3 und P4 mit einer geraden Linie L34. Man schreibe
eine Funktion, die als Rückgabewert ausgibt, ob sich L12 und L34 schneiden in Abhändigkeit von den Anfangs-/Endpunkten
P1 ... P4.
"""
def prf_schnittp(p1, p2, p3, p4):
steig_a = (p2[1] - p1[1]) / (p2[0] - p1[0])
steig_b = (p4[1] - p3[1]) / (p4[0] - p3[0])
schni_a = p1[1] - steig_a * p1[0]
schni_b = p3[1] - steig_b * p3[0]
if steig_a == steig_b:
print("Der Verlauf ist parallel")
return None
x = (schni_b - schni_a) / (steig_a - steig_b)
y = steig_a * x + schni_a
print("Der Schnittpunkt liegt bei (x y):", x, y)
prf_schnittp([5, 1], [1, 5], [2, 2], [5, 5])
prf_schnittp([5, 1], [1, 5], [6, 2], [2, 6])
import random
def intersection_lines(p1, p2, p3, p4):
if ((p1[1]-p2[1])/(p1[0]-p2[0])) != ((p3[1]-p4[1])/(p3[0]-p4[0])):
return True
else:
return False
# test
def rnd_points(n=1000, i=4):
for _ in range(i):
yield random.randint(-n, n), random.randint(-n, n)
points1 = rnd_points()
points2 = ((-5,-5), (5,5), (300, 100), (400, 200))
print(intersection_lines(*points1))
print(intersection_lines(*points2))
import numpy as np
P1 = (1, 2)
P2 = (3, 4)
P3 = (2, 9)
P4 = (6, 3)
A = np.array([[P2[0] - P1[0], P3[0] - P4[0]], [P2[1] - P1[1], P3[1] - P4[1]]])
b = np.array([P3[0] - P1[0], P3[1] - P1[1]])
z = np.linalg.solve(A, b)
check = True
for e in z:
if e > 1:
check = False
break
if not check:
print("Die Linien schneiden sich nicht")
else:
print("Die Linien schneiden sich")
def linie(p1, p2):
A = (p1[1] - p2[1])
B = (p2[0] - p1[0])
C = (p1[0]*p2[1] - p2[0]*p1[1])
#print(A, B, -C)
return A, B, -C
def schnittpunkt(L1, L2):
D = L1[0] * L2[1] - L1[1] * L2[0]
Dx = L1[2] * L2[1] - L1[1] * L2[2]
Dy = L1[0] * L2[2] - L1[2] * L2[0]
if D != 0:
x = Dx / D
y = Dy / D
return x,y
else:
return False
L1 = linie([0,1], [2,3])
L2 = linie([2,3], [0,4])
R = schnittpunkt(L1, L2)
if R:
print("Schnittpunkt gefunden:", R)
else:
print("Kein Schnittpunkt gefunden!")
