Erweiterung des Skripts mit Linienverlängerung. Code allerdings unscoen, if-edundanzen, etc. Kein zufriedenstellendes Ergebnis.
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
from shapely.geometry import LineString, Point
|
||||
from shapely.ops import nearest_points
|
||||
|
||||
racks = [
|
||||
((0, 0), (5, 0)), # Horizontal
|
||||
((0, 0), (0, 5)), # Vertikal (schneidet exakt)
|
||||
((0.25, 2), (5, 2)), # Parallel mit 0.25 Abstand zur Vertikalen
|
||||
((0.25, 4), (4, 3)), # Diagonal
|
||||
((5.10, -0.25), (5.1, 3)) # Parallel sehr nah an erstem Rack
|
||||
]
|
||||
|
||||
tol = 0.5
|
||||
tol_step = 0.05
|
||||
|
||||
rack_lines = [LineString([start, end]) for start, end in racks]
|
||||
rack_endpoints = [(i, pt) for i, rack in enumerate(racks) for pt in rack]
|
||||
|
||||
verbindungen = []
|
||||
|
||||
# Überprüfe jedes Rack
|
||||
for i, rack_line in enumerate(rack_lines):
|
||||
print(f"\n=== Prüfe Rack {i}: {rack_line}")
|
||||
|
||||
for j, pt_coords in rack_endpoints:
|
||||
if i == j:
|
||||
continue # Eigenpunkte ignorieren
|
||||
|
||||
pt = Point(pt_coords)
|
||||
|
||||
# Prüfe auf exakten Schnittpunkt
|
||||
if rack_line.intersects(pt):
|
||||
intersection = rack_line.intersection(pt)
|
||||
print(f" ✅ Echter Schnittpunkt mit Endpunkt von Rack {j}: {intersection}")
|
||||
verbindungen.append((i,j, intersection))
|
||||
continue #diesen Punkt überspringen
|
||||
|
||||
#alle Endpunkte prüfen, die NICHT exakt auf der Linie liegen
|
||||
for j, pt_coords in rack_endpoints:
|
||||
if i == j:
|
||||
continue # Eigenpunkte ignorieren
|
||||
|
||||
pt = Point(pt_coords)
|
||||
|
||||
# Prüfe nur, wenn der Punkt **nicht** genau auf der Linie liegt
|
||||
if rack_line.intersects(pt):
|
||||
continue # Exakte Schnittpunkte nicht erneut behandeln
|
||||
|
||||
dist = rack_line.distance(pt)
|
||||
|
||||
#überprüfen, ob der Punkt im Toleranzbereich ist
|
||||
if dist < tol:
|
||||
print(f" 🔍 Punkt {pt} liegt {dist:.3f} von Linie {i} entfernt")
|
||||
|
||||
radius = tol_step
|
||||
while radius <= tol:
|
||||
circle = pt.buffer(radius) # Kreis wächst mit dem Toleranzradius
|
||||
if circle.intersects(rack_line): # Wenn der Kreis die Linie schneidet
|
||||
contact = circle.intersection(rack_line)
|
||||
if contact.geom_type == "Point":
|
||||
nearest = contact
|
||||
else:
|
||||
nearest = nearest_points(pt, contact)[1] # Erster Kontaktpunkt von rack_line
|
||||
|
||||
print(f" 🟡 Berührpunkt bei Radius {radius:.2f}: {nearest}")
|
||||
verbindungen.append((i,j,nearest))
|
||||
break
|
||||
radius += tol_step
|
||||
|
||||
Reference in New Issue
Block a user