From 10083e6d86fed0301f0bfcd1d7f8d4d4d0504a9f Mon Sep 17 00:00:00 2001 From: Xeon0X Date: Sat, 15 Jun 2024 21:18:32 +0200 Subject: [PATCH] Fix lenght bug --- main.py | 23 +++++++++++++++----- networks/geometry/Polyline.py | 38 ++++++++++++++++++++-------------- networks/roads_2/Roads.py | 32 ++++++---------------------- output_image.png | Bin 1912 -> 2041 bytes 4 files changed, 47 insertions(+), 46 deletions(-) diff --git a/main.py b/main.py index b1bfa74..2d4197f 100644 --- a/main.py +++ b/main.py @@ -308,10 +308,13 @@ random_points = [Point2D(random.randint(min_val, max_val), random.randint( random_points = random_points[0].optimized_path(random_points) +print(random_points) + +# random_points = [Point2D(94, 71), Point2D(-12, 54), Point2D(-28, 10), Point2D( +# 0, -33), Point2D(80, -50), Point2D(73, -89), Point2D(-86, -3), Point2D(-82, 92)] + p = Polyline(random_points) -# Point2D(-1156, 378), Point2D(-1220, 359), Point2D(-1265, 290) -# print(p.alpha_radii) radius = p.get_radii() center = p.get_centers() @@ -388,9 +391,9 @@ for j in range(len(s1.points_thick)-1): draw.point((s1.points_thick[j].x+w, w-s1.points_thick[j].y), fill='grey') -for i in range(0, len(p.arcs)): - for j in range(len(p.arcs[i])): - draw.point((p.arcs[i][j].x+w, w-p.arcs[i][j].y), fill='white') +# for i in range(0, len(p.arcs)): +# for j in range(len(p.arcs[i])): +# draw.point((p.arcs[i][j].x+w, w-p.arcs[i][j].y), fill='green') for i in range(1, len(p.segments)-1): @@ -398,6 +401,12 @@ for i in range(1, len(p.segments)-1): draw.point((p.segments[i].points_thick[j].x+w, w-p.segments[i].points_thick[j].y), fill='white') + +def get_color(i): + color = (50+round(i), 50+round(i/5), 50+round(i/3)) + return color + + for i in range(1, len(p.centers)-1): draw.point((p.centers[i].x+w, w-p.centers[i].y), fill='red') draw.point((p.acrs_intersections[i][0].x+w, @@ -407,6 +416,10 @@ for i in range(1, len(p.centers)-1): draw.point((p.acrs_intersections[i][2].x+w, w-p.acrs_intersections[i][2].y), fill='blue') +for i in range(len(p.total_line_output)): + draw.point((p.total_line_output[i].x+w, + w-p.total_line_output[i].y), fill=get_color(i)) + image.save('output_image.png') diff --git a/networks/geometry/Polyline.py b/networks/geometry/Polyline.py index d5892a9..8a47d64 100644 --- a/networks/geometry/Polyline.py +++ b/networks/geometry/Polyline.py @@ -7,8 +7,6 @@ from networks.geometry.Circle import Circle from networks.geometry.Point2D import Point2D from networks.geometry.Segment2D import Segment2D -# from Enums import LINE_THICKNESS_MODE, LINE_OVERLAP - class Polyline: def __init__(self, points: List[Point2D]): @@ -46,8 +44,8 @@ class Polyline: self.centers = [None] * self.length_polyline # c, list of points # list of tuple of points (first intersection, corresponding corner, last intersection) self.acrs_intersections = [None] * self.length_polyline - self.arcs = [[]] * self.length_polyline # list of points - self.bisectors = [None] * self.length_polyline + self.arcs = [[] for _ in range(self.length_polyline)] # list of points + # self.bisectors = [None] * self.length_polyline # For n points, there is n-1 segments. Last element should stays None. self.segments = [None] * \ @@ -64,6 +62,13 @@ class Polyline: self.get_arcs() self.get_segments() + self.total_line_output = [] + # for i in range(1, self.length_polyline-1): + # self.total_line_output.extend(self.segments[i].segment()) + # self.total_line_output.extend(self.arcs[i]) + self.total_line_output.extend(self.segments[1].segment()) + self.total_line_output.extend(self.arcs[2]) + def __repr__(self): return str(self.alpha_radii) @@ -101,16 +106,19 @@ class Polyline: def get_arcs(self) -> List[Point2D]: for i in range(1, self.length_polyline-1): - circle = Circle(self.centers[i]) - circle.circle(self.radii[i]) - for j in range(len(circle.points)): - if circle.points[j].is_in_triangle(self.acrs_intersections[i][0], self.acrs_intersections[i][1], self.acrs_intersections[i][2]): - self.arcs[i].append(circle.points[j]) - self.bisectors[i] = Point2D.to_arrays( - self.centers[i]) + (self.unit_vectors[i-1] - self.points_array[i]) + points = Circle(self.centers[i]).circle(self.radii[i]) - (self.unit_vectors[i]+self.unit_vectors[i-1]) / \ - np.linalg.norm(self.unit_vectors[i]-self.unit_vectors[i-1]) + # 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( + 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( + self.acrs_intersections[i][2]) - Point2D.to_arrays(self.centers[i]))) + input("---") + for j in range(len(points)): + print(points[j], i, j, len(points)) + print(len(self.arcs[i]), len(self.arcs[i-1])) + if points[j].is_in_triangle(double_point_a, self.centers[i], double_point_b): + self.arcs[i].append(points[j]) return self.arcs def get_segments(self) -> List[Segment2D]: @@ -134,8 +142,8 @@ class Polyline: # Get last segment. Index is -2 because last index -1 should be None due to the same list lenght. # For n points, there are n-1 segments. - self.segments[-2] = Segment2D(self.acrs_intersections[-2][2], Point2D.from_arrays( - self.points_array[-1])) + # self.segments[-2] = Segment2D(self.acrs_intersections[-2][2], Point2D.from_arrays( + # self.points_array[-1])) return self.segments diff --git a/networks/roads_2/Roads.py b/networks/roads_2/Roads.py index 1d7b16a..7d5eacd 100644 --- a/networks/roads_2/Roads.py +++ b/networks/roads_2/Roads.py @@ -20,21 +20,15 @@ class Road: self.width = width self.polyline = Polyline(Point3D.to_2d(coordinates, 'y')) - self.surface() + self._surface() - # for i in range(1, len(self.polyline.segments)-1): - # print(self._y_interpolation(self.polyline.segments[i].segment_thick( - # self.width, LINE_THICKNESS_MODE.MIDDLE))) - # self._y_interpolation(self.polyline.segments[i].segment()) - - def surface(self): + def _surface(self): # Segments for i in range(1, len(self.polyline.segments)-1): - print() if len(self.polyline.segments[i].segment()) > 1: for j in range(len(self.polyline.segments[i].segment_thick(self.width, LINE_THICKNESS_MODE.MIDDLE))): self.output_block.append( - (Point3D.insert_3d([self.polyline.segments[i].points_thick[j]], 'y', [170])[0].coordinates, Block("stone"))) + (Point3D.insert_3d([self.polyline.segments[i].points_thick[j]], 'y', [180])[0].coordinates, Block("stone"))) for i in range(1, len(self.polyline.centers)-1): # Circle @@ -53,24 +47,10 @@ class Road: if circle.points_thick[j].is_in_triangle(double_point_a, self.polyline.centers[i], double_point_b): self.output_block.append( (Point3D.insert_3d([circle.points_thick[j]], 'y', [ - 170+i])[0].coordinates, Block("white_concrete"))) + 180+i])[0].coordinates, Block("black_concrete"))) - # v = Point2D.to_arrays( - # self.polyline.centers[i]) - self.polyline.bisectors[i] - - # print(self.polyline.centers[i], Point2D.from_arrays(v).round()) - # # s = Segment2D( - # # self.polyline.centers[i], Point2D.from_arrays(v).round()) - # # s.segment() - # arc = Point2D.to_arrays(self.polyline.acrs_intersections[i][0]) - # s = Segment2D( - # self.polyline.centers[i], Point2D.from_arrays(arc)) - # s.segment() - - # for j in range(len(s.points)): - # self.output_block.append( - # (Point3D.insert_3d([s.points[j]], 'y', [ - # 162])[0].coordinates, Block("purple_concrete"))) + def _projection(self): + pass def place(self): editor = Editor(buffering=True) diff --git a/output_image.png b/output_image.png index ed7d9f205ffda42f732f0c472ede6285fbc11734..9ce53c84b34f0ab369c66d758e2f23708698ef5d 100644 GIT binary patch delta 2027 zcmVY+rB#)SZ4s8e+JAd;t}ViHhLqBwya>xu zJ2m7=TZCn!?0TGNYq#kGK&R|(qA1GqWyaM^9{}!?v#Oz?q51jwzF%(;OQAE;s)mP# zwzjrf9}*V&%Tq~xX!!2dR_n6OZ4s6&axQ|kw#`c%$9cZj2*R>L&Zm#?ft8xorStqUPx%%j>wyGQ& zSAwvN$kV}r`smHg_4GrxsuF~yUztbP2fa3f2urJ+Rev=`#%^riSChc@M^wAS?~CYnUCK_}aUw z1Yw!t^nXiY@*pg=vKPU*vAvhq?zAr3|Dw==@SD&I?KEau4Q*bzc4@n+V%K9cCYCCF zYpBm2N-z7g2(}QG5;<#V_2gewg0PJ9vMNDXDmWcPRS2tMRaNDBorF~-s!9=7WvHqh zVcErxssv$G#hW0iLRb}G5$r}-Wl>d6gk=TKs(%uMRZ=BE_*a!6tTMa|qAG+{5L>Hk zgjEDp^~GPN*pcdc-Q%hRVVSyj{jN%c@X}=O??O9yGO^sM$E~9+#-*_QxIg^(U-V^N zSbm>(zyEjb%s*yLSXfS< zoqzAHE;bYK?2%~|S1zT@I5|$Aw_<#L9P7u0Z<8Nge!I3V&O?oe1&7^gbiE-f?Eq4{bhUN;x0a z?~8X5Arg^1ZYZf#cUu;oE^P+>snDL2^?%3GN+Oa+r}mmU0DDe_g`C`D{kgP~2=U0& zgofLqo?-?MOPYL?`LE^GBoPl+ofP#{u25Kp{Jp&TP-DE<_mYlgZY+iWEUzU(JlL-) z>am9dKNbGFy!Jq2%P`Sd=e_y7z_}b*`#T!>N-#W_c6PD7XvakG&$=O7R_kXC$ zO<7@;ud47hoSZ!R&W+0@Zyg3zym_x=!kwBtdV#7Om-P#)Mz+asHmJ%6cKs&w>Bijo zWvcQ)#bK2ha&I-}-d?^`-Lb%=K4EEF4bL>@&QX;|tXK-8#<8Wl<5cA(C3~!#EuNb?erD-Q6$b$0Om5!US$Qm1 zSSnV-^V9RE8CU)?vw6QTJ%4KP3nMoTJyb1)*+Y&+(0h5qs&F-YclyLh#+C03Y~C4H zAy61r&mnhl=EUoZpR2o3SVH&2sxh#_FhE%4w^{GcJpbzT&q`hioS=4Mb$_(TunLFP zrI2+n9D{{bW;Oia;0v!@|FrP8!!61uR@x%NDkz$k!VeF=`0@hdDj)-gRctk6T!lu{ z#3HQF=m<+nS>t8xfhl-@540dYw({*u*FGtBLvWOiiN&xAke;w=yjxmmm{?GvU|0i9 zAU5s+Qa-VsT>bvn@jZg~4u1`d^01gzVJaS0&Iv?VVbU!aICKP}ws{yeLp$8>}h$1$s6XsQe=Ynvr%QbrZt z7A&Xf-DaMe*)L@rMV)Q28v07>dyvL)kG9|?-G9YCj^k=?5q7fTkB!4W=EIUwveWX9 z6@SIP@OQyl<|h`sq<=jux%0m;v^-)_Sc0}Zq9iQ(fOUH;qV$7xVF}vuf|!2-fNGZ)frIW4CMqX+<3=GPmuzC)sK5wlh)f@^+vnVXl ztF0vA(FZ5l6_)5Zw`w)oa!!x1?D^TXRugd?izHzS?;PtUme?LzaU4sTUSMK5W{0q( z)`RGFZ$wEUWn|RzooZk+OT)THiga$#mP2e@3U|Uz%ONg>1&0t8lpri9QTAmsaDx8F zCJF04_B=QY000000000000000000000000000000000oE{{YMJlWEApqs#yR002ov JPDHLkV1nu->Z7C3ux>Fdnu1{!+4p_* zE`VWJMPiI>s|v#^6=Mv6ZIxnJ6++6>$rTAp93d6d=pDXucSiM-`Ervx?Ff5vaVbK%}i>6>$GzG(=DHs+_!LW+#`_5O( zRAE>&1;e5#7#2;zuxJW~MN{xYLB9RIT4CS!ZQ~79hZCzv2!St;sq**g9YAun#mKT4 z*8db1!@{z-6n_>At9Jkj!}?EV{M`LdPOK*kDkrPJu^3i6wwS=M zQus2gW(-TDY4&hjr7`}q$17N! zT!+QkGmq=A68Ln~MpxeF_C z3%dO!^(9pu%G+`mRze6Ke~eRJ)uFI0hUHpqRfm$ce1*l!S66LSiAanwd$afoi%vaN zm281wd4JSjRdzd$!s0r37*$nzYmUMq8C_Lkn_j{)IeTi&sOo96Uczc%ti?C05{Bi( z%Tzk9Xg9ktp(KO&ng8aAJMIZLzAV zqonJ9`#1ZAVOh{n)nQUqVmK_^*;A{zs!^N0Wj3q^h%M@@N*ES2wN;7LusmG8(p;5T z4a+>`RSCmFG-PV)oQRtV)c9)j)ZR5LXs%c@N8y!g2M^eaTK(wl800sj5mWg=JD<2imF< zhNa)A8eSgHM#8ea4rbrZl^s{_AFPqE%zG+BXH{Y&ETGv_C4_K2wBN&2Tb0-ds{v4p z*Staq66(Ho{0^0|5Y~=UNx82k&b-dDvVY@h?VShy4Xfel7nNA_r>zh^pO5CM#Ky#` zwfsiUO7Efms>EklwrQwJ(8Dr$`Ksrtm7b%+4$B*qs)S)_(;SDYssuVLlj~qYVq7Ua zF5s~2N%T?mzEcet7CeRHN^rxnw+>nwSArWB9n{`iAj497Yc?}Bt^_o!2B0khU4OXx z;w3E2H22XAFD#R%;TG<=62!0?Xg&v;_pOJEun<9yD}f8k-sP)Xpw9%az``=7EqaK% z3d2&zz_=2uu#ByPhR2m)h2?>baV0=uq1;mo*&bH{6jlSE({L~|uEcg&YQYuX03$39 zXF~Zqn`>c&)j;iOP`hJenGFlVzJKrMA1sY4fe6de<*Tn9i!mN;nR(290tm~t7-I-~ z`roL%pCmA>_dN9xLOj<*Gqi_gX&tR1|>3QLckk9)L1X;`)|U#b0d5(6m>3)*iM_AabvF|5IEhfU(bdf^t}XbcN?9ZX+g z&;GF45{+Sj%EoQ-hs{sag{5TnOp;v_%^beEuo`GM8Rh!`{ZSv~EQGaO{#vL%y23)d z%Z|Dhig@e^y25Ip`FyyoN`DN5wO0DIR&J{jRbjzhz8X@MRf@vGGO8+*<4PD-8&;LI zt=@q@AlAX`cVty3zDp;sumDzdr6Me~w{m$>V)~sC4OE2HU}}q18*g|5sP>LD5NcR6 zG@Nf%^<;fm8gA&eq~yB%1xdd-qWK$vS|3(}QKzSQJ2!)>aZ6@FhJV$sCn;%tobG2_ z$@1%1FJHdu`P$B>ey*w#Cljmlq?RWYLb&~2-l`JwVU?fJ+j@@2QdO5dkMHQPq%SL% z!g=dp?S-i8UpudJp5OZS53ZP+SUo)*woOK55dJl0b7+=LthQVH>8om&yfi-P>xVS4 ze$QP0h#G=P{Xz=sYJcpAI#tao_LQ(DtmacPZ$$AGFJrBFj5YP#a71Z!=3>R35UH40F~N30d zs2rNE3#7Ggv0_hZLH-b$J?RJbdMqY|V)dIT0zXT`Chc#rXHuXRf4D8fvTFUOCa2S3 jSfJL2B_rO3O4|GbTbsDqYG(;c00000NkvXXu0mjfvUjPT