Python :: Aufgabe #350

4 Lösungen Lösungen öffentlich

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ß!

Lösungen:

vote_ok
von eisheiliger (3750 Punkte) - 21.04.2021 um 15:24 Uhr
Quellcode ausblenden Python-Code

"""
#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])


vote_ok
von nitnat (670 Punkte) - 03.05.2021 um 20:59 Uhr
Quellcode ausblenden Python-Code
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))
vote_ok
von satn1241 (3090 Punkte) - 04.05.2021 um 17:29 Uhr
Quellcode ausblenden Python-Code
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")
1 Kommentar
vote_ok
von AlexGroeg (2010 Punkte) - 05.05.2021 um 09:57 Uhr
Quellcode ausblenden Python-Code

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!")