From 8a10b5f56826e3434fef8098228520fd63af2eae Mon Sep 17 00:00:00 2001 From: Xeon0X Date: Sat, 22 Jun 2024 17:34:53 +0200 Subject: [PATCH] Enlarge arc triangle detection --- main.py | 9 +++-- networks/geometry/Polyline.py | 4 +-- networks/roads_2/Road.py | 61 ++++++++++++++++++++++++++-------- output_image.png | Bin 2610 -> 0 bytes 4 files changed, 56 insertions(+), 18 deletions(-) delete mode 100644 output_image.png diff --git a/main.py b/main.py index 1b8f2ad..b6a3570 100644 --- a/main.py +++ b/main.py @@ -106,10 +106,13 @@ def main(): # place_segment(Segment2D(Point2D(147, -616), Point2D(201, -595))) # place_segment(Segment2D(Point2D(147, -616), Point2D(233, -605))) - y = 120 + # 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(-46, 64, -12), Point3D(-86, 65, 13), Point3D(-47, 66, 82), + # Point3D(-117, 69, 150), Point3D(-149, 68, 148), Point3D(-185, 70, 78)], 9) + + Road([Point3D(-130, 70, 7), Point3D(-170, 67, -9), Point3D(-189, 79, 3), Point3D(-194, + 82, 25), Point3D(-217, 88, 30), Point3D(-248, 89, 20), Point3D(-212, 98, 12)], 9) # 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 366387b..18b0704 100644 --- a/networks/geometry/Polyline.py +++ b/networks/geometry/Polyline.py @@ -134,9 +134,9 @@ class Polyline: points = Circle(self.centers[i]).circle(self.radii[i]) # Better to do here than drawing circle arc inside big triangle! - double_point_a = Point2D.from_arrays(Point2D.to_arrays(self.acrs_intersections[i][0]) + 5 * (Point2D.to_arrays( + double_point_a = Point2D.from_arrays(Point2D.to_arrays(self.acrs_intersections[i][0]) + 50 * (Point2D.to_arrays( self.acrs_intersections[i][0]) - Point2D.to_arrays(self.centers[i]))) - double_point_b = Point2D.from_arrays(Point2D.to_arrays(self.acrs_intersections[i][2]) + 5 * (Point2D.to_arrays( + double_point_b = Point2D.from_arrays(Point2D.to_arrays(self.acrs_intersections[i][2]) + 50 * (Point2D.to_arrays( self.acrs_intersections[i][2]) - Point2D.to_arrays(self.centers[i]))) for j in range(len(points)): diff --git a/networks/roads_2/Road.py b/networks/roads_2/Road.py index 79edcfd..fbc157d 100644 --- a/networks/roads_2/Road.py +++ b/networks/roads_2/Road.py @@ -9,6 +9,8 @@ from networks.geometry.Segment3D import Segment3D from networks.geometry.Circle import Circle from utils.Enums import LINE_THICKNESS_MODE from gdpc import Block, Editor, geometry +from scipy.ndimage import gaussian_filter1d +import numpy as np class Road: @@ -29,7 +31,7 @@ class Road: self.polyline_total_line_output = [ [] for _ in range(len(self.polyline.total_line_output))] - self._projection_polyline() + self._projection_gaussian() if len(self.coordinates) == 2: self.segment_total_line_output = Segment2D( @@ -101,21 +103,22 @@ class Road: (self.polyline.radii[i]-self.width/2))+1, int((self.polyline.radii[i]+self.width/2))+1) # Better to do here than drawing circle arc inside big triangle! - double_point_a = Point2D.from_arrays(Point2D.to_arrays(self.polyline.acrs_intersections[i][0]) + 5 * (Point2D.to_arrays( + double_point_a = Point2D.from_arrays(Point2D.to_arrays(self.polyline.acrs_intersections[i][0]) + 50 * (Point2D.to_arrays( self.polyline.acrs_intersections[i][0]) - Point2D.to_arrays(self.polyline.centers[i]))) - double_point_b = Point2D.from_arrays(Point2D.to_arrays(self.polyline.acrs_intersections[i][2]) + 5 * (Point2D.to_arrays( + double_point_b = Point2D.from_arrays(Point2D.to_arrays(self.polyline.acrs_intersections[i][2]) + 50 * (Point2D.to_arrays( self.polyline.acrs_intersections[i][2]) - Point2D.to_arrays(self.polyline.centers[i]))) - editor = Editor(buffering=True) - editor.placeBlock(Point3D.insert_3d( - [self.polyline.acrs_intersections[i][0]], 'y', [230])[0].coordinates, Block("purple_concrete")) - editor.placeBlock(Point3D.insert_3d( - [self.polyline.acrs_intersections[i][2]], 'y', [230])[0].coordinates, Block("pink_concrete")) + # Debug + # editor = Editor(buffering=True) + # editor.placeBlock(Point3D.insert_3d( + # [self.polyline.acrs_intersections[i][0]], 'y', [230])[0].coordinates, Block("purple_concrete")) + # editor.placeBlock(Point3D.insert_3d( + # [self.polyline.acrs_intersections[i][2]], 'y', [230])[0].coordinates, Block("pink_concrete")) - geometry.placeLine(editor, Point3D.insert_3d([double_point_a], 'y', [229])[ - 0].coordinates, Point3D.insert_3d([self.polyline.centers[i]], 'y', [229])[0].coordinates, Block("blue_concrete")) - geometry.placeLine(editor, Point3D.insert_3d([double_point_b], 'y', [229])[ - 0].coordinates, Point3D.insert_3d([self.polyline.centers[i]], 'y', [229])[0].coordinates, Block("red_concrete")) + # geometry.placeLine(editor, Point3D.insert_3d([double_point_a], 'y', [229])[ + # 0].coordinates, Point3D.insert_3d([self.polyline.centers[i]], 'y', [229])[0].coordinates, Block("blue_concrete")) + # geometry.placeLine(editor, Point3D.insert_3d([double_point_b], 'y', [229])[ + # 0].coordinates, Point3D.insert_3d([self.polyline.centers[i]], 'y', [229])[0].coordinates, Block("red_concrete")) for j in range(len(circle)): for k in range(len(circle[j])): @@ -151,6 +154,38 @@ class Road: (Point3D.insert_3d([gaps[j][k]], 'y', [ self.polyline_total_line_output[nearest[0]].y])[0].coordinates, Block("white_concrete"))) + def _projection_gaussian(self): + nearest_points_to_reference = [] + for i in range(len(self.coordinates)): + # Index is used to space accordingly + index, point = Point3D.to_2d([self.coordinates[i]], 'y')[0].nearest( + self.polyline.total_line_output, return_index=True) + nearest_points_to_reference.append( + Point2D(index, self.coordinates[i].y)) + + linear_y_interpolation = [] + for i in range(len(nearest_points_to_reference)-1): + linear_y_interpolation.extend(Segment2D( + nearest_points_to_reference[i], nearest_points_to_reference[i+1]).segment()) + + linear_y_interpolation = np.array( + Point2D.to_arrays(linear_y_interpolation)) + + # Extract x and y coordinates + x = linear_y_interpolation[:, 0] + y = linear_y_interpolation[:, 1] + + y_smooth = gaussian_filter1d(y, sigma=5) + + self.index_factor = len(y_smooth)/len(self.polyline.total_line_output) + + for i in range(len(self.polyline.total_line_output)): + self.polyline_total_line_output[i] = Point3D( + self.polyline.total_line_output[i].x, y[round(i*self.index_factor)]+100, self.polyline.total_line_output[i].y) + + self._surface() + self.place() + def _projection_polyline(self): nearest_points_to_reference = [] for i in range(len(self.coordinates)): @@ -169,7 +204,7 @@ class Road: for i in range(len(self.polyline.total_line_output)): self.polyline_total_line_output[i] = Point3D( - self.polyline.total_line_output[i].x, self.polyline_height.total_line_output[round(i*self.index_factor)].y, self.polyline.total_line_output[i].y) + self.polyline.total_line_output[i].x, self.polyline_height.total_line_output[round(i*self.index_factor)].y+70, self.polyline.total_line_output[i].y) self._surface() self.place() diff --git a/output_image.png b/output_image.png deleted file mode 100644 index 73166064be9a34f2c8a44a449dc63d597d4d85ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2610 zcma);XEYlO7su&SRf*JUVy1T0NNIGKPm750l*dXM6tT56iYRKNq-tyJwv^hN#H!t< zN=PcPl@hfc)e?&G665uJc|X7RoO^%g{O`H{bHChkZoGxL5eOg#;Nai@nHVFiPT2Qv zo;`I^WwbQ=IXHOsOb~iDA-QWa>w(}gQSOap3oY|98|`LJQ{bEtY*h9LZ_#3V5jG05`a&8!l2^2V4h2x1wTKm8J|08Z7XyzNE zYcU7he}hvLEckYDQY>fV=mof9yWsmEX*EL!$@A_>iu)e}GnW9k>eV4gk({JW=C3QigCtsIg z-BxEKh4KHMWZ8zTD0NK>&#Hp?P zw^fp{sfl>(j$x~-S>R4v@17suO$8HkuMXY)P9)gxK#w?IC00twZp>!XzgKTjp!TM} z-xi!Zn!j1A;)s3dVQE{^cvR-3{aZ zz9!GfiMsS{fqtyyCSDuv2SJI0GHczCnm>GJDVJ$wZX6yubgdF5iIHzO)DWGfupvBfi4E|k`FL8dT5Y3HHn zj&YA{m7#JEC37z&D5OWs1h>WXW$BBIj@Fh>9q7(@(q2B@U5;RNwG=LtcFyeGM)6+f zi&507FLb3dFSC?*t$v$afS)gAO2I{|U2EQ0Q74U2x5nH$_P5p5g;htbfR+%#@3L{a z_>T8-txTAHuO4{oRdHaooqRa2sx+#o0%t=IcIpFI2OBoH&5%v!88r{;j4JP2cAWo} z8TCg)*46LRK_1UOX4_9VzFW?oMyVwZIp{FLLa`W|mL$WO#C;r7*{1XRMs{rSKA;H!~GhR4129tva)1jnJ1Dsuz5Ic6G3MSV|ez{wdFQ z_@F-}+X`AYoB?cY^fn=+&}XJvqS!P>_K?t!ljG}M`yT=5Sc7n&!g^hEO@1repQV&! z4KK{xE$C)*a}7SWE-@6g2S+cZ zY?4}|m|f&9C-xOVg#KWIss!LjuSYQy`#>dIUQD<;bqA#W=rFn+Py;BNhIMwne^=M) zZo6G4UePA}hEQZne%u++y{%KCw0L!Wea(KVzWQKCuIh|d4&-klGU7+>-O%+$1w7sI z-18SB2RTe;yPe%ZzWT4^q9tBCse!RiN^+=_h0}Eg59>oCIu#A(Rx)?Tmn$4%Hgr@& zViL0luqERp!Iat1FnJN*$;~WgS>AlDjDW1x_+;kn>w`r`OVwcI4`5@~63wVnPFgu% zM_mSUYDVd;2y`N-Bts_0C>FnY)LY5!BC0#BQSUIrs9#_5%P7MtPumj{D9Y&!O2%me zYsFg~etSK=($7_Tdb;>=a;`cJ`6C2Hfo0yWJj|qg#LDDUr)4&W1!Ri-7pgXk1 z(^_Z{?kEgz8;eB=@LK_kfyF;}v5ds4U;e@H5pbK%q)UH3kv!1~ZgQK(Aa zx6H z_y{Sy(6iz07V++u5KI4ULK0VE9AejFDB@pE!JCFOu{Xi2}?o_Ic^m6Bq_6Z z={7CP2ddo1o{mK<=8793n4kDsX#K)DgrzOnr4vEU_{EJmr)lugsqQl8keueN@v;M> zHM5X>QqrjNB{%dchHifc@_u7L{P=>C;UlU8F(DdC3uTWWB4yh}n%aUz@7Ehg62Obe zH=P0!x9DTS>W}=JExi2Z=kW;*XD#Pcn~q5KE2Jw|6fw1Wv6L#dLNL#y$1t^>=D<-* zDaJ+_ibT6l0bMOPp}-6^8BFcZ!erZLYbfb7w;P16Z=W~HMIA5v@4*^n9p`vlt_y!1 Qv-huNVrY)2)yGEv7mnKeSpWb4