From b15029a07eef79aec69d6bf1714fd54560b957bd Mon Sep 17 00:00:00 2001 From: Sergey Vartanov Date: Tue, 1 Jun 2021 04:15:29 +0300 Subject: [PATCH] Issue #45: fix line intersection. Use infinite lines to find intersection point. --- roentgen/road.py | 34 ++++++++++++++-------------------- roentgen/vector.py | 12 +++++++----- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/roentgen/road.py b/roentgen/road.py index 1573a58..c578190 100644 --- a/roentgen/road.py +++ b/roentgen/road.py @@ -6,11 +6,10 @@ from typing import List import numpy as np import svgwrite -from shapely.geometry import LineString, Point from roentgen.constructor import Road from roentgen.flinger import Flinger -from roentgen.vector import angle, turn_by_angle, norm +from roentgen.vector import angle, turn_by_angle, norm, Line from roentgen.osm_reader import OSMNode @@ -163,7 +162,7 @@ class RoadPart: ] drawing.add(drawing.path(path_commands, fill="#CCCCCC")) - self.draw_entrance(drawing, False) + # self.draw_entrance(drawing, False) def draw_entrance(self, drawing: svgwrite.Drawing, is_debug: bool): path_commands = [ @@ -210,26 +209,21 @@ class Intersection: next_index: int = 0 if index == len(self.parts) - 1 else index + 1 part_1 = self.parts[index] part_2 = self.parts[next_index] - line_1 = LineString( - [ - part_1.point_1 + part_1.right_vector, - part_1.point_2 + part_1.right_vector, - ] + line_1 = Line( + part_1.point_1 + part_1.right_vector, + part_1.point_2 + part_1.right_vector, ) - line_2 = LineString( - [ - part_2.point_1 + part_2.left_vector, - part_2.point_2 + part_2.left_vector, - ] + line_2 = Line( + part_2.point_1 + part_2.left_vector, + part_2.point_2 + part_2.left_vector, ) - a = line_1.intersection(line_2) - if isinstance(a, Point): - part_1.right_connection = np.array((a.x, a.y)) - part_2.left_connection = np.array((a.x, a.y)) - part_1.update() - part_2.update() + a = line_1.get_intersection_point(line_2) + part_1.right_connection = a + part_2.left_connection = a + part_1.update() + part_2.update() - def draw(self, drawing: svgwrite.Drawing, is_debug: bool): + def draw(self, drawing: svgwrite.Drawing, is_debug: bool = False): """ Draw all road parts and intersection. """ diff --git a/roentgen/vector.py b/roentgen/vector.py index fd48815..bfa00ce 100644 --- a/roentgen/vector.py +++ b/roentgen/vector.py @@ -21,10 +21,12 @@ def turn_by_angle(vector: np.array, angle: float): """ Turn vector by an angle. """ - return np.array(( - vector[0] * np.cos(angle) - vector[1] * np.sin(angle), - vector[0] * np.sin(angle) + vector[1] * np.cos(angle), - )) + return np.array( + ( + vector[0] * np.cos(angle) - vector[1] * np.sin(angle), + vector[0] * np.sin(angle) + vector[1] * np.cos(angle), + ) + ) def norm(vector: np.array) -> np.array: @@ -44,7 +46,7 @@ class Line: # util.error("cannot create line by one point") self.a: float = start[1] - end[1] self.b: float = end[0] - start[0] - self.c: float = start.x * end.y - end.x * start.y + self.c: float = start[0] * end[1] - end[0] * start[1] def parallel_shift(self, shift: np.array): """