From 0eb47ac345289e525d9c87628c5566db94f5118e Mon Sep 17 00:00:00 2001 From: Xeon0X Date: Fri, 21 Jun 2024 00:55:33 +0200 Subject: [PATCH] Fix errors approximations in arc circle introducing gaps between ars in roads --- main.py | 101 ++++++++++++++++----------------- networks/geometry/Polyline.py | 18 +++++- networks/geometry/Segment2D.py | 7 +-- 3 files changed, 67 insertions(+), 59 deletions(-) diff --git a/main.py b/main.py index 01f4f4b..1b8f2ad 100644 --- a/main.py +++ b/main.py @@ -35,48 +35,48 @@ def main(): # editor.placeBlock( # (c[1][i][j].x, 110, c[1][i][j].y), Block("red_concrete")) - def place_segment(segment): - segment.segment_thick(30, LINE_THICKNESS_MODE.MIDDLE) - for i in range(len(segment.points_thick_by_line)): - kk = i % 7 - match kk: - case 0: - blob = 'pink_concrete' - case 1: - blob = 'red_concrete' - case 2: - blob = 'orange_concrete' - case 3: - blob = 'yellow_concrete' - case 4: - blob = 'green_concrete' - case 5: - blob = 'blue_concrete' - case 6: - blob = 'purple_concrete' - for j in range(len(segment.points_thick_by_line[i])): - editor.placeBlock(Point3D.insert_3d( - [segment.points_thick_by_line[i][j]], 'y', [134])[0].coordinates, Block(blob)) - for i in range(len(segment.gaps)): - kk = i % 7 - match kk: - case 0: - blob = 'pink_concrete' - case 1: - blob = 'red_concrete' - case 2: - blob = 'orange_concrete' - case 3: - blob = 'yellow_concrete' - case 4: - blob = 'green_concrete' - case 5: - blob = 'blue_concrete' - case 6: - blob = 'purple_concrete' - for j in range(len(segment.gaps[i])): - editor.placeBlock(Point3D.insert_3d( - [segment.gaps[i][j]], 'y', [135])[0].coordinates, Block(blob)) + # def place_segment(segment): + # segment.segment_thick(30, LINE_THICKNESS_MODE.MIDDLE) + # for i in range(len(segment.points_thick_by_line)): + # kk = i % 7 + # match kk: + # case 0: + # blob = 'pink_concrete' + # case 1: + # blob = 'red_concrete' + # case 2: + # blob = 'orange_concrete' + # case 3: + # blob = 'yellow_concrete' + # case 4: + # blob = 'green_concrete' + # case 5: + # blob = 'blue_concrete' + # case 6: + # blob = 'purple_concrete' + # for j in range(len(segment.points_thick_by_line[i])): + # editor.placeBlock(Point3D.insert_3d( + # [segment.points_thick_by_line[i][j]], 'y', [134])[0].coordinates, Block(blob)) + # for i in range(len(segment.gaps)): + # kk = i % 7 + # match kk: + # case 0: + # blob = 'pink_concrete' + # case 1: + # blob = 'red_concrete' + # case 2: + # blob = 'orange_concrete' + # case 3: + # blob = 'yellow_concrete' + # case 4: + # blob = 'green_concrete' + # case 5: + # blob = 'blue_concrete' + # case 6: + # blob = 'purple_concrete' + # for j in range(len(segment.gaps[i])): + # editor.placeBlock(Point3D.insert_3d( + # [segment.gaps[i][j]], 'y', [135])[0].coordinates, Block(blob)) # place_segment(Segment2D(Point2D(147, -616), Point2D(132, -554))) # # place_segment(Segment2D(Point2D(147, -616), Point2D(117, -563))) @@ -87,32 +87,29 @@ def main(): # # place_segment(Segment2D(Point2D(147, -616), Point2D(195, -665))) # # place_segment(Segment2D(Point2D(147, -616), Point2D(204, -622))) # # place_segment(Segment2D(Point2D(147, -616), Point2D(178, -575))) - - x = 200 - # place_segment(Segment2D(Point2D(0+x, 0), Point2D(50+x, 0))) # place_segment(Segment2D(Point2D(0+x, 0), Point2D(50+x, 25))) # place_segment(Segment2D(Point2D(0+x, 0), Point2D(50+x, 50))) - place_segment(Segment2D(Point2D(0+x, 0), Point2D(25+x, 50))) + # place_segment(Segment2D(Point2D(0+x, 0), Point2D(25+x, 50))) # place_segment(Segment2D(Point2D(0+x, 0), Point2D(0+x, 50))) - place_segment(Segment2D(Point2D(0+x, 0), Point2D(-25+x, 50))) + # place_segment(Segment2D(Point2D(0+x, 0), Point2D(-25+x, 50))) # place_segment(Segment2D(Point2D(0+x, 0), Point2D(-50+x, 50))) # place_segment(Segment2D(Point2D(0+x, 0), Point2D(-50+x, 25))) # place_segment(Segment2D(Point2D(0+x, 0), Point2D(-50+x, 0))) # place_segment(Segment2D(Point2D(0+x, 0), Point2D(-50+x, -25))) # place_segment(Segment2D(Point2D(0+x, 0), Point2D(-50+x, -50))) - place_segment(Segment2D(Point2D(0+x, 0), Point2D(-25+x, -50))) + # place_segment(Segment2D(Point2D(0+x, 0), Point2D(-25+x, -50))) # place_segment(Segment2D(Point2D(0+x, 0), Point2D(0+x, -50))) - place_segment(Segment2D(Point2D(0+x, 0), Point2D(25+x, -50))) + # place_segment(Segment2D(Point2D(0+x, 0), Point2D(25+x, -50))) # place_segment(Segment2D(Point2D(0+x, 0), Point2D(50+x, -50))) # place_segment(Segment2D(Point2D(147, -616), Point2D(201, -595))) # place_segment(Segment2D(Point2D(147, -616), Point2D(233, -605))) - y = 105 + y = 120 - # Road([Point3D(121, 108+y, -68), Point3D(163, 108+y, -95), Point3D(173, 108+y, -169), Point3D(188, 108+y, -174), Point3D(229, - # 108+y, -217), Point3D(190, 95+y, -270), Point3D(198, 95+y, -297), Point3D(237, 95+y, -287), Point3D(283, 95+y, -328)], 15) + Road([Point3D(121, 108+y, -68), Point3D(163, 108+y, -95), Point3D(173, 108+y, -169), Point3D(188, 108+y, -174), Point3D(229, + 108+y, -217), Point3D(190, 95+y, -270), Point3D(198, 95+y, -297), Point3D(237, 95+y, -287), Point3D(283, 95+y, -328)], 15) # Road([Point3D(464, 85+10, -225), Point3D(408, 105+10, -224), # Point3D(368, 104+10, -249), Point3D(368, 85+10, -296), Point3D(457, 79+10, -292)], 15) diff --git a/networks/geometry/Polyline.py b/networks/geometry/Polyline.py index dd02713..2d99ff7 100644 --- a/networks/geometry/Polyline.py +++ b/networks/geometry/Polyline.py @@ -102,12 +102,25 @@ class Polyline: list[tuple(Point2D)]: List of tuples composed - in order - of the first arc points, the corner points, the last arc points. The corresponding arc circle is inside this triangle. """ for i in range(1, self.length_polyline-1): + point_1 = Point2D.from_arrays(self.points_array[i] - self.alpha_radii[i] * self.unit_vectors[i-1]) point_2 = Point2D.from_arrays(self.points_array[i] + self.alpha_radii[i] * self.unit_vectors[i]) - self.acrs_intersections[i] = point_1.round(), Point2D.from_arrays( - self.points_array[i]), point_2.round() + + # If Arc intersection are near, meaning no segment between, we need to remove error due to discrete appoximation. + # Instead of two independant arc intersection, we make sure to combine both. + if i > 1: + if point_1.distance(self.acrs_intersections[i-1][2]) <= 2: + print(point_1, self.acrs_intersections[i-1][2]) + middle = Segment2D( + point_1, self.acrs_intersections[i-1][2]).middle_point() + print(middle) + point_1 = middle + self.acrs_intersections[i-1][2] = middle + + self.acrs_intersections[i] = [point_1.round(), Point2D.from_arrays( + self.points_array[i]), point_2.round()] return self.acrs_intersections def get_arcs(self) -> List[Point2D]: @@ -142,7 +155,6 @@ class Polyline: for i in range(2, self.length_polyline - 1): self.segments[i] = Segment2D(Point2D( self.acrs_intersections[i-1][2].x, self.acrs_intersections[i-1][2].y), Point2D(self.acrs_intersections[i][0].x, self.acrs_intersections[i][0].y)) - print(self.segments[i], i) # Why -3? # For n points, there are n-1 segments. diff --git a/networks/geometry/Segment2D.py b/networks/geometry/Segment2D.py index ac87306..534d379 100644 --- a/networks/geometry/Segment2D.py +++ b/networks/geometry/Segment2D.py @@ -247,7 +247,6 @@ class Segment2D: index = -1 else: index = 0 - print(i) del self.points_thick_by_line[index] del self.gaps[index] @@ -276,9 +275,9 @@ class Segment2D: return Point2D(x3, y3).round(), Point2D(x4, y4).round() def middle_point(self): - return (np.round((self.start.x + self.end.x) / 2.0).astype(int), - np.round((self.start.y + self.end.y) / 2.0).astype(int), - ) + return Point2D(np.round((self.start.x + self.end.x) / 2.0).astype(int), + np.round((self.start.y + self.end.y) / 2.0).astype(int), + ) def _add_points(self, points, is_computing_thickness, overlap): if is_computing_thickness >= 0: