From a78558a988f33805be507584b8e89673051c49db Mon Sep 17 00:00:00 2001 From: NichiHachi Date: Sat, 15 Jun 2024 13:07:51 +0200 Subject: [PATCH] Added Building zone --- world_maker/City.py | 2 +- world_maker/data/building.png | Bin 0 -> 2510 bytes world_maker/data/district.png | Bin 4950 -> 5264 bytes world_maker/data/roadmap.png | Bin 2077 -> 2163 bytes world_maker/data/roadmap2.png | Bin 3287 -> 3107 bytes world_maker/data_analysis.py | 3 - world_maker/pack_rectangle.py | 115 ++++++++++++++++++++++++++++++++++ world_maker/world_maker.py | 4 +- 8 files changed, 118 insertions(+), 6 deletions(-) create mode 100644 world_maker/data/building.png create mode 100644 world_maker/pack_rectangle.py diff --git a/world_maker/City.py b/world_maker/City.py index 7fe0b4e..8611be7 100644 --- a/world_maker/City.py +++ b/world_maker/City.py @@ -149,5 +149,5 @@ if __name__ == '__main__': city.loop_expend_district() city.district_draw_map() city.district_generate_road() - image = city.draw_roads(Image.new('RGB', (401, 401)),3) + image = city.draw_roads(Image.new('RGB', (401, 401)),4) image.save('./data/roadmap.png') diff --git a/world_maker/data/building.png b/world_maker/data/building.png new file mode 100644 index 0000000000000000000000000000000000000000..48e51dc0e16ae4e756c9ca894a0258d9debf6e0e GIT binary patch literal 2510 zcmZve3p|tiAIC=)(M%m({9WdHa-tNDgD{~OrP4(c5!zN+N{RDNwp4Q{N6nEYu_mS!jxoOVpX$G?vTezh|wY{?F^RefK=SJ->awpYP}Ueipae(-o%tA7uyx z0z%Pdek*-d1hqXF%_pMa;;NDODY-cY&OBnO! zQS>1n9-bT*`u6#YXA|$h8zDAylliLIc99U#O)pI$M5lF5a>F7VL&aNWArPzUXh-sV zvjY*&wcPd)aU|ehQ{6b0Jb4bMX{Do}@XGxT)bIw{aV6#Z5Z6%9IXOtv()}5LY(zJ^ zRo%{hAddMx2Ot`r;F&&L&bjoE@{WIus<;{NOk3s~W3KX6A0V2VtGG#mp)8=9M{l(& zgZC`HzW6MEu*PhMV^6udf1mG^2786q@P%`AqGgPGc%|=ho8EL1cTnxUdy8!rcEuYG z9PcbGre0c;L<-%8$>AmM+1!`KI+O;eYpWvMP=lZ|S5c1IsSww;sLTf5r5=kly||vb z>`MsMOtw7v^DYZQL(v)S#zCW7#*oUpKdcYf8$3?lh6%jm^Ccw&L?~yy8Gl zV6qUtafepnWOQvrg>mM6OKNDzWY37U_zNix z0Xj(Y{DKR5L?VU(y9ipq+yis0`srF$xUrzCW*v-{h5pwxV7X)=6aOd$J;(tyn4qz} zTp)hO{IFg0-)xlBn|RH(wiBt_j(2HK8wISKS!AX#Pei3^5cQf&J7fnbH6$hPM3bq1 zbFudHwOhVd#HJB@;N3>lU9mMdO?gl%7mQRfFidbWHApM$jj59M&gB5n&3yD;6)j;* zRm6G!vbtg?Ol#Fdm@_VfS<;(LeGzksF54oQS#o4u$<&o&Sx>j!fd)&p2&c}rcLgiu zco4X{f^(bWbS#=i6f5t3_ApteljK;`J0yC33w;{lH5BikQ8YN(F`YKoSUB=Jy34?~ z`{$Is-4y`gQ&q+;Mux#fRAg1}F<-p#DW^`(V`X)Vli$yRtN|4M>pOb;393v>+nIZk zGNK|A1z9ag^xJJ6LCLY+De!D=naS}0qj0eBqIM^H-Ugk0_u=Wk2zq85cuHgbLa`a! zK)U)>76t1>$VjcDB}s96F^9n2IL=soAIq>MyOAJ79Z;we_t=&AU6TMw^lh5#!E zy03aO9gBc`ocWa2{}ghXKT&3)c&9zIs*%^|eKP6lX=mN0#A&n{LBnCY__PXhYz~?~ zxg@ghf&IA459qQv;}_dGX*J@JCp4>h5_ajlcqALPF(jD1wZ*2nTuxG?VVKC2NnJ@J zvTSQu34Q7lj6)qHskRPiM%te6(v~Nq`Hyk3@Hl`~Q^+{V7Bq2ic^=EXct0i0h<72r=y`Kcp zUX+!@VvgkJXWZLa2WPD<@I#E!p82RFiL)sl$kAtn5i?A(%FBS;_lJ!Fw;Rp8m11fE zhKCBKvBaguKk`4)`_*BlBMqFZ;5l0lZ3P1jBtTmC7bU(#@48_z`?xRKI5M&vRr=B@r?Sw29a1A~T)k}>JnqQYId0>4S>S`MjwL;r>$YHn)Qr#8gS0QQ~#J{*0+QPTaJX+sI;IQ>;UE=4Wx;ClBQk8hv@ zXR+NkHc^{}@tf>_)co}R4i8z|1rx(;SAwSQuEG~}^IDItgw2=3qt2z!kX!PuHWaYS zcvKi=f1Tl~o~`1;_U#G3O2&2pMGdpz-I*J!jf{bKjf9vRU-;kL@1m47NBJ(XyAalK0E_QjX8BoJL*k_t|muvN#;v6yIjrPmI{(uKx3_0>l+!YG^ Q5(=K8wt2eHodRP12YU=;Jpcdz literal 0 HcmV?d00001 diff --git a/world_maker/data/district.png b/world_maker/data/district.png index 68fd1b2b122f8398e67b5f808498137f9354241c..fc00abfdd528ebb2046c93d2a6b197755947789a 100644 GIT binary patch literal 5264 zcma)Ai8mBp^bcPVNs1{;_9bh=*dnRySy~J;gFy^tEFmGH6n!m`-3*#+S!OKF*oh|D zjj;|x_GQXMAv73%^ZlLQAMktUym#LFoO|!P=e=`3_r4czXJf|4Bf@jy#0fqN^V|1M zoM21+uXD4r5anCKtWnUx; z#wP77~}lxZyb z*w(d)Yzcb~KXqPgq2LdvcV9@UIHs-nX#0r&1)r8O3Q81t_QsVczDvNLQ<=0NjMPMM zhI>==)BVn=^mIj0c#zW`a@@TrLe^RX*^|3(1ZRRflH?{e2QY^1PhQnU!$~B&Uq-Fk zZpN3<;~{hyUn}rVI7~{+nh+I8%_c2n#!88;|0Ic&R6q^Hdd~|6?!w;;aP>p@6Gm}w zvVJ~6bxP{d$Ph2{@u4D=5nI}|orqBFZqKOa&4=}-s^lz%#_j7c@A!J9 z)Zw+v;j|Ic`bXmDCo3uBt>i@k2ljy;X7j=p;rT8`p>Z8EVO8VmLSf=oI#C9sz-=P? zMxTzC;-GV!N~7{B_ZdIifUX>IxBe>2cY-d;sJ?b|)?8hAMNF3)aaH*mRV@jgI zfPsjhnW8-j7uZpO>&o&}TsXhDEE}qR9#Ac6x*Y$H|1j>o2d}&j$O&IZB1a#GmRw=y z!efN;KdCl)3?>Yw^Ei#*K4}aX<2gASl|Yt(-5tN6mn`DAi4Fja)H*h#~O)JDBq(^(>c ze*Yfb4hW6nr7Cq|6Y}h0m^jiykIDhlO(M4Pw{7d6Gx6_AAJlJYB8GFm(Lh<1 zhd=#>)7WV*vn!=N616iJr+KOD^@_Vq*YKH`yNM?=4sq(#KHK^-=LND(M&+SLVnych z9nk+m4h(n*-af|nZuwc#ng{kDYN6>}^ms4m6y79+9f(b@Jm-3RTq3KSZd}+6>97bTtdw*yXQRVDd62~|%ge!`Zwlqz3|k)5E-#eQ z=CayOqs%9R0!=GJ$uOHE2B9H919mRP8!?Cu)r_tTF1RLvOFdF(i#XB<2ZEfFZ0hktIM{GCvHOA%*@&GcLB1yO3HdN}`SnKo z3DKT!5Cw>++EttcM;Cqb2X>(4M}vH}Tnf$bzU?~~59~Rg@xVw>6jQ+M3{Ojxt65ap zm3H62s6>`uT}|rtL%3@(8Q3}JzTZK!Ec+=(vb2|oV=_dSV}l`J#vPXW1&^t-DF;4; zVT&f>CWuo344$hCOHWo`Q|@scI5kX?A*Gn6gbZw#Ye*u@-aucju2_j6CNz6F)g&K`AE`GdPqkTtmOW<6n z&}oWsvTkE78xr<_FX9qJ^n=6QrYT;~!>#smNrtWM;FS6&2p}nDyfxqIR}TF)N#F9Y z=$=H|fgg*#UZe>sxYpzNG!@%iTSH!D`zSZ^@zyREoT@Xg<-%AHIaF0w0g z4kz^~xi*Qn9aP@My68>#`@r5hhxJxR7uLC1pq7BaaBgbCFY2_8z?1BIo=CKd7yH_BCjdcJ@X#TEEso7u#-RO(RU8vpRid3NTsu%lh?1zHjSx^ z>}X8D0eGvemiE0HTWjW%Ls)ag zAYV#$`(Y@?6YX$&8CuzR7te5fZJ+-4SIOwkT5Y_^KR*2>;M#$*%(-EQM)-I^Par=j z34$L#M=A_V-tGJOUD=6{Gul<=89RB7w3y7&(A2`RciJ+BPAGqcdjs}_>;An(DAe>I z%8}d!iU7vm0IObrfH%k+5T{-U#<`9a>XH)r-*Qf9C59wHGD^TWd8lA9_=dHXa@l+? z*i_Y$#fEvzODsCHBhqk#WhPSS&L?=2DBHHkgODHnCu%at9(>FDj3wsl3FdKFpHg?mV_ay^bl*Je0%FJ?hmKr3r6Kr@Ax`5 z-OUvFe7D%1VH}@DFHdTb55Vp`N&0FL;Pr^gNV;lr5m@YIz3#v8*!0~2aB|f9tI1>p zcymu`!{E;X>&{sY?;Uz3Sl#B;!g_Yv9@ZE^)faO{{;jx<`-ApPeapn1RU?~o3=H9J zKvc6Q&RUogdW`GMJEK5$Z~T0Ae0@J+^mr?@#JGdB(I(eH|3)~Ot+C7=^xHchh+#}X zdMT5LpKr&G8ZOGg*Q?jU$x=zHY%MzZV<%_iXxT2= z-P--}hf3|N5bgR#<+(hdK^NMf(iuK6;UE|Q;xhJLZ^4AX=5XjE-m9hxv(SbW}iW%5q;}wJ;RI2 zEsApnlZ(CFW)i;kcTvs(#mj5vq=G5SO9-!;@7m5n>1F|y=+0fS<2n?Fb<@gQJ^Fru z=WR>(;5M^iYU_BWo(sOSj$s(A>Sl; z2;e+n=yaUgOV?FE)o(NlRrfE??2AzK^@1r+koA%<|c85ay(x<2uH(!uFtgUM1A82oQ%`hVqWReRZfA2q!^TQC}PXp=IBjO5Dj*o7(P~xUV zih-ZuKlTWDJ9(CRi?uw8Ddaw|^!UqQOHD67N7;?|WY@sA!-~>(T-f{!uG2@}ov-(e zkh@Dr-rdaorE@&}+K72|K`#DtAhbX>hamW>Ubyk5g}T>zgU8gpuDk(oLrzly?=Wt# zeDviouH`E><1%S2ucz^qp&vRlEhuC$)A{|LC=bXg8SAE1->ktqrXnH(6*DGCvQhh1 z7nXG9FkbW*RYQM+(++YzRi3UeXwaC>^ZIDo@$T_PpTcjJ6El6nj#6+}BkVJTi4}`H zy0C{y5VKJnyj;k7zXZH7_a;8_A1`aNGa!2s zt4WK*Sn*z&UdfKVl&pQx{c&j8)7@RtJ0B#2AJOqOic;F%A2Oj=D<~>HE@TK#(^2lF z9%V(QGmSnTpCNr~%S{Z{E6cubwj>Wi}*81UAtbWSIf7=ascoJ*X zVD20BQBTJ!MA3h~B@}lgSCOYV^QHQ91Z`vd9L2%{U3XmCUF!$ZCsU5{^^mmD`LyWk zk=C_bZtD@--_9MLoYB4v6e~|XpcPVURGSyB3mp1uHHUd(%3i`8rkz|$grkUA+6P>} z-nIKixlPVEi`pE%v^L}az!b=pGy1Ku5DG0sL7c1k6sqq?d<@hx%wOLjLP41AfUQQx ztG&vBX=sGg5k*+-ktPwM_N67Y51p55BVIio3=-#(lkB(x{e7b}Vc-`rrK&?FimCKY z@Pa_(Co$a$h}0RyZMY;&h3SMa_RKqM zuFb(h220nUrsU{&5iQIrTVP_NYfJM5hN!s_J3EeF7PZ>1Y(=;!GqToguRltoIWe^# z?KQ#|8CF2GQ(S0HKLilEOPF_9wN1I7eI2^9>XW9&E3b7HN31MyFHwzXG$^_un#jm% z^hxkmbj((IGuG4bz1>hdrYCZCFcux%{s3FIHlx3H%UPA6?UCA_k~4c4I7$REtW<}q z#gKX%#sul+oq4_WmkF}|>j*wBG$>V-wAj`Q;<;>cSOIq1Q#3H((eKTSPJ?Z4$O=V| zRXiN5SV<3iZ(3x-Nv5RN5QHYaId(Ti%p9$5@`tNgz=^ye>lS;*4O!i{#QYPVAJLiZ z*=^iE>@VP|vg#I2y%~JiuwDCv>!WM+aHY-86-juTy6E9nRLAoaF8u~xu3W}sVhytb zK8WWd4;$QiP=JPqY}^wYNOu=PAOJs$Ew?Ks(AH~g1*k(9Nt|5CO+}DGp3Gw0N38AjOnpcI{=TZ4~X7l^PJ?=^t!8DUSTq|U_~fP zf!Hfqv}z^xaf3ALqj zsat?gpMtYw+4TI3K8$UPznxptv#NL=qg})B_1 zJwC$toMP~8S;udM;8!w^14FDgESfW8&mo%WyWoHT*v%dvky~P6<^PqByk+rlf#jlp zQ3e0468}wtu(bXUX9HS9s-gM3dJ3;@{{lSraxGO2&T6?N+?ac{cj|4%$Qdxc6G)Oq z$qY)#K$Cv@W!=B@acFhF2avt1-Or4lEg-u{v@>Q6-?&i7HS@J;f?j{+KOAUA{QlD! zr757dapr?l=~hPyZ0GnEVUpf_iMsIsZ=Wg=b-1?Ie$Zc0jX4ZP-a5Cf(o+XzoBExZ z93qK2ytcCM7)w8`YC8!exmRBoE7@9*>+Fg8yNR_YLPj(Wz_lH_pv$2gT2r$S-AEL{ zQ7TAK8dgt0iB+$*`!Wz$hs0ZhZ+@k%N;cI+K$~bPwsB%a=9&SH?*&@WJFE1oNYi*D zCBS@L?~xlvFko+on2@I`>PHjs=6~m1B?CN+H&st^z|N);U@zcJE#0A^#UjsMOlSDA zlfWB$#+rUdCTiIog$TpT3ib7Q+`HQBO6C`-vQCTj?T$rxcQ4M~i# zWQ^Uk$da9m1~c>e{@(YG_q>0-_ndp5bMAAV=brOC_kPav+_d|ard;eI?59qh;xacg zdT{F0>70M(Ii`~xrQ5NY#Lwh7Isqwyg%G76x;7)$yz`RII(DHzs0e%}b7$>+{MOnGl z)~(e&mXIHnD8?h&I`-`DS(V^fPEPy(3<&XqYkUaB_{o&So7mGLUs>+7KrRpljcPBk z5p+J4-rr-e0S+qAs<$x7Y?<4^6qa{`0o7g6`@I|e*b7Xe-XL`woJdS21Sdg3H}L|d z%+X&_(JU};l1@bcFW}4PI1;s?BNpYyR{%c zVq!Cr>qCM5Tfg7>*!;`)+)%07e%LXa!;RzfA3Gw8?7nndc0yTX5ES2nbf?SJ<7xQ} zdJtpBo;7x_#pN2H9(2F*XJUkp*RWy-$VAyeJ{Xn_F z0*`iEnK_m`=SLh}5M$$F_L6{a4KZPPKju8YBx2PG;KYc02#z;1;*_*@WPo>vM1hV^WQ7Rlom7rTv67!Um*~acxdMV`B;!Fzcf`kl9Qyq&q3r>lAzkoqokhtrT4OO1ZTP9PRn&g;h&wH8`4$eeo?A>v1F7Lb$8~ zJnN}f^4uS1jMfT!r-Lv=x8U{vUc}r&YrVX1{V6oS&F!4m7*d%N94ts+k_LwadJelQ zuU?~`0itspiveD#POzhFV zP?ehEQo+~9j}FUNNGSrms)|+MTQYDvxuQQr3$*VQC!*;|I)HVdCd!Hx;C=K5<9on5 zfhJ?||F{)#Czdn8Cj_UZbqKzh{ycCf#yh@+PO+jZ49F&6fOXb4(EF;4qk|e1He@+? zqsdH0n&1of=gEX(EL)x#|Hrj8x%040KcK@p;}+sV7n}ak#K9zkdgK~cX~XO}TuXkb z-+S53s0^$u^4wW`TAJCfH`}B_V|8NuX~{~^W_>E3)`xEBWR6sd25s(1Ktu#NatEMQvGsPzJ%0OhiDZ> zkMJH&WW{}Fb2?*j!Xe_SO4I9;yxNDLboTZO$ya8<4Vd>UGIu|>aG(-~>OBKmt?3Zm z_~URrzJbm-MkG-8j>>1^q)JY;&~&Yl;{q0Kyw3;P(y}VVwhiubzUD(ljkx57xfzZk zCoI`O*U&Q4ijHghM<1qjFpSe3i+B!yqXeNE2MU^`?bq|$*KYT@h9}I6PcP6*E3KS} z)0^Z!0xKb~GS4p}OX$bfl1%RE@@H9^=h}LH zF}NP7wd=nwaA*f$wbJi(W4?>wX1@J_jLo+FQPH5mHO*1yl+8ofhw`8=>Qo&@B=rfw zX0=jE^#pu-a=n7G69sKT6axHc$6hWjQ!w5b^dn_M0-#?8RhPMQBkkk9%XZV!;QNK? zNtk6L4n)IR-zvWOSoO*R-KZZI|KKFvsl|lP*%P^Me$8-`>2kg#(+So!Z}HK z{CIvlln3y|ld-EsizChSGgjk)1}I1pSG1Ek<>yx<*SOw#80aqQ!F0FQy5y3wPYjjLaP(p?n_0i z6`q|caNU-T6^L0cz1&99RQhyV_tR6EB*V;Jf0DuE@mDC@X$|@|)^+NuyT#0-d40V# zukJ$^)VbOzzDc|F6{VQK;g^be^6@=QhRA_MgscP6pkDpPA-iNDnwUN~^}KN)_=KAv zg?KkJPd&dp$a|7x+(8CfwMRMy=^Nvl2RZ%gXbOO1GJF)y1GtoFn#jWZ<7VahkBHmq zYZxhN{*9MC6=NYh*2dg0Tgvkd)cq!K4*;6jR5cEY1 zR}Q40)9)`)J(x32R0ipa`4HTM-0a^c+s$IV0;}^cMVr7x4If%dyzn zs5I^eukVF5_#{{FNhDWmMR#-@Zd{;9wQrv1UW>fu#nSR!hFb&I{;7i%ZPQvb8wawT z#5rDU#JvpuGc2+x@vyLT4TETE;KHWnO?dMrS5x>(1iJJ_UM5St${W#aE>7DZPzGseaLwwFOR zY#mXh%x*5%{4J;$_23Xef=<8f>$9v%MpAAbKXt!S0cqBsAO@C8$h#tGISCmRg=jM$ zx;(q_Ki#Rb7YaKv$G9!fA-RAV)=KaQg)2_|oh2c3nu+LeO)1EHZX^F%=!eS- zaikD|m9DV-diwgca+|KTPPKURcaPVWkatd3fM)pShhnS-ufmJz>(+NDTYYsRxFzIb zh;`kHVAr>)rPZC<=EIKjCwSA{2`P>okqebRF8Szq;HnmpKWCD8tn!R^B4|;@#X>?J|KQg;GF_9!xqEq--DW} zWF1CxUmSs>7od!A?odXQu$PxIA<*U+!hg z+h(vB&@gX}M6&_`fpN=emD5S=GdNrQObsUB{c{IANkO1IXO+_65zRq*F>O@8c-l|$ zl@1x%;5m>r?+}>XaGvv_u{M>Kf+uUedyc?Q`?FhrihkReb${ZD#ggts^&M2n>vTTh z{qs=EJbmBsgyo088LrUfQiPvBQLb-ZV9}kd&H@n_nqKmridBf?#Lral( zk+!Vq*}>9hC%mY5(btBtV#*E_S0lyCY0jm*v+ zZ`-H3={rGKMr9|b4I}(0DYKQH(SFZ#M0_RUGv;$vQcxt3{UAe*6ZCQ`Ea1B*mfq~1 zTEUf9;`1+~qO0mjmaCdgB@_6_N$qBSQHhBJ35|iG*Nb7PFD{~^w-CE0*V_JaPjQj-trhi09k zA2LY7D#4mK$A;vn%WwR`1ATA0)GZ@#p0~J_;!62+<_%LJIZ5(is_F5eR58DhZ~a4A zEx%=&Pk37nbrPW;?)`^*yN2BUQB*#S%iemo#N|by|HQT2*HcJ*Cf2sFd-&ZL>qgoe z<c}5$n_g&AkB{eT)#obT5ZvhnuPYb3~TYNDm{koSJe3Mfjx%W zEPn6|7A6SP@tvnFs@LnCm-zjPs>~%<`%O2El(KEkf@?2&J9eOUwj8`|F76~-Ay?cj z7-Bv(4tQr%KiyQqQc|d|YYA{}`LX1atIc6z%Z*$hKDg?QmuMJ~zu)iPbtMpPL*z&L z8C=%fR{I;2^}^6YFKF3tqT98WwK97;URPcGNq{WA$PcVh5#Q zS@`2^;8Ce`T8(o({nj}5^jE;9Xh7wY(DV_w-MZe>)c!P)wp~%G=9cAyUs;Y6uJU?;Tpzcz zCP(ChN|;p3qGkpt90%8_avg3Ez!pY~0XE^V0rf%O*lZaXI{{_^ma!<-scklR_Vjxn z!Zwao6n>7jeU1lIRn5RW3 zKkIAvjPqAhiLt+OkePsduS$V-#=EzQ>CL_QP@XJDme(>aaAUPZyB7g$;{a(MWIMqY zNmdvK^l&4q!fEaE#DloorA9WY2AjU5m&>|gV&)f{R@UF3W!S#>99^v}K6r8r8Ua6G zL3sb18GXrpz3(^XI~cRu(v;V>y4v?BD?C0wf*g=7`o`}xJR&w9bLHvh*C)-YFG4CK z0ojksT3{^QA(ou7M~TQd%ni;U1Lm!jO6?D4vZ2CF7c0TJW~hR4Fuy6PpzPl!jK!$@ ze+lCdG2^znGU z@mRdX&Di(kyGEJVBnA5-U`A))Y|e(ItP|I6yHpxXaPdCeSe+U*xc}Y&-sj?ceRwc6 zpWo>p{fx&`3%&{383GoWh6DL8lG%0i@Y+&?%S+$F+m-=VDPlNUtvD&=mW&(_Z{uzh zsL6g(TXm^8$a>*ToNlnsBvk`HHf*|1y72nC1t1wULF&7d0>O z69N5Rr=zBmyuR!)%PM&fC+arX_`#gs&xPeJZ*!9t?p8Fav9p?@v^?f&{kino8ejY8 zAfQ*96@iwn#!w3S?@$j!d7YRh$0SB;ZEIv=(Zr8O@J9vJoP?p~yx7}PsJ336yvmNTpaMma zqlSb^Emj~1E0-vT93euo25Z1_#R#HB35Oa8gmeRe$nj4zv)TE+{r0{0d%xd%Z&Obk zch*qdrmCQzpyBd^<4FYtSf=z+QG|9(j_5%DDhFL0zxRlxeCY3uEIg{^z#+IwBppwi zJ&yT4ZO?}He@v;QUiW|x^>Sg>)**%sOKMurBB(5ZsAz`=I^2G0uCK5-lCz>Id^;9fWI z>~h-uT~P}=sX<>nUS8w??P-`;@WWfgc-HW1b-w3b7G=rC@*$}~`C@Xu5=}3Ky|IM+ z;n|M#Ylf^E)r3H{qU&OqjzFR&YiThgc5*1}ZtAYKPjHTazd;trpVne1J7NO1dga-w z^)x+*dmOBN|6&L^cp1Wi$JUpzUQM+j+PE`mub|t?NLGX;1x>yRbomxNd6D~N2w!@f zn?;Ng{d}2~-B*6c)fI;&%%}5I!{;LtH#1TeAZCmJ1H8A9dvJ`Jn%>W$e>C(b+Z+3v zr)wn1G06?iG<`}rWvNJ(rebB>t8zHUtGHEYfNDq4>vl3I(ILXwejm8$I#1>8+jr#9Ng#or}DuYwUP;7iVNhDmc5$a?1?TKjdp17jg&Q+w{Xvw(#ojn`1d=hBNsW-4^xwQ% zm;pqtOG$*j`j7sQ8~U`~I~%|82W8@3ee9OD*1YvOU4$Sfr{!@lmtSQuZq4Gy(cDBc zZJIO*_FP_b`Hm&+uyN%XHsJ*ihpEMdf^P5ldJ#oDRv|Xk{SHc5HGh`bh8deqCX+tc zrCyY*Vb+l9)`@Dc7xhhQjd9$^2kON$peGF&{JF|LU>BtCp{hxlg^UaC8w}PcQ3!fJ zp}6C_v4joyHO3bO0j0s)tWw0B(s1^YpaH@z>bEgNCNR=dN^3+yieoAcJ+e9%G~LKY z=BH?-5-oeshVp0&sCsL{wMw8e&4O_Ado12$Ato9}WpqMbP_$MXzq!3p!@3<2dt_C~ zNI?YTD;Z034;3;YtVWxRAGd}$3Sjef(di_7pFwk%=@KG6-3lv1*YQTETjT<$S|OW{ zw-+Y-U8Gzntn2t(9p(t+GLj5>L%42p>hpZ;+L)Y@ z4xMuCiM!D^eSekei)97u#?vMc96Wpx(pQ?unQf2jxlLC z5G)lFl<4@HxUUch%;9P-Y`eoEYixiEGuwS(TR2*-|7x6b>u3o(x2lX#7V{TANQgac zmc*C(heB%cRz?B+=Iq|Ui#`VemMc)+hNNdiNEA?Q9_BrgY$-hT)sux*9GhzFVR{(g z?H-E-ROBtWInQaDrBe)+fQmgy>r90{s%e%NF1qajF)gmrjcDl{pBF`XW|@%hl?~;H zKs(7Z&(8N_EzblL&8e*d=M@{&lF_*!hr~M=_0Sc)es$hg#J;>h4FF`%d0G&R5hph5 zT&FuuPKYX0ruVs%g3im$hdVbY9B&UnwsDaAsYE}c%$(cU#>o2Egf8S~;Ru4Q)G`(h zl8R&UnsJ+^dWF_wFU&r%^d-lk{5Kg6%U{X6o7>We>||v98H^ai|-~I3%+--7hcSlgnI_J`ZXYlH4LxM>w2Z zWd5V=T}XXY-0BwfGsqSLT`}o4>1g;odjhxfb&; z>)a66pJ}%ot4pT*kb9Z@sfXV^6~%U7kOL*o`epw6_>ckJlW5`oNO)Upvi7W_>U%|*~ zeA8t$k(og6zLP%ma!I~G_BD0A>D}I^pC0@Bbjg3U%5z&4fyu++KoJazhsdgu3_3ETTw zo>kviGuP&BzOVR?+tr_SSQ)pK?#gz)*=q8gw-GILk&^hN%eL(2wdD57?)|X#WuboT z`vUD(pJi(9Dq=*?cix{z*5{rO%S*G))4x-j=UO|ddA;3{y9+T?!n4qmU%%J{i_1Ps z*k;sjpM3Ig?kDGV)a3mnX`(1c@kiZ%oARmPzs%9)QoA4B5a^kS~^ z?}PcJPi%SEcVnbcaIxUfS?eWj)62R)L(G2mw#2~Nf93$xr@lQL?iaRC#;4`njxgN@xNAx^9cJ diff --git a/world_maker/data/roadmap2.png b/world_maker/data/roadmap2.png index 7209b051ed95d8339d9d137d3ecc803fca8dd309..c084d6e4eae9fc496c08e7aa4faf76b2e0fdc8fd 100644 GIT binary patch delta 3103 zcmZ9OS5T9S7KPD+5{j4rVjvVls8S?=6hS00{sge#0i&R_Kse!0q$nMKMM}^Fj1&<< zgb)z0P^2r;A_hUKG-;wBNReJd%FVfRAI{wUux3B3nZ0NB>~B_|R5ttp3KX8Uz+r5I z8FLwSfwM)I=~_RzmLWP0ms zIbjty0@_xEery{WEvYPN+A73SVG07Y%*9EWL{SMW8vB%}?U{u^kvkyLdXf8Sng42$ zZc)05L{J;($b{*U`432;ynu0M>i;YXKtC1I0LPqefSksOH9@5J0&oQu&pc(&0Hx;) zLZTtdh0DvUSnRjSzj~F9y51Z509)V~hJ_biJ`}CzH@7`v`J3<(J7;8EE2xF`Kc+G-dZvXa z(>{P_any(kPyIAgO!(fz>5>nBnU-%_eEM!arC49j9cP?T@(VTphH$x`9QCT2OhLHl zOyfR7qE{5W*aUoLy?UXt{+3*zAM}^NZPSF zsIe6a0a)^K!}_qk{&4~5C$uVGk23w9DC@z7?$bf*d=yBhqkh0$ZcjbX!y+x&RBMW4 ze&BeiSJYYlF^~bIsqik#H7%OVZh5h8h5T@hW=+w5F(EGvf~dFw%txVXk)ty|#R$CbAf7nkCYS z05V(P%!MPd_IzaL#<^?)bB zF;p)xMV_$6{ae0v*%a$R!Wc~?Rp8C20$xPQFKk@%DiBzgNr&{l zk?f`5@s-@CJ@V&f%(V)y9Rx8AOZTmq?Y}=lBOZAvjd;cn8+qD!#=aqa8h{^7!7;;b$y=&WDsnLPO6@ZUdvq zLzk)o;y?kF_M3)lqi=+pLkc%~)%aT}a1X7}-IY%6;@66(3j><#CqWezCG*U8f*1H* z?PdtKktYVzp<=gcBQ_o4659NUt$2oKr=-Nq2$^>2_B+$tk{W)Em4!dJWx=^b#XqgG z4;ieD+Z;%!Wo{(N!_n4gVw}rG;!)uC0#aPbA;P^0kIH9;LgsMzc17MY<*?>no3+ zUO0X;I~*U={9|7e{txfi+2*)%->IzpcaR1g?%uNfP3)Z|*-bKsC(_Y8 zkt10;ht(cOAqlE!LhjU7HrulKNq6vX@~}c>S%SS#lY{ds0`lG6AypH?iQjfDj@Aa&4oG7fLyd{g52@Wo{~zmk*mIUicphZiDH=l$HC0dZ>>K*p_&j<)4g809W~HbM z8<~oPgH9(kSLQmOuG0F`{iKEcL&ASs$2|@m_r5MrC2RMJ^Q5EQUcR(&J7(_{>THnl z8p0WX(CUh@o?|tpa&cNWb50)U!cT`k@%@E#wR57bYcRP zTJ2TCC97TGu(u1%TgzokQ@gOYl7&JLet-%o=8!J+mt_Bo?!~rFGj-h|t6ICEI|Kc- z%Y7>TyC>K6>IN`A(WcLaZR)}-u^NAs2 zb(QPC*%mG%(*wR{sGSYft_5?%!oGOBS$J7=|U zFQhWj%F5865TrBUz}J@Y?&iJNS%*cq6H`iN2DA<~M0!@>1pN zu}?B(Htio;nyn4IPd`D9uW>?yN@ig@8H;;A=bAkI29r|q{ViI7v1`*Mhz(jjrbKolmW^f6)=mtxVgo?!W?U1|;14pd{6ndh}Q(|0v$!T}2`PF#e{3P9gsw z-m1~rL9mow-q15&7kI~uT}Jj+@BBGKQmtus8$TXbBMsh+HLOH;*>r1GDCMDO8Kk57 zJBIQd@E?Wa?g()%9E7Qzd*%`eNB!9|=$=ZAqYo+-9X+L9F15cAH-ZmJ*J$o(-ab+7 z8&1WqzI`pc5|m*i6+b53)_(b?|5&kg^Gw2JXSuX0KO6Ijlyhmznjh_-(34UtmQn&kG<>kKZhfbI$-#p?!fcN-WGn&Yp0xy76`eb1%p-3JGeRgYh za|Yil^r(e|BYPm^PGzImnioY|ojL>AY*T|-{74)f@=Lo_@b6P(xw)FS@uN-h1vAif z*R$Ta^!Qm_oFHvQ8!I?Y-f|0#x0*-~YQoDeUBseZ7P9WEXVD$m$>HzIrbFBI%{PN3 zOQV;VvbNjtpj=cRLmObsTv9?P@gh=K?cR;|6OZ$s1p`c1D*njh3SKmlhGDevWZZru zB|U|x)Q8h=d!wqrbiAx;uhinGlcxnN{|okFSE$Ke-zp)KpCp}7LZ6CU;$a0+L&~sV zuU6c#0`ym15H`ucXWigHl5tbVl7vtdAfSYr0{=Fbyr@u(7=r(C5`B~Jice+ z`$C9GI+5IFd7hWuC?*k@hLE*AH)xzLF8uSiC_7;u>#|ogx+4#NWRMDcMF@UO&&$TF zidfk^AMbiba5DYS_XDfX+8ZUkdi%Q87rBm_#%T|h-=Q2qHc_#B?t7wS8gx?hQQrpW zb*&Y@olLI7%->sq=C2MK6Xn`LXS`ieyuDI7k6X+ktMKjtw1yAHJJI#ee^n&S)4hKdx>?9{139&)x`h+ delta 3284 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 PT))TM)EZr3;u-%h69Fl9 diff --git a/world_maker/data_analysis.py b/world_maker/data_analysis.py index 37d440b..56e061f 100644 --- a/world_maker/data_analysis.py +++ b/world_maker/data_analysis.py @@ -232,6 +232,3 @@ def smooth_sobel_water() -> Image: group = filter_negative(group) group.save('./data/smooth_sobel_watermap.png') return group - - - diff --git a/world_maker/pack_rectangle.py b/world_maker/pack_rectangle.py new file mode 100644 index 0000000..879ae8c --- /dev/null +++ b/world_maker/pack_rectangle.py @@ -0,0 +1,115 @@ +from PIL import Image +import numpy as np +from typing import Union +from data_analysis import handle_import_image + +class Rectangle: + def __init__(self, width, height): + self.width = width + self.height = height + + +class Bin: + def __init__(self, grid): + self.grid = grid + self.rectangles = [] + + def place_rectangle(self, rectangle): + best_spot = None + best_spot_empty_area = float('inf') + + for i in range(len(self.grid[0]) - rectangle.width + 1): # Swap usage of x and y + for j in range(len(self.grid) - rectangle.height + 1): + if self.can_place(rectangle, i, j): + empty_area = self.calculate_empty_area(rectangle, i, j) + if empty_area < best_spot_empty_area: + best_spot = (i, j) + best_spot_empty_area = empty_area + + if best_spot is not None: + self.rectangles.append((best_spot, (best_spot[0]+rectangle.width, best_spot[1]+rectangle.height))) + self.update_grid(rectangle, *best_spot) + return True + + return False + + def calculate_empty_area(self, rectangle, x, y): + empty_area = 0 + for rect_x in range(x, x + rectangle.width): + for rect_y in range(y, y + rectangle.height): + if self.grid[rect_y][rect_x]: # Swap usage of x and y + empty_area += 1 + return empty_area + + def can_place(self, rectangle, x, y): + for rect_x in range(x, x + rectangle.width): + for rect_y in range(y, y + rectangle.height): + if not self.grid[rect_y][rect_x]: # Swap usage of x and y + return False + return True + + def update_grid(self, rectangle, x, y): + for rect_x in range(x, x + rectangle.width): + for rect_y in range(y, y + rectangle.height): + self.grid[rect_y][rect_x] = False # Swap usage of x and y + + +def pack_rectangles(rectangles, grid): + rectangles = sorted(rectangles, key=lambda r: r.width * r.height, reverse=True) + bins = [Bin(grid)] + + for rectangle in rectangles: + for bin in bins: + if bin.place_rectangle(rectangle): + break + else: # No break, meaning rectangle couldn't be placed in any bin + new_bin = Bin(grid) + if new_bin.place_rectangle(rectangle): + bins.append(new_bin) + else: + return False # If a rectangle can't be placed even in a new bin, return False + + return True # If all rectangles can be placed, return True + + +import random + + +def generate_rectangle(max_width, max_height): + width = random.randint(6, 20) + height = random.randint(6, 20) + return Rectangle(width, height) + + +def pack_rectangles(grid): + max_width = len(grid[0]) + max_height = len(grid) + bin = Bin(grid) + + while True: + rectangle = generate_rectangle(max_width // 2, max_height // 2) + if not bin.place_rectangle(rectangle): + break # Stop when a rectangle can't be placed + print(len(bin.rectangles)) + return bin.rectangles # Return the list of rectangles that were placed + + +def draw_rectangles(rectangles, grid): + image = Image.new('RGB', (len(grid[0]), len(grid)), (0, 0, 0)) + for rectangle in rectangles: + start, end = rectangle + for x in range(start[0], end[0]): + for y in range(start[1], end[1]): + image.putpixel((x, y), (144, 255, 144)) + return image + + +def generate_building(image: Union[str, Image] = './data/roadmap2.png'): + image = handle_import_image(image).convert('L') + grid = np.array(image) + rectangles = pack_rectangles(grid) + draw_rectangles(rectangles, grid).save('./data/building.png') + return rectangles + +if __name__ == '__main__': + generate_building() diff --git a/world_maker/world_maker.py b/world_maker/world_maker.py index c52eb13..c86e021 100644 --- a/world_maker/world_maker.py +++ b/world_maker/world_maker.py @@ -17,6 +17,6 @@ if __name__ == '__main__': city.loop_expend_district() city.district_draw_map() city.district_generate_road() - road = city.draw_roads(Image.new('RGB', (401, 401)),3) + road = city.draw_roads(Image.new('RGB', (401, 401)), 4) road.save('./data/roadmap.png') - subtract_map(smooth_sobel_water,road).save('./data/roadmap2.png') + subtract_map(smooth_sobel_water, road).save('./data/roadmap2.png')