ich bastel gerade an nem kleinen Projekt, und habe ein Problem, an dem ich nicht vorbei komme:
Das Ziel ist es, einen Graph von Straßen und deren Verbindungen zu erstellen. Dazu wird in 2 Teile aufgeteilt: Verbindungen und Kreuzungen. Später soll das auch mehrspurig möglich sein.
Dabei sind die Koordinaten der Straßen auch negativ, da ich mit 4 Quadranten habe. Im folgenden Bild sind alle vom System erkannten Kreuzungen rot gefärbt. Ob eine Kreuzung als solche erkannt wird scheint teilweise völlig willkürlich. Ich gehe davon aus, dass das irgend etwas mit orientation() zutun hat...
https://imgur.com/a/StH9JD2
Code: Alles auswählen
import math
class Road:
def __init__(self, start, end, ):
self.start = start
self.end = end
self.length = math.dist(self.start, self.end)
def orientation(p, q, r):
val = (q[1] - p[1]) * (r[0] - q[0]) - (q[0] - p[0]) * (r[1] - q[1])
if val == 0:
return 0 # Collinear points
return 1 if val > 0 else 2 # Clockwise or counterclockwise
def on_segment(p, q, r):
return max(p[0], r[0]) >= q[0] >= min(p[0], r[0]) and max(p[1], r[1]) >= q[1] >= min(p[1], r[1])
class Simulation:
def __init__(self):
self.roads = []
self.Network = []
def create_road(self, start, end):
self.roads.append(Road(start, end))
def build_network(self):
"""
:return: Network = [Roadstart, Roadend, Roadlenght, Connections-to-Road:[Roadobj, pos], Connections-from-Road:[Roadobj, pos], Intersections:[Roadobj, pos],]
"""
self.Network = []
for road1 in self.roads:
R = {"start": road1.start, "end": road1.end, "length": road1.length}
intersections = []
to_road = []
from_road = []
for road2 in self.roads:
if road1 == road2:
continue
o1 = orientation(road1.start, road1.end, road2.start)
o2 = orientation(road1.start, road1.end, road2.end)
o3 = orientation(road2.start, road2.end, road1.start)
o4 = orientation(road2.start, road2.end, road1.end)
connection = ((abs(road1.start[0]) == abs(road2.end[0]) and abs(road1.start[1]) == abs(road2.end[1])) or (abs(road1.end[0]) == abs(road2.start[0]) and abs(road1.end[1]) == abs(road2.start[1])))
if (o1 != o2) and (o3 != o4) and not connection:
intersections.append(road1)
if (o1 == 0 and on_segment(road1.start, road2.start, road1.end)) or (o4 == 0 and on_segment(road2.start, road1.end, road2.end)):
to_road.append(road1) # road2.start lies on line1 or road1.end lies on road1
if (o2 == 0 and on_segment(road1.start, road2.end, road1.end)) or (o3 == 0 and on_segment(road2.start, road1.start, road2.end)):
from_road.append(road1) # road2.end lies on line1 or road1.start lies on road2
R["intersections"] = intersections
R["connections_to_road"] = to_road
R["connections_from_road"] = from_road
self.Network.append(R)
for a in self.Network:
print(a)