From 50781334350e9c42183f57a9a70241bb809b6187 Mon Sep 17 00:00:00 2001 From: Romana Rust Date: Fri, 5 Jul 2024 11:37:33 +0200 Subject: [PATCH 01/11] remove placeholder --- docs/PLACEHOLDER | 1 - docs/_images/PLACEHOLDER | 1 - 2 files changed, 2 deletions(-) delete mode 100644 docs/PLACEHOLDER delete mode 100644 docs/_images/PLACEHOLDER diff --git a/docs/PLACEHOLDER b/docs/PLACEHOLDER deleted file mode 100644 index f9768c10..00000000 --- a/docs/PLACEHOLDER +++ /dev/null @@ -1 +0,0 @@ -# container for the source files of the documentation diff --git a/docs/_images/PLACEHOLDER b/docs/_images/PLACEHOLDER deleted file mode 100644 index 48f73ebf..00000000 --- a/docs/_images/PLACEHOLDER +++ /dev/null @@ -1 +0,0 @@ -# container for images to be included in the docs From 21699780a8d2d5f39ef605ba47ea6cdf91afdc90 Mon Sep 17 00:00:00 2001 From: Romana Rust Date: Fri, 5 Jul 2024 11:37:54 +0200 Subject: [PATCH 02/11] adding offset func --- src/straight_skeleton_2.cpp | 73 +++++++++++++++++++++++++++++++++++++ src/straight_skeleton_2.h | 10 +++++ 2 files changed, 83 insertions(+) diff --git a/src/straight_skeleton_2.cpp b/src/straight_skeleton_2.cpp index ae1cf55c..dcbde6aa 100644 --- a/src/straight_skeleton_2.cpp +++ b/src/straight_skeleton_2.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef K::Point_2 Point; @@ -135,6 +137,62 @@ std::vector pmp_create_offset_polygons_2_outer(Eigen::Ref pmp_create_weighted_offset_polygons_2_inner(Eigen::Ref &V, double &offset, Eigen::Ref &weights){ + Polygon_2 poly; + for (int i = 0; i < V.rows(); i++){ + poly.push_back(Point(V(i, 0), V(i, 1))); + } + std::vector weights_vec; + for (int i = 0; i < weights.rows(); i++){ + weights_vec.push_back(weights(i, 0)); + } + SsPtr iss = CGAL::create_interior_weighted_straight_skeleton_2(poly, weights_vec); + PolygonPtrVector offset_polygons = CGAL::create_offset_polygons_2(offset, *iss); + + std::vector result; + for(auto pi = offset_polygons.begin(); pi != offset_polygons.end(); ++pi){ + std::size_t n = (*pi)->size(); + compas::RowMatrixXd points(n, 3); + int j = 0; + for (auto vi = (*pi)->vertices_begin(); vi != (*pi)->vertices_end(); ++vi){ + points(j, 0) = (double)(*vi).x(); + points(j, 1) = (double)(*vi).y(); + points(j, 2) = 0; + j++; + } + result.push_back(points); + } + return result; +} + +std::vector pmp_create_weighted_offset_polygons_2_outer(Eigen::Ref &V, double &offset, Eigen::Ref &weights){ + Polygon_2 poly; + for (int i = 0; i < V.rows(); i++){ + poly.push_back(Point(V(i, 0), V(i, 1))); + } + std::vector weights_vec; + for (int i = 0; i < weights.rows(); i++){ + weights_vec.push_back(weights(i, 0)); + } + SsPtr iss = CGAL::create_exterior_weighted_straight_skeleton_2(offset, weights_vec, poly); + PolygonPtrVector offset_polygons = CGAL::create_offset_polygons_2(offset, *iss); + + std::vector result; + for(auto pi = offset_polygons.begin(); pi != offset_polygons.end(); ++pi){ + std::size_t n = (*pi)->size(); + compas::RowMatrixXd points(n, 3); + int j = 0; + for (auto vi = (*pi)->vertices_begin(); vi != (*pi)->vertices_end(); ++vi){ + points(j, 0) = (double)(*vi).x(); + points(j, 1) = (double)(*vi).y(); + points(j, 2) = 0; + j++; + } + result.push_back(points); + } + return result; +} + // =========================================================================== // PyBind11 // =========================================================================== @@ -165,4 +223,19 @@ void init_straight_skeleton_2(pybind11::module &m) &pmp_create_offset_polygons_2_outer, pybind11::arg("V").noconvert(), pybind11::arg("offset").noconvert()); + + submodule.def( + "create_weighted_offset_polygons_2_inner", + &pmp_create_weighted_offset_polygons_2_inner, + pybind11::arg("V").noconvert(), + pybind11::arg("offset").noconvert(), + pybind11::arg("weights").noconvert()); + + submodule.def( + "create_weighted_offset_polygons_2_outer", + &pmp_create_weighted_offset_polygons_2_outer, + pybind11::arg("V").noconvert(), + pybind11::arg("offset").noconvert(), + pybind11::arg("weights").noconvert()); + }; diff --git a/src/straight_skeleton_2.h b/src/straight_skeleton_2.h index ae59d883..7f723a3e 100644 --- a/src/straight_skeleton_2.h +++ b/src/straight_skeleton_2.h @@ -19,4 +19,14 @@ std::vector pmp_create_offset_polygons_2_outer( Eigen::Ref &V, double &offset); +std::vector pmp_create_weighted_offset_polygons_2_inner( + Eigen::Ref &V, + double &offset, + Eigen::Ref &weights); + +std::vector pmp_create_weighted_offset_polygons_2_outer( + Eigen::Ref &V, + double &offset, + Eigen::Ref &weights); + #endif /* COMPAS_STRAIGHT_SKELETON_2_H */ From 5f32935761208056c3c24ce9d8be15134b69ac3a Mon Sep 17 00:00:00 2001 From: Romana Rust Date: Fri, 5 Jul 2024 11:38:41 +0200 Subject: [PATCH 03/11] updating docs --- .../cgal_straight_skeleton_2_offset.png | Bin 0 -> 45097 bytes ...al_straight_skeleton_2_offset_weighted.png | Bin 0 -> 36406 bytes docs/examples/straight_skeleton_2.rst | 18 +++++++++ ...ffset.py => straight_skeleton_2_offset.py} | 9 +++-- .../straight_skeleton_2_offset_weighted.py | 37 ++++++++++++++++++ 5 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 docs/_images/cgal_straight_skeleton_2_offset.png create mode 100644 docs/_images/cgal_straight_skeleton_2_offset_weighted.png rename docs/examples/{straight_skeleton_offset.py => straight_skeleton_2_offset.py} (80%) create mode 100644 docs/examples/straight_skeleton_2_offset_weighted.py diff --git a/docs/_images/cgal_straight_skeleton_2_offset.png b/docs/_images/cgal_straight_skeleton_2_offset.png new file mode 100644 index 0000000000000000000000000000000000000000..0868a50b219066f1ee1d0e7fa3c8714b0f6be0a0 GIT binary patch literal 45097 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

N#R0He_Eztj0D@Vp@3T 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 O{5!8_qFbng3;%!4z#i)W literal 0 HcmV?d00001 diff --git a/docs/_images/cgal_straight_skeleton_2_offset_weighted.png b/docs/_images/cgal_straight_skeleton_2_offset_weighted.png new file mode 100644 index 0000000000000000000000000000000000000000..f9ffa8b7d403e2924fcea14b664dcc7d0c38fd97 GIT binary patch literal 36406 zcmb?@bySq?7cGo~4kaa^QbVgWNT+}(B`DG{fP{2+415 z4TB7DpBMD|zTdt7Ue{s?!y8YWv(G;JoQFr+H?EPBoF^e5ARt%0u6&Dt0EQlTIA3nJ9b zt`5m4-#?>%8TU&pDgHuIhjr1-Mc!hHcVSVAmOli#Rhm)hq2{b?u}0Y!dkZ=>do|Cj zOuNdR7HJYxhN%7aCtLpXDTzT5paPOurJICUKwOVx!CcUib~Yyc6H_)5~V8 z2AL+T?)6uD36B#B7Mx~83HRMb^YdIbi3xLk*I~)%IzGI;abaQ*o+vsToImWn@oZ+C zaP|{7Gt&B*fVg@qSaLmU163PMO@d3{djtXD13LmZ_>K^Kod;h81SejE6PyD7Q-d$% zblBhD!tm)Q{(et52wiwZM@dx`{I7Gz-P+pO#k#{z7~qf0y;WZ4WfwUJ6L z?$$^#enEagHaQX`5-H?~|;3rwOyPlq|QUU@#K0f?DBK$7ywgN(ul9B>~ z!UDp=eBcT`4?ky53tv8G5BB4S{C$qHwZ|QIJ6BIT7iT2&TnkGVFHc!EHt0qF{5u|} zwXfa3Z*undGc7Pd0q8dZLi~aP|2!MqDg%8grETYH?P#cM=LD7qyhHA?xQNWr_5aUr z{(a+r?lk!KPI0lz|Go1+zxluK)b+4-S8{Ozuk@7rcW3_G{NG>xxlu*{n)!cL;&_>l zJ_YM6MD0!iM9!)zN?Z4G5vQF zLQx)(o!s8;?;1MuX*P+5MurKKwbQY$$|qh#yk>jx?jggalcA*P2t+6^>~JG#t(L55 z#HUn5#Ai3P>(p36K&R|Z@=Aiw*m%&gN2+a%b>3Mb7-a|n97#ZkP#}O&UgyBjJxZpH z4*mBd@LORxB|eby?={fn&&*+n1GoUc&b|L$7@F4g-yh-B8Uzh#6D`*E|9yqR>c+YM zyfH)}lo*MlsV>(b|L;f;!Ez`5d)IYALO42!Z|Ji9?~gEIu8;|>)hS`o zqsjca42jz%gXZ@4E@T6k4zZcZ+mpw0KK>jopZ4D$5ghRZq4Eun+j{>y?U0FCkv}VS zbQcCrqp-^D>y~i-pA`h3gT*@e-@E?*E>=$BM1|1N1mCl-?#|kX*zg|i%w@Hq7JQfY z^ii5j%v@w(Cde4Lp5ctzCELz7tYFB>$@Tc%NlRH&^{Ewo;||B%lJ-i^F9*E~iYs1@ zIM*VPt|t=k@KZ-ipi5KVh!Rzlf~KgQTpvo*@pwm}V8M1ZKg^?&jAp^u#nhm?%w9K; z*WRs#)`lfe+sN4HXkQen!CwBT34X#1qr6Li2_x0_e0q_i-^0}QcAe*(J0{g7Xxv@B zXw(N)QLC9Wr0JaTv|Z)t2h+n%XvhSxZ>%8`QJqGD)Ch%iLO7iOKdM^5sQ9AMuk-eDPspWXvn3-8#L*PJ)PTb%4L))#oQ`%eby=>#|2$Ec z>f+ahW+}(!6sq72wbGnR_qT0&-nO9m+mB5mkvn9ZxcM#K@woriLb}cMr@eh zu|FuB*l$m0YY9Mho+unE$u@kYnVljPBcFFUjjDXhvDPo~qM#2n>M!8US_kJvln}n$ zf)0AS{X3m0aiq9F{c}!6hQS2e-Yh|3S_ZPQ}7#ymzH zq&yAyyEj^@#BygMb`+8CE->KBxndqpXE6e`2>KO^ejKvR z9y#EVyE5#kV^B@wlxd;P*hYFv4qwP9a}TjRlXQ zoEhV>fNc}Q>TJ!0e#!?5PQ(*UDC64A(~x;zf=nHwBdzXJ1Tu84*vkruE0zjsY7>L?CfJ z#Y63V2Wu2XJvUCk;YdnK1TVfJAXpJHNQHI8#P{fGQEQbB%4ZXY6ZdS+YZGB!QfaT} z`iyH1zDeMR7VITeePh~3BCQQim#U6M;FUo!=q>U@v#!h_(d0 z=#70cP8^H>g{`v$1Q=}?ZtcPAS1@QMYzXs7t!822M}n{@dFTF`s==A02PG2{aO7V= zMh*hh{bDxW+jZI}wHFO1(1sCmjwcFd-VeWwIkGVWYK7HS_rbHC7vXPjhz3j&6)92h zWr{i>pP9jMt64rv36j8kPXqJy%<;Hn`^ZZ^rmgc04-)J?QMUvXB^90^C}Txb9=B+> zv8UsvR%#vk-|P6zemf7dV=wT0KWLwwz-RcPG(iLfnc5su;bkg#)Vz%!*3{+{W5|Hk zXk(UDV;cIPB4~TiRxDt9@h#dP-Fx$zu5x-u)V(%>nUc&CCZS4~~1kNj2{ib0K! zo4PM?BYjfU`QPIMJMSyhAlf}HI+H%yF%ingRyY}z*jqc~6oz~K>V7qsHb3saz*qI_ z_2WzD{U`eGP2?k3xFKkMco`V}o45xJx{4De*mgtNj_r}67e$h%U@i?i z8!i3^dwt0QPwxlRhG6%+u%_6sm!pB1zhn7~^DciDAMs*)H-^g2Tx4h0RxIlNfkgxA6 zoOK+V-T;4KuaP0k15UEj#z|MVO-j#CM!Qhazio0Q-*Cow-;4cL1E~Ml8xh1tt_d#(i8n9GYj1AgSK`a4mI`>sd;-mCU<~U(M7TEQ@^ybB*|_(8LT@@u_q(q zKAet2(b2B#_WSI90WmL-utqd?|m^7g>!kh*p5b8jBG$76nanI z*)Vt=9!G_zW&f!Rnc8y>u=YPc3chnE{+zHW2=bhdWf@-d&@ z2bbYerwR!>79H4?m#JzGSPXDHvS}MftPGh5u;QBuy^8Kh469Om?HakEc$>r*j~?r` zSWzc~jvXh8fWzI{H1Ud#pT+}Q!9^Wn#_wxQtGrXM-SAOmn`q1AR@I0nJ@U|aR^0BH z=G2g!J$jP~pYyx1TLn9qt)R|iNzEx4>{K51H#Xy1RLuNvnahe#_hzg=EW-Q^`nO45 z#Z0301^{)pA7AC3(j1R#3XF>ig$&2aVAg(ggt1;8cF14#uAtiQjAM)dC&eZT?qgpn6ly2aaA_2v4%Xw| z!nH8w*e-msQ!cHF*!n#RT_$v5S32Of+lhl zj#C5J-s-=tk8<+FHNF00xM|>1%Re@J& zHC}q_dAeo954I4jwkEjrlKS1JMgc3_TGr;hreY9gl_A3I?-wmyVVfpOANFP!eg$#x zGf!TGlv_JDj79#ywX_$q-iJI8AnEf@|KPV7MNfv&3tJFZc`d}c-_nqGf`?v^jp<}) zKwXsVgw~AG6u|zkJaTqYRzZ)qgLk45nB0`FpYS=m5G=u9|3XvY`CB?(gJ-+?Uo_Sx z^Y5RZJ$i!}ctbJv!8cl@c6+7#olj%|(=qxvT4{1boimj17h37(dF18rUk(EWmB5+= zK{2jYG;06JDGITGwU$*o^HB<0B~2;B-5+_DYdoqZ6-05V?vK6!>Kvl5No+nDb#Pv& zkrB2tYFoOHXS0wS=OMU~2|o-WJh2|RP6wM~1rtsyNS@ox5!3-MU;@@NXE58`{xM#< z>rQ7yozKcxe{IlSb9=%gg>(~GpYpsNwlhbQp-4-fZ|6htgQKwc4ur*PUe;%^YH%(M z!GIOnqM#kq_aEi}ZfIWceQpVBp3+*I67hmuj|kuasluf8W#ThM%XNFpRbmePybFEV z`j@%u-yyZRVSNTTQDr=Cp;+7GBs7Z@M1ft|jr0l)$cSb;$yZJtE$H{F>E~I3pDV6r zEo?M8f=xZ593cKTljYZqEtdai*F)8;ddBjb+ABRcU2=j#roisAveSkAwH{{-dd z@=c8tsS-A7)2hUdWV_P4H?L-S{0Z+*KzO$#ZFJS+02XxkzU}npdYizobJbGm)T8Qq z3SWsoXW9-G+tKRON7Y$+CLXNc(!Wae-gf=x2(uqpMBpoK zP?-Ahfz!9WC1+2d7WcZuWqhn<#)V4)9l9$hig>9MVt}9Se$59h95(J{T_SCpE@bPs(lh;&x?1+wSL>N`TN>2YsW#X-Dinf#2rdu$kIBS zAJHsDYsnQll@4-21{0!i1=goB-w;)Y)H{7-2DD&-a$!Egbbu8f1MCFFKnTHKEmT3Ujgli9!ioFdpYndf5{aB+{LMvw10X zgpp9ySE3%0v?3>>>Ww<7Q2cHX2EEgPqpuD~5JOP+24Ew53FF-P_JKkhQo8u9IT|^a zoV`g$;9~FL9}3rhG@&k84;@i)CrR*o^Ayjg~qM52*+X-2$r_L42F${V7s( z%YY;m^i(V8sYPez&VPP=)uwFBe!Gb!yvw+MpYX)V`{L;UV=p`+D8#8ZDzig-{D>0- z(8cd60hYk#ifp?|h3q5PMVhv{I@y$K+m+g1c&Bw$1&Yv|H1D|7qWBv>jlQ_qLkUfm z1LEfuykD4ld*9m}?&lA_dJx`4brdm>+Qb-p6Ms)xIGVE;+c~MDvihLt)k#<% znMUzCbhHkpbLAM|- zhXP(k)vM#%0sJiv6+8&y!yN_(A0)_7S8qUjaWVs?X}K1FqLVt>XnI(7|MVpjjy|~6 zx$14BB2M*2q0cE^u-W~YF~!fTcFg2ss6=fLb15J~Ds_IwrqFO~5#j?>pd4^smgZNpa}+Ju~VtgyGe zxdUQ_qdD z&%xtX_e_X?LsGOh3PO(c8>4+EDa53gidXIAcYj8gPRAM#C6b&_1Xy9OmVRD7m=`Z< zdR_`*HrhJij>IWVpV_oP%k9k`n+HsEorK56G?4^h7$v?||K0(#roB;MO@niEd@?PQ zyv6|sN|N&W;8Zs1{r*nVeb#OStgm@$+*PTFLQc@QG>3|PHt{HQXp;jo65W(2GlWs& zPn-%DZ>T(q1-+pPqIAJePstw`<&XqHnDkB-T)A{EYn_BYr*><}p|n$Kvgg{dA(bG( zMx%Z-+_}FqK5kSz!5;sW0uk+ufUF2{5YEd$ z9|lcSl(1K?4>5;KtH-U)2>T~4)%XN=tnV1?#1&1@!soB1tH<$+0d{KqVG~Px29Ex# zX22nADL|+)C<-kc@Z?up<{FiJTpq3BcA9TL1$)k|?ZkUPd)q5WxK4pNo@D z-7o8-c{brgEUQG?zps7ywnF+0Jk$U`TIt2JXY_HEg30KgESa1Om{0@hv*I>XP|4uM ztoV%%0huC6kC}mYH#2~(@9>UKoN^}LgAs?7sl#6@QLCHRdZB*QCDJa#oNKs;qWM?V`%EV2W|6E znRwaZC&!s~|0gdUAiE0*5r83rQ5dU^l45ZhQqAZS0@a;6Lko9&lOGx=&AxwKDV~7mhYN8Ca9McXEPKdb}6< zqX=;@Zt?+8orh|U zy@RLXVoeX~#&|w$K}LQXNO>qG`A%Y3zX@dP@$R>kQYQT zhG8ptI8&VI_gcH&cR7Hiw5tI(~tHGn;}{F1oYzt7-|m<>7RRd+cs z_F_x+BZvc)JZ3DULu<vJ55p*Vbbk(j8d z7+Nb1kXXxO9vdxO>`1t?U4O!+m60Zx^AA%vgZP|##Q4dt(gnY8(Y+seM4B%H{T_hv zkDzZ2_d0G!^97#PNuFB)uuwKu6YxO%H6Q|aFF@p}eDkvBT=@|(`$!COFGs6nqz^NF zAa^kcD_50>;A~3iiPvQj2cLP_Pe3lDO%3MEY4Q4|g86`8(Nd|%uxr!A=dbcqcpi~S z1dz|6%ZCca3o`~=S*|(hJ%M5`0h|P|KKj>(fk9y+F`pG4|4BW)4$)1A|c= zVOkT&DqxR4AJs};UI*64b|EoAGtr7)I?J#wc=B>M**VMoy&Vb{1#*yr6CY)dgd_fJ zg-^(iR9{uNU{mb-?h-_#t=N{i1rGBYORi4THSZ zb&|nRdwccF`~!sL$Ogtqd>servKHw!SfDQhha6#Lwx`;^quwjmEq`$ z=37Gt|K=M6a))@2fSCka$BBAO7=!B>z}OivNIEoUD2nbND=l*5<=LZ*lorvRh8l@5 z`=E_&(k9*%bYo^*>F>y~?TWeTzg&@Plq=Z&V*J9?Zf;rZNcDTx&^lrwfkbxX!hx=S zSXupXpiz!dFrUn~3Is(c#it&CKHfq|Fj(HykGplX^1fGIcPE;u8mrSbQ4&n&Uo&K% z`J~p{DX-!akSH9Bo89w6Cj{aQNQR@%MW<|bNxXrh>qhjO-X} z72JvMSLEGxHyMLlyq4Z6S3hf}9Y0(8-u&?`D|%H`EqZ}GM_aw5h`>xDMwZ?Gt z78%X(J!TeBdcDJgy_K?>ov~q#^A|vTkRb-bxf;BV7q2CEuFFqk{w`(rrxi72|5qMo zgoX6)KB(!REsej93fj86YH=o$%HS9Cm)mUJq>py3`Puatb}n2!9IAA^(y)Nv`LOUy zOyU=g(Fcorm-8mIZFe>)#Va;J{fU{^mG`<&1rwMguz>;7v_~0>mij>!BfU3cbE=g(lZitL~ zyy*`2V|_JN8`Q68rV-M%Qf`o>rbNbt?t3lSR3E{NC!?9DXl)u&GnkE7D!?v{EL)!A zf~}lN z1uCn)FbHybin+xevAplw`#ALnPUX{@RXihAXI1x`h#pJU7H~RQ904P&$od(va?9)i zu_u$uk{HJs>ahwollf8Rz9_5?z6=l${8QrLu!trM+cF1wLj=la2ip=O0Sf@%mi|hc`T9FsG zER`qJ%W%_(HGF9WEciKTX&O%@DX|MvPo0T=oZ^zz^Q_+Rkk?610rLnaXPDW7eMdcD zw(r#Z>`)dyvC}59UGtPFDdb2*)YLQhxQmhS8MU>rVpnc zh%aV$NNHv&TCv6g3~wb05>GYCl#vg8-BH7q$`dclXGW>?_=#jo1R! z03-@4OGj#UYW8QXOWy}wC+-_7W(YFxM-iRUD>4E>L@5`F7m4WOtNh3!aeI#@c3Oq0 zWNC+U_S!|d%3E6*^v@JYQ-#FC;nXS$QLj1mprGY|!mM0-ABKw^$Q$8Dy`u>hGGne*=Ko8vDJNH%g7JK zQE(4k(I|cB6~}Ly=ydIL0xmH8wb(7E-kLng!rKiYDBp&~4)G4>%J-qs>Jnl39n{Fo zOjVHVoMH(ykLJ?+$mBC3#CJWO8-DAGLMXs?9xD7-nBR0vOH1I1jG0VJ@*pi?{kw5& z%}EaI3qBtG8|gQ+;x`T3X_v2o1Zv)Uid~uJc&F>%5^V0XvdtDaS(219>DC{^3zeKJnpC?!sj6*C(0oquOcb`>H$X zhbq`)c1lc4`#l&KVOLU(={F0%UdrZ(5RFz9Agp*f>NlH`&`~LO@j`>%%9ssmFR{z) z&x?9%1EwB1-Yx48r?@6)^_jBjN2K&I4mQ64EFo%o;*Jd1x*V04vqpWK$}r$DW%)Me|{CY+l^e=Z>!9&Q7_>|92k9ndUM=;_8gE(>M3Ma zL$;QN#fwxqt7)NJfDtr+$m_9IUbsrk>)o*J5$6308x~1Ry*-~T>6U7ol_X50flv-~ zPBEhiF8uZV8xW|e;sq@fxn2)mImL8aSALf}%`0|r1?}Se!zcLZ_zohtPUg;FlE-Mt zw~UVE8u37!`>f>jOPxQni4AGC5`86^A?F4Rk)zxzXXHo3-Ip#x6w1EKZcIEg^NLn+ z@6hgNS>UlW&%6%t8(pa2`X(M93JVH($L;N5W+|TUM4@$v^vk#Dfk%MCrETN3(+3S9 zAbld;;IDsuFRCXR7U;WWrcqvY_nRfBx_@n$4CTUCvGaOaKS)|2VebY!4Ku@Vm;laAu(>p9G6A?PLopiPIP>%3mWDMIEWK!!P-Y6Sc#x;9A^s zXTt8+e4=`|8b}C=o=*Kn4!PR;^nEmgoafSXYzQ$bRN60cvr_%PE=*7BzN$vz7=yLvlsu(xg4p` zFAwMnNQ%cNTA$%-nwh+cm*C^j6gnYNtU_CjhZ!A>>)#o)UEn^D`e zpnkCtSEc4);kY!zqY5*~WhfOV!syLDmrMLUvsd}j#4oS%($CkTGEYEJb5ft?}F+?Y!jKhxG8u<{A~8YzwusO9Y%06b&fh4_2ZtC+cQX zS0(3~#_G_A#{uB@rI`Cv+MXW+OxxS3*j0Q}2FDL#pGK5V$C_2~RfxdRU*5gw(N3Gp zGwtAfj!26h@q;Qt|JVJ`c)9=>%zEiPrcbIs-ko_7ES>`rK8s%rK9fLvq>#gEC@n~smc`@j8aR_C&kR0Bjm0-aN}ju5LSalsImG%VO? zGkTJjEDq8Sp{+@O1-G{tWs&Y*%#3Rf#x;fC=%BP^cfWNpjNL zDRjGXw3X1>0^#g%w+o#E>X4-^bjH3lfff~gFrT7v_M1tePauvh2XR2BB8aY^)%meKORjF_4PuPmVc1#$BEY8{d`gn8dq#>0ZlA%9Q?k}ZZ(=F*5MFG>l3c7)$(h~$5P0LIcIOpSV!f! z=@5X}H2kH{FVLM)!X7E{di@4Tvfpxr4ZVqZf1WAk>q*AO#&LpQPs`s7`=(a30qtZp zTYVK3xYhy{(Eh9u0gRXpsh@h~-bufdZ*Np>)<3xJs=mgraq(7UiSPk&w)rZh&koIR65@Y7~fOD-%RCQMZ*sr`q`{XvTmf<1ED8x zskrCHw=^>Lzk3Q`nEF|_d^;!Si?DIqM`~v~@sbvkUED9~cRntU2M6Gq3zmHqA;7dF=pQLKb%?-Rif=9TU# zV;)*XPNnZBeoCc=PUN#M`kT$y?zMXlwm9x@k)pgBLW#Bq0Do4NC;G<-I1&{2O#GVF zYxmk>uck4|;lH6WB2*08Q$WT1s(~a_VuB0}6HgT{Y#mVp)Wn4HJ-G+WEl(;fHk4K$ zJb$#dMoiN_7SJ_vdUI73iGvEI$EX^j;Ew2RtXv7*j|W-}<5`Luhy&jo9m5P>&=|2? zG3!{f)n5cWrYtAe?yo}-z^9Za470vseGWRLm&-G-7T08fNm{Kz780^UjrW)h*RuNj zj8)9MKIDIp2~G)uuAGzOronQxNRp<0lGl%01*@&rnQDx)TUgs3sr*|1Nt(BsNwI5p zhV8OaNW>?gj-}(FUMIi|yVQ+F%Kg5(Fi@C*9c=#MBOfn8cMzhi82q&o-9$ba-Egei z{B`zw^}KOGo*)|Y6TWX#m@mYSA13VMXMr8g74}GZhE3$3_~~yt^^c&p%A>YA9=Or* zKdvjpt^N3E<=3|X3%NEcbu97{<(the9g5d-eo_o6Q|mGN|6<+yjjdaDCK)j${LiL6 zt1ox^;Rsa0(w(t@fD}_kQ$H910*tmDZ6BSt{f5y)1E=gdOKhtI6t3erenA4yO}}!l z`i4sC6@cALfdyFSh5mE=vR+E2!=%7AC4=$4I^Lsvr30@^PrN$n{5{(IZX^ssbwIwb zVncV?^Vy%B3LB=T91fj`TKb+V;RMY(u(J=Q`Qg&hOPSp7qCNfyHr9pIsCa`RzTO zAl|k3`f*~H%b8QLxYbsRn20BZ@zNCi`)ma7|Hc<&Kb-4E^4(}|tx_cl+1>@2pI_Ni zXm`L6cS&v}T5SV*zyCW-3w|t9|9Q!jRyv)9#Pm5JLfN!3GoaIafPHr%=P^t?4_ zyXwF{-o1V9xcmj(V(_T`Ar*VhwJ7G!n!#Q10A7+Nzx^#{X-9K?#KFnN9XC7T11&k? z71iLqf8@nK2KG>h&~S&v?X-cf_JTrz4~;Wpkm8HwdK=j>TnTsDgp#xA>YFmdK;f{C+|k$$$Krwx!514 zYEBAy;h5qx=4ZzJ3jZcWI%%n<4C~DP4H)TjgYfl}tP2PAn914dY1l?rn*4a_h{ zP4^E-ouxi2<@s)@?(m>L*H}D1L;q|i7PT{EZ6&1yg+n!#hw#H6Q4h*mk7dliW}t39 z*%;ZKhnwH8GY9oLKIUuZjK44v`0e#ouEYI+ z<%%q*Ip`0A00>F_u0_R^zGcMZ0y;^I@2$4lSur_0r$WT7XrN3ME?=`NIeXl@2i{wY z(1;goc(iWkz1nbUZ(g`Z>z4TZjH2S|?DvPbg`IJ6pe%W?Y_4L|R{yDf{N0xDBT^(c z;@HVpv=Yc2uJHA&Fu$yIy}f4-i1yzyt_@2q$Is|@vrr+s+gDS%osbB#B9y? zwHc?)U+)j<@~f(j?9#V|%2Es6QSiDPyaka@s-Q6AQIi(1J!B``Y81Wxg}dg)qySoI zVSF5ft{QKKFTjhRo5aSP@)~xsdBAAd|ElS$m(==NE6XsjBMU&3y(dpHLUqDp4-n#T z?a>skaQ%5AS2tU4Ol8F~c_94?Xjt%F5dO|I*~Bt8Z75fM)I}9nGzE3}92x!>q~K^+ zw;yPuTa3RGxhD1MvSV)tQ8zEwA!pF>}?XWAVZHN^}kjW9U?q``o+buJAQMS zj+8H>Z>$g4H3N&k7KpiA4VLH{vtP6KkR7)JXw@XMX`(zT^FaHk;0F7+2s-k|eqXj- z;~ncz32JPhd`&A}3EK=3~H?}z6=M`*Ye zwd3xYJw*W2PtFP5o3toL1XEBt42F&PF$W6bNpSx|jBr$-eY$oO6x2GYKV&T`9e=2w8D z`JW754)_GBq#+Y@GxR>_U?ST?dz_1 z1I*Ktl@rIUfnZ@w^7=3Nz#}ev=?4Yh>eKia>g_Mh9rm|?-Btm+r84(yWB{NIUif6Gb-s|w&HI@>f8+{upanPTnmH79} zn)1E+jV}2#V#SYb{8he8&vN#B#+ORk41B^TqPo}lOzpjwN^I0)?^CGt?`K3xUHTu0 z=K|hcr=CPFOINYBSQ2NLZ^kVB)DMI+1fMw&tfW_}?|@oYVXAC^%H3YFe;LS2tqIiO z@3^3ys__m3T$_B=>N(-mR5z84Pd$ycTzeNnn=tkVtk-s;4I;<2jbFPPIR`IOg9jKyWZ|^tc#;^5&CKEeI^0>LDrqAEKzZvMJzb<^CejfC^g79P2{}sm}2={lNnOw=q<{`&(G2 zv1-54@!&n({wtpi?@y8u{y5DJ_-b$Nr|ECPhPb+&npO3wjrYw|dR|B47$A-$|l{-uKb!q$%sw-BboV;eQ+&O6{0~aTddX;N}9x z5aV-eLc?$;OXH$;!z(gSx`l)0c)VIUtsY2s{*z$2u>tRYEKvK)>vJ70tb+Tb4U?4b zlGx1@Rvbfha;NC{@9hrf0lv#G&xzO!01~*EQ`C9sc8Abk`$JNa!b)7HpX;KQWum!T zVON??KB541Vp{=|BTj#h{$bnStXEqUbMZz3NNk3^2P_`wj_Ny~xTNp%3VSiPMQ z{n47FnPdYf=471WanHz~IO|LK?&{eaWlZ(4d?NHMg3M&+CDly)&tI`fMYQmcywx==U6qmeJ@DK`5G&V@n#@Q0ME0+p-#! zpL)oCEW7>L2(}wwBY@oL&opfvm(X+FhQVdAWVqQoe8Q#sdu3N`ihG3meaflZq85$t zB-wyc5aP10u>bscJYZmZ=~6HNyj4tIy*Hs&uz9Jkk^##mMe6)Qdy7TM_o^LZL8aSJ zrX-tDW?(VxkZgtJxG&&Oc&7}4LE6P+(}UrRD7ksB0;^s=7TbqG75GSr3{O~R3?B`T zchwR}T9N16ttwEJTB<)maolF|*T1JA|MuyX{j6! zxjOmc?`VD5(-{@jV|m@4Ba(=(8Z`8s3E!AW;*k)V&H{DUjZ^iqqwZ0q?U6FV_{QTl zfq#byAQlynJD69M=u{W9Im=Q)WeIMHfEpyuiEtGaW*V0{doiDj`}h28AB`^{A-OK& zwfv!xh=zp@Vhk_WR^7SVyF8o7L zgHdS4$w$`$?;;MQ__dFO5-$@ne$XOvWC0=iFi1ED*-lsO{*p_;Qk-CN-w)+g{jP#H z%qGlyJL=}ZvnN3z^}moh1Tm$$J?A2?ej#wA;cl1gd|C3c-|rB zW)_v(xql3G;=vKk57=2g$M++v)lqlHom{dxVdN)4xL2DpWSO)SdA zd&F(h@^I8=yd*)ymTh~XfX)PJLO8OTI=FMqmY($7o9OC@{r5T@Z_?Cuv}LI48&{}og7t^qWLp`xGAE&m z@Uo$3Nm8>IErqC?7ysO?0s%^={NdmtIO!-hoI@p|wk%q>igk5@Fct`28fQDn#Rk&D zGtw70sN=<)5=}vNQMz2YFa-K?MdaN`)u+@%xS=il#^IV)ba#371u3W}cMKEI^9t%H zr|xdlc&T1Pf$kCPY6h}lJeiPgA((uUyWHWb(%B`k2OxXjPg|5x|Ag}e`DXZJ(qd8UKG+YY$r;TYHo30?u?mV)% ziF-9>NrK5{Zh5`u61?>lZ;6aV68-&K0Q(rwTfaTnn(X4`ivq&Bi%K&%j=&09pWk!4 z?k$xK1FueT8=vdR(o&UqS-87c)Ky9@K2q>z`*Ntl3xo+s4YxryP-P{{Vr?=4+N9KP zHF59>de})2?gxRUfsI_yNI&+;y+?CqO)bqT7g&mbqRRl%Djzv#d zw;c%NSxswK8%g=4H{8IvM{b50e3KgOUg81p87EK+x8Mr!P;?a}N4!*?=nxc)X2e^mwdtz z@1=IR-R5>by)(R7$?g$MASj;uhAJRDrK4`%pJSN7E$=i`{Ka6a3P8LNsnbN?$#K1} zcomES2_o5VCLv*;*VwVJg`_CPc;rr$tPLbVFM>r9HQe9YD+FS7es`oe$T2qHwL3K{ z3Cie&{@f%N1C^z&V4LMf#eiqVxKV4ifj=Z5z+kw+JrYGzb%gU?pUuzeu(iB>1Z#etnsHc~M6=?_`JOZWD!k zI|4mQaN+xPzNxFr(s|NqiMt{Rpn;l?^GB1?wA%G?01a$wHn8Ho>3%dV1d2; z-c+^tB8YcOx41c`a<_@)z}z9XBz9{7>yjyT`b~7mYtf5u4}hsTNpJP))F{S-h#NF3 zJzfZokaRfId7i|)qk7l8e&NKEoCE5^j|TH9#^MCvgk$8;=2;5(c{TIjn{(&%zwNEm zjW0-SkB={ocyx@Es;E5${eQABZ@*&U;JcmsQpFdXD_2nQ-H&fl*}(t}{esxn)idP$ zQJcYGRB{3AFov8_q8mEVX5^`rMtN5PbCi9d&_U7%xF0;sZMd}`NzI2t4*8=T2jCza z$}KG!fq6rT>u?E<-rZk6rxy52y9j;IGothBjdsMg4Cso+&c2Cm-+wMBz1G~AV!tu4 z!2dbNg~xd^+wJn#qmm0?qzWp(RzS~*D9eZDC$$BKImy#!5F8If0@rCN@RJW%w#BkR zw6n=M_=pFM7#UxdY`6OKcf84^LKRF9PuvLCY56*L#wmQFmfc(9+xTecsn?jfL&tl5 z2d#xAZ0n1~olbOplxp5up5*r9leO6Nw$F{nSvs3{x-puP{=(KS8XVO%a{#@y*?Z+bZ)}4y z!SD+DFo5CmUG35QE+W>6r26dqTKl17GoHfywcz~)R2RN#B9v5E@5ZCUHi5coRoqJD zLSAjwRW#*8GD6v>a=+5=RYwHTUv4u={j71h349TqXlPuqdoDiO+fMYzH407Ya{;qe zk{`rJBbw<-8p#z?uRZ(jf)D@I@j;im{qu5~71U2bg{D*D$CL1=FhYg&^Dy~?wWy^i zH2%(~rMHQ}mn6jtelHM*i0#dfpO#+KR@F~Ffw@lo?A81OdHk!Vpha>4XX1R_ z0Nq&p?aJdf&oCQqWh9PVyBY8@X7eF?QFMSo4 zvQX?tkL$#F>YN0b&$$8;(ft;Ic49w|BqV8HqU>5T4Hwm~y+Q-vWyLq)R^;E_np8NY zfWzuf&#PR;>XvtEj&i+p3EoJeP3cmle8-J3;w1Pm%{b;0%esqSNE17EO776~(KQ40 z#Z6OI!k`;5&yBR+1<~#l`g~bxrxV!jW8Z(N4*Ed(3#+%O_dc%s{CcLp);G+u|LaII@g)s)ctd*Wa=?$L;=)rXEh6hBisrgtii?zY;e`8|(b7>}HA0}Be!G!$ z=3|YxrHY9NG9*kMd9y*wmeT9y`S#zN7X#O=<4kP;6pL{hzUFvP51+m73pkr~W6p2S zKKJn=aAtPqdt6e`4+b0VWNkF)5%$nf!HHj5SKYU5r~RRO% zX0==kkFm~DM=Va1_nuA#-h%fKoC{I2^^!Q`XMbbCC zw_f6Cy1BRv={PrOPj~A}?t6Nu7JO73A7#nY-X6tjBsJ~~+J-fG`4vS~{Q{g#geq{} z{R%$}!v=pTKh;8y;{ATfuTM*M>-MLmYlO(q>+*6$hU*W7GC*wR+Nc8ujJ}98*nT@u zDLcdhIng$MQsh{G$j!3V%O8>{yUe{hQqzU#x!N;+r z(|H*Q0j12O%Cy{bsziU$l~&MMFf0n>7W=p=w%SZL&~P?c!&P#HL-@e#8nm#seN6-i zfJ+Do83MU@z0d@4*?+oxeg%+@KL+TtRTmWENG&zML;EFG4R*?~n5#x##z+h}wR<)C zdc5%xj5B~L9}L4Sr8E<$ZdFm#M65!dNq+@N8cs%khc^op+lot8YY6{wBpG!HgFheJ z?d7bJlYalp>)wNq9Y)ciACLfph?xiaaRq>(G~{n>R6J<2^)w6*dwMmYwWOIX-v3!1 zN|$U>LP0@2tmY`~LQ3)AiQ1j1FKvKUFGTU{)C+D+_o!{RM_OcO3Xc8VNO9695|!W$ zn&P5q&J|^XkjwUp_CnQi3LB}e92LFsw6MFJR_5eLN~FM1X^lgXv%ghY3k~B$ff(Lc zZZZ~6GLv;HK~0rZ4T&eGW@MmNIWZD>3Pe;7A6X3~4M@_eX89V5bZg*dmaewDae~!$hW#D;;8U z)DA~FE)InT;}_^Pa&iA47I|~6;t$u=oZGsil%%J!zAg~%CI&fg>$p`+4I1aq3|E2> zAhC#nB^3+AZQk|1+R773b%pMxOMq0lS|#|Ey+4YxL?Pp*$h2!^SgJKgui=C?l7^!Ti|60ur?VYF-EXm zwn-kg-K49F?%;oRpBh*BQP!q}FRElyqNM044EnS};y{?T=kKm4>@lZ~osdyo)U%WP zaWrX}pU>%t!XBu9ME9IBWis{fT2aUSUsL-)KA0--?>+aBxr0EA;(3NClgrEVjBTzQ zis9G+aF+Hek#AR(pzd%NJUj$^S1gITd7CdxY7j(eG)l5SLf z+x>`|O!8D?7W{&@Cfy$0$HT%hep@+-Pxd9S4fI4=rBA$~A4R6Nw``E-rj4X~o%q2| zHujd*DQ2>*s8^Hn>E4KA!rMS9MK*S@?zQ@2D?FHu>#m0*;|tpSZu#iGa42m~r4s65 z52?$E;!>9JAzeNH1yyF_I)VW>hE_6);0ScFn`so79C8O6y@eG{PJ)&MT}&)=N15mi zoo~g1cL|bd9!S5HLDYIPG`%yW0uT?g?*H$Vb z1czQ>xPLZGaWvX$;W1@AXt@(TWUeC9x}k6E(na#mtcI-HXVJ1aG=xLMUQZ9PLm=~t zt^xJu>frHPo1gt0+eyafxEav3rRZ5W5TT~$i#-6WS za{2Wxo(IeW%pXWj5 z$h|>OP0dAqidxwGMFSL@>>9dU@{)zVfW+2a`Q^5Ul_@c^vOAGYYyqD>B}MD#NK>d7 z-37y5e**ILuM6u%-=btWE)~R7ldp?rHsa~tE3cTTtD6xL0*Mh=uIp=Yhb~Jq1FWV zz6uTfsUOfCmko-YyZKQy{hnn=-pfR=q@QYBx;bbIM~sbEIwB7mHW;z?6sl6FI2-b4 z=V6fA{rKU%9JWBPc79cz<7z#)apPbsmlxw=!vmGd}egDwDN3gq_*;>T=NH|{tN}5+n=d~V5+RHF}oQ9fj z3=)$T`A3FSZj1Bu;ve(ird$1@;E<)r>Q6|n0ZLIYb4V~HE=Tm zuWVm!dO73lPzUtr{}sF3wAbDT#W@FUI#S?#^YUz}>5qAKbaktU?35qMxaLX&c+MsmseY$Jxgpo zmaU2R%>|}${BkqD$0|L%a_fBCa)=bJ9qO(v1mvSEHZ_F$2@kFL1Pt8kitCZB2T8X~ zzkVE~)X-D9Oz#V@22>^cT8Dyo0d0^r^4jIic}>148W*A;+Xt02+nf6pc`}pJ;FuG* zyZ7sH)kdKUd-?Eu!M5!WzG&GI0>mvrVPv;xFl)`FnBDj>DePGKjtHvJ`7Dl-NY#y= z5BEqKh|M@Mu1VcF<-=|Rye1AuRhHMEIm3PoKFd3p|H0Y35qx#EFi7FG_X${z{BtNh673<=?J8aHlmd5#t{- zyD+)IQmaRAoIjuesO8DzEp_xW`ni7duIDUwLoy>8`8C{qMBa*opW|mnw)ARW z>Mx?u^jhJ#<`hWdy)TsL3+0EJfF;W;ZTDxc!D_xSc`*5|tK3I2Udk{mK;(N&k3b$Y zIejFg`PJW#FGPNA)FfT$ik!ADYcUu8=uN5%<-A_+sJpz)vs~M2m@2Y<+wsW!`}qh9 z;)N6r>@qT$<(-Ipt*pHv0K4GiGQoN57Dfg9t#{W5pAvxMLfxx@g_*cdh0` z5X`Y*=36In?_JM4SLcpwb54}hSiVlSPPd)eMLxZeKu{*b%dVzPj=z?DWH?tV9~-n= zgg%pM$}PKp*G6*%^KKd){czf3AUNla;7j^F3cabcilMuhDAekQZJB4^)X) zmkn0oyZiQg)7FEQBt!exnpxe0qHsr)K0;3U1P`m>1jSkZlb?ob%O{<8)$8f=Sf8kS zLSoM%wPOgB^Ldnie>;Rdq%3L`@67K z22a>&of1igk2crEv_d0g4mTd_$MA1>zISR( z*8hIuslU<2A$qrqE*HVhJjEct^nLh(x~m;utFNA(IO#yy+BvtUe>&k?_?K1ig zY>S5oW21&~9Rx4B2-hjjRt##^+mHq$wa*h+agEah4 ztXtqki0wT9uO(CP&I9*QAmg{BFjzHH+2qZND86c~=dnniyM~=GxJj*Al5$f=S~|qp z$IfzSUS#zQ_^$fLcm`@}$(wb4p%7V+d_`*9R6VUrK;w|5ZtoIg2hs;{V0s~KXGKb0 z_NCUfssumEC~AoN6EquD_VVjmWbRQ(jwY74V87VfQrG^&S#GjR?9ND4vzmAi!$X7{ zjqW}pzcmZNEX1>8-JXoJnr_u?<;VxGRkvZ`>Fcm4XarB>YHl2X-EV zFLnKvfGe{^afyF}mgWmI#Fw-adgxh$589B)(G#4CKmB;HUM9)bDG}!@1uq(H zv4ZhCS9^7$v_f+~7LA75es{7U4?DqkzhYtX50?8Zc}qfJo8@EceyZ6ZYEYv z5BbIyS(ruDK*%@5qVvWtqXe`1L(Vcp9H4{&o+=OucIVL9@3R%}6eK`hD8#BGOdmqX z^pq#-rsH9Gb(q-U7Q$D;MLZCxrx0zO6w0CvPW6__rR=!Zlnj&J-fF=z?-o60JUA+^qwr2FI+@2M$O= zI4>CRQN!IV%075(JU>Qi9#UutfX8}ZqfP(M#Ie=u9bby!i@bA(=K^=n^({Bjs?@cK zYZ%FiuP+av)?F|^t`rK)@x?Vyn)3@~0kV$zo2|xPkOb9))o$YNG7embDSqYj7 z`|}bf^%bjkBZS8|>pu*IqiV zdUrcOKQ2=Xnbqj?^{CLyCtQu?IzageK%wWwO2KJqdcL$dw+9X%2JooOO&_&SDL4Uct-AYBFL95>9>otStp;si^ zMfG1vapGdkF`7&SN$~UCujgKCBAV4r8JN?&h0m8m64UP+`yyqP?%?3Tj8x{SqUhey z&~#k5CkmMudelvonksAJR;Ji!mpVqbuDB#lhjFHCMJVn|0HbR6d&2qAG8M*D)SgD8 zwu@Jjb#vW2w;TYYjK4rKGD{6BmQzrgLc1>; zRAp)rf+6PA8N0iYpu7Zp@Xlx9s(#pXJ?H`$Ae`Sb&>1;xu+_(^v07DzR+nN;6SF30 zI(c37@CC~w+0RSyGTZn7{Ykw=noKPk@`qBqoIE~0suz05a4{vH>KY(P;1NVU(BPRm zs~=Cy&~U6Prlo=l#I6EjdgmjK{AJqt2PQz;F#n0{DMU0fq_n+ahVoAo@jm4TtIDl! z_cUjBM*ZI64r%A~Za{$~2Z{39ds8o|pwD*r^CTWTM0`6zvv3eB>&$jX9e z9(27Z4ar1_AVb5!lF}Nf{WJsjRcQ0$^O>Su?IQ8FttavtI*Cmd>Dis%+Ei(AWW_|N z(s;S9BwP1H+!|DaSyAt)aM-m;L{NR&?0*lN)>9(yYc`kiiq^DkKwQu_j}}4TYgBtV zG8nifVzL$1Shid{^S9D++FzvgDm!D79DL6y0e8vdTeCYXw^jh8YIFQAuUK&jcnQFX z0vyWYbRpb>0aU~&CNvlCDR5d~k{ng2!CQ4Jxxst3a3kNJw5Q2pYTFTb zm7SH+J1EHIFp~tF(R1q;;x;LrOSjdeuJ>__V&PDCg$E_yTaNp9)s`XMk1kOMMGWQX z{TFjq_rfrfj0b(yuvenK0^(2Df8xDib2pXGV~@xYVf!2w5V9UaPi77k>$6Vx;aI7y zDo}aDEXoNnUz9f&Za7rjWIazj`8LYCA&^pmX^?#H!GBep2E|+oY;Z)&>kCD&H1TGt0{IQ~Ajfb05H@`&gs8|DK8-0kTK`mm?`H2*+D znf0*xBo%B<0t_bJf+jKbR|n1F!R5Y+t?M}Z^tOr-yuMaBXNgI2MiqlpUe?Lyx>L5i zzgX~Bhg(o|(Z8x+^AX1hp?_YQ=ds+2R2TNsy6Nt@cThKVt!8%>P7mfxJP-Slcxtpq z{TxZ6Hx@Mw<4iBlK<`@fKG;xmC*m@y>>S*NNQ!&dQV-CH??u1J5_ac8dhtSSV}Yl#?z*)-;%%;GMP1hL#TgXay2D_OFB7e0f3o~ebyD^ULc z3f*pwinuLvP~D

{%^E!4x~+nV4iPg<<>sKhOIT6M|kkMgu92+1R7_XvL3ds*P|(rh>q?{s zHQ0nCqs8!3+_>8DRv9Tf5nh)CDV<qa%riur*p*ECSb z=|lhHT!}00*QeHgjG7WNPJ_cH$JJ5Kj&uVSAjsuQBrNwU#~iwq=4*VyBJS(GX3hpk z*HwX~{a!9^j?C0nv)@ilp8Wxs-xy5pJ>B+#|GG$TrLJ?DxT12@Gm00b1PmB|zG^Pg z31A?jx5`!c`W7Oh%#qV$YfFLb`|L9!Pn(Q73%yOZthT%8qA)3_A*w(0l%j&^NHECm za~}DaYo7FOxt(vpuCZiD>e8qsZ!lSo3*PZ>=X9UkX=;7ubNV`#k%r2-#<&*UQYhdS zo^Rz%=c_%r(GcoB^i)v%UF5PNu#>%6w}mF$4-11-2+|tKugdN!xJ=lK=IR(C(*7+} z+g1a=QkfdMTtFcc$m)C;LeI9D&qB_<95&|#)PrP#LSx2*7zA~oizO{Xvu;6HONOAU51PMyV<$u3r131k8v&kroCpnwUV zqxE!Kkl{G2h0fx%qx{OZWsQGG&el~ zRlOBs3$OnIx7J2_c+3vq;^=MO%^JKrp5*bX+%cBZx}@oh@d`wcq%e*e_Mq&YaLn)v zvZoDrrCGbGrGJuGZow+6wU{+Xg7VVe2w*JzKwz7cm{Q<=rzS^_E;02osd5`q>Uf{@ zLJUu9W%MKpngl$U3N20>~8bCZkm(QiQw6<;CN(C#*I3w*#lhL@Et2CW~ z2y4Err_yNK^D5_mA!iu{EElNX=$QVEcr7N}sfK}&zA*AH0oJ?l)p42KsZgj^=`v>5 z>bRm_S~HpX#tbdnt?J6wMg$#I6rKg5`NFibRUx}#n+KTsNjAEsE~fRr{&zO=SvRL> zAHc}}2p&uMUd(%0i%f98PcIv2_tnZG#8d9bR%>`39(hFAc`^)_lAyn;rMRrP<8F7N z4!zRm$O_r89Wl9sW4Wkjk^VEh=~8#veQbAq4=*r;Kzr4i0SprXrG@m(#Eg$*r7Jfm zy}8rd*qt@|leBpFP<3dt*V=NrK?w%9fk%xr$$7h^ngW+|6GXX5rBw}ZdIYr zg~rqa9IwPcml;=q;4zh>1Pv?MKxX#yRzRHJ{$tMEfz_Md3qDf5*->nF5g==Q zi`Zspx2}jFEa-fC(I>2U^m>V%w%&*ygY8pWU15$@fJ;>6+h;A1uXi3szc5>9UVDt8 zR**WpxS;Z4*--BFYxwus>X(9bMk|Mt=RiIcZdl!6lVl<2Db)YX*l3ka2W-I3F9Bf> z44+ZkDps5YdC4qx5ygxT#jSmzAU_M zpZ7TVHV+lic*+N3w|Jgci`+9plSPRQY{}DqoM%22!Y<ah3Wgt+6=%i6MtvL^$@VQ`iW5JA7z7d)<6C^{N4W-%57DKI_-5@ zCABXU*BZ5=`?$k!V(9bqwO7FhKrY+XIVxSVU~&$`c@p!ZB=Uag9}g9E*Epw-xWF9( zC|ipC3W62uSF6v_2i7ImB$vtOEQ~XdmC=0-t=G&W!PgOjV7kxaRB37dcwh`|2FMNv zCK6MRKFf30S@vcea1dD>F06~HCLLouRIWjUfb{-qz-!x0 zjZ0Di7|NBFcHUtCQMmaw>q#z8l?XnrCMWZCU;}ECqiy;!MFiD-`Y%wazHWX})$hRB zfrnUsnVx;J;~?u~n#Sl;XxJE2IkpF@XAT)rz$`B>&absrfG(!Ab<6?+@k#1*_;~Pn zpV6nk7qanEBorF14D5DAUYEH-FAi219~<}XkA@FJR*G*(>wA}$^#S=s!#MjF^bI0u zR&}$yw1N5Rl!g*XtS;ZFCEnw)&KKJday`6EHfo<|r+X29)kjnGBoaH{AWWj~OI%u1 zmA_;FZQPI=$N8DAZ=UVH-f1wp7NWX=l@&XDwDl&_+DcSa;1x+xo?63B*}*UUD=cHS z+6Sl(2c^)}m!38GSP{BIjEbmFjOU5AG7EDC*5N>8@8fWKe$CYDbQvCEf=EgQna60$ zv&1uqAr$m!_>H>#3i*GC=~Iw!lM@lKjdqktAoNX%X^|<-jA|DLi_%Nv(-{ZNC$BlS zhxqCyFg_Qkxx~L-N>3b`_9{mrK9j!KRXD#H-4^7r|ARDR>I<7%Uw%u13K?1u?U5Jv zl6lb!LVxL_p+zZvzw1L=D>B6d+A=-YV0berV$;6ljb*Gy_tW?u+q~r74)q`zfuNTp z7$6F*nbtM5rY@5xw4AQAq`SBoLfSGe34MMs=hkxjO#1rqtoOUBkXwVfYW@2Q7o(5U zWHN8#roJ~9anBb^Y<%+ic>GjB`szD3_xz*zEv*#xN8|ijut0P%P#YwBKFO|cHcB?w z986ba$1_)y!QlnnWL5PRpfle6CQ&(U8znKc`!96m@k0kaPqNj4fI&^>a@?Soji>Ir zNoQj_!*4?xL|Oo>_3lY;fyhMZ0#Sm(Ji({-kA&89UjB^_xK|2PI#OL0r)_=_z5ekq z=i7%{ah82&ho@s_8CQU&Ws}-q5O92uSF9@I_xYRnHW$dRH&S@w$6jLK79tLE9TA`I zI>QLm1f;`#@7AMUp4op~9Qg!gE=n?8=0gq1Pgy1pevaVnlqW8b%|?(3i^ju+k8Pku;;ACKD}u)9kGNmRaOYng!$H2lvm z*a7OB-q537YmT7~Fmb>NjP?(|qc z*Jm>L72EbmcCjlJ(aZP`j^iFeS8(Vg^b@evvE%qTF49?QA6!Oc6>j66N7bn>kE^hc zyHk7@8_-5omSWW_6QB-=iAWiMiT5zj_hf5xx`}5!{yuzP)V|c1C+MXiVhvJAMETYn zGHrte=oG`yoW@^1U^VZ)7yEnugia?M=VxoI->(rXU(i}mI-99yxFkpUi-4|Qc74yH zchZz@-dVd6d-~eNUUTO$pI`dRFf(T=>I%e1x%u>84eW3?vfLE+%MxqKiezG{E{4M) zn9(^?>CV6ao1PP%u*$<7vKYp?t;A9duna~RSc@M{o$G7lGYqTpU0ZV3FD^<2Z$E2r zn^3-LVff5#{VV$3;3i9`s^X{n1b2Tmu!Jtu(Fu(7axa*Z^Qelk#b~(djS3&@9Rx_L z+t=A2Oqkl2fwtua5+*RUFd6vz8a}qLV|u-D4RZo2OjXz!^)q=#rhwD$`=EMWvi+Dh zGdJUABR`DV`V15EOHpH*&U>iw8W;0$qRJA%dLmcHC{ktvh=L-)X}b@1lSLHT^QeGb zDoZ_nf1*n3pBc)K5ptPK0vwfMea$8NR0k0n#PQ-!|EJIn=hg3{Jxm)rw;zb!!L1-h z1iV%INHCi6bjwLa)F>GGOP(@4p)6@o0lrXE$Rri8!7La;D|;dzg$e4}kn?k)xR1NW z^T^xznX*S0b;v=G;1UB+OVwV)v=KXC<R$5utpg+mb71({hA8{)7b^p?`H@=)U$uf~kn*)NHHW7v+iJxh67^ho zGG34OYpo$31e7Jv>y|qyg$65p(at5`)i*m)nw*DFQP@H*gMc2zAI1ghe!NU~t3EFiUa1p*egO$a4hxp)mDm zyDG=|#tDc;LfJxK)2{cwQwDe&7!CUxSE_6=LYekz@w`yCD0uD!^Ygiq1CZ{?;xBLT zt|>aqirm)u_KZb|@{~FVMdB@PetohGpnE;Lb|>`JbjDO3$+SV%`MfAHV4Bqsx8mNv zi_yR7;XEegVCJ6||C{Q3u6E4dig!<4R~3O$;87CO1NriUh)-{7NEBox%L0Gi%(6g- z56_wtd#^L9Q=TAJLRx|eL_~)b8i8-YTt|BSAM08FpQW_Sc9VR!6~p~)e=r6a5QFcL z5q~%+TB$P^1HJLr$J!7#>hOh3Zra&aQ>$K-nY4C=g%fQA1t#`236t1t?55r9o(R=` zP_6ZEZk-eEm#th=MZQ;5LHQ|aWi@1iG3+#&{Rx^3@hi+4jkuWgXa4o8_?9HoGy=x? zz#V&(v1_&pktAA%vy5|Huk53#bVPfS`ualowb^KPp*t>HOJ9BbX(XyU5&;;XT3!Zxr&{H z3`&>GIaro7dccX_%;KgnI-UjSI5h`7vSd;h4m1iZe$PryPq$M>wGVRypA z9kiD9h@Eo%??78q^U(f481ZpeBGfN%m?(uoz#!n@*AG3y(9bgF`2MBaZt&j84yuH< zjLFD4uYX18D7D+O(tCH~^_iLWqcn?wT7vKAhttcA$Gdzca+w2opxRvVhceBbYC@r- z2iif(1$|D*6&%N|{ZdO8K28TP!M$qjvx@`1e)cIiWn=Tjq`37zd>(bN5jJ{l`8%wu5Y>6ybH72!v{X?4A7nJCCu`=5?z>{Gi7%f;* zdp`X0#nXP*DYeR8FHL-8dTIYH&uS;Z7F6ZS@{B=g+uF#g4}z{IPwr#>G)0#Hg09_I zZe&SXMVHWHyY#S4orpv2b|4d0PFVS1CjIInskBp}O*;1CfXQktOucMV=_ejvG2i04 zPh(5r`^I&*i|hWAtF@o#s2uX6QxDVUMZg{6`;WInKMoV8$J~8PP443o=};R~u<#9> z&3oxW6X5#bIB~eOs<#c}4~UEkPxL!!eeTE|jp~&zyd3E9J5WP20W}?%XRyqoQOk;Q zYN4hnQA}+3?WT;RHw2I*ON+i#%C!-%WJByAf0DR|oke>q)DCtix0UV}uIwI+-{s4_Qy|UEna=VzU3gBKXGuQ!F!a-Pyt-h$79P3G zjUZLLK9Qx12epjMdG?yt>zBY502p&m8MV$qw}JZR8=pcQA;M_Z$>guhq;aJc0B4~TE*{e4FO@6auE2#SZJyVn)cfG&pGf3eIU?#|UD;R2YM1csq+9RD2HuMq@?4C@Y3WG96BQZ*3<-E zB5ifMJ+Kk^XNPEm_|yj9LY;P``Iyqg<_~2x0fw(N*RL!jZM%=VQ@% zbZSpC`eHwrcNFX&gTW}|irF&Lk%xZ&7@}Zfx+x&~sMmmLF{yW*VwdeluoBs#Z7~_n zH1`;wv;3wQ8~`!f5y(FC6OMDN7<=l|`N+jxBfOJ%m=>JADQ07Ipx+AP%0`<4#0 zC4VZB#{L!VGq$7rb&41BoDNM61YRL(pmSNc()Jes~=Q;g)soL?Bga z`0ENK(;EhaNOSK0LUI$gvV6FKdql%kB;TaBp$weEau&ztX&^G9j&skza4Nxhj@0JX zzRz<3S3^MVagVQW9_Ru^E`1!Xdk99|F_)u*qAHkNNLtMeuc2VKc4}txzy5Z zGhE6K8mf`g4{it!t;s^E+A&QB$_x^pxo^TSDQ40OFsaj0D*Vr+u_!ON)hczfq_x`} z^%DhO_Q~e$dNRlC-~ib3R~IU~94=zmt-*+IPJL)Cp0>fCssnAur!{ywdmRgtW!i{^ zvf3nUy_TZ&L^w~ILka@XM0ffgViyhva_^u3L|W+`6StYSMyXXB6ZS37AlxYWhs$woM39yIxJ0W8ZBqlNb$!6LF<2pVsfsS{p+?(k5NR z{*T&EPW^(4fV#3~`OMsZL3GIfcA@~ZItBQT|ec`z3aISV!hhk0Z|7$b#dQ%u)gnBK z=;tpkFI&kkfMl;SE~yS{Wfy_>_g3IE(wbbR`8tp-bd?!A($+!KRXOW}IR)A|`~z1J zC>}83g*8L&SqH}eL~}{27E=c&6!TY;ExeSQSH4d5O)dkweeRox3GvpOA@)(@*o~)qu}`zhEIP z*Cj<@5w4(MeyqS>D2S}V?kSABFsB#$rbovBZy5vWlU6{K{ZXMBk}P-6JCjLMF5`_c zeiPW-rMMXZG*yo^)^yNzt{BjY$jav0WOpgvkH9GG+u4F(GxNGoC^79)oUv^jq zqn`)48Gu{Lyp5+U4nk#xBhaS>_cgllp}WIOk9dNCe~ea>XG~tH->If;q6y10u266c z$57hL8Kj6+mEZE#zL99+X?Q5?+WnQTAdv-qC7MdOwW0WQ)H#<85e@wg<1#N-dQ%N^SWu>p4z}KE{)ZQ6>LP8yIj*^sNbRe>y65y zbI}l2NT(O(@}HQ$W~ud2CMd96@%%Hllf*-h7h1VYFVbBbcL?SlTOtzbtu)CHK zLl#>iCvKwY{#rABPQ7++_|*Qa$`ctG5o`J2ar6p;T#MgEAWwUd1%*G%n&Y?6JB)!B zf_!|2Np!QK?oT65zwxDCr=<6V|6GlyqkHV5g&k&W zs7TXq+#q?X^iozw`0rF6_nYO)r7g=z!gqxK?f<{TadSl19U(FLHIcsGld02gA8Pd62)Z~9qPziM7BeYxsg&o}CJOsZ4gb`1Hh zHEHi1?AQK^uPm?><-3m&f-6cRldJ9GPuCK=lJn?SpwjN7L4S#F)3IE}B^fz#`%gXJ zlrG5~w@5XaOnUrI*k(90Twm$8p=`V8e=&(3PuWp9DlgioLatC>unzFFe4YjLz^*{y zsVDmaME@t$n~M;;dEa+5WvUnb9-z7D0SsOP*0@FN?WFMY!9Z4Vz-IfX#;F>O!FX+b zSFoFj&A@IlA~vPW>{kdhdT&6;jqF_ETbyq4Z6O`i)K}#h+0bE7sOIAp2kJ%_j=7!D zR_-}A1Sw3L2TOZzXYyBrgJoMS6&6c!9-#f|qV7g_6gHp5yA`L?ma*f`2+x}@PCh-G z8WmmqgaZve;5SjY5%d5b2y?cA2s>Clh%xdM&0o|Nnwf$Gb*bI`>IceD(9ST>ar}Z04XzgkZTo-^=+- zn!_6Pb@@v&!wNYsrR##vhT%~=y>KTjjgB1{<2DIW>oPDTj-c#nQHBfwLza%d@{a&( z!2F?&ASj0JU)kO!CgYlK4|w=DoVI9jv`byrQphmd1tpr2Y#hVTp5qD&$46N34|s8? z0nx%N2mRG12AKAm9;LuBM{!xg*u8{}a5S3Dm&rV*Wf7jSZ>JtpaE0+n>RD(l2J+7PyA3)Q>4PJPM(|G60T4@`NWBjNAO4cPeC69H zn9ri^pCxX^(L*QU`CcQ^YcyNQ7xYtW?5RaX6jYg z6{QNBTgBzQj?#xUA1hBQ>U*l+yJHlZ?FC@G0!oJBSh0=?!k| zQ1QzVg%Am+H6atPG-0z3)h9#okTt*myZR(l9?J0Lu7CMxkRS;TNE6+DaBpY~cwukD zeXw7WtM-Fng5=6=+lA&1)3B-gwhP8r+eIDeiBcUKnpLMdiQ!|TD*dDC{bP$I zhIeUVxYgg3-Uo@6fb+2I=)9Lof@D?Z;F$AO3J0h*v6(|M5tYZM#qDl`N#ZR|X=1?| z2<-52Lr&79AT+smtqNO%Y53y^4uMl(bR}xz`i;NZSWcp{koEet@eiE;7LO5Ep8ns3 z>sgC$NP8=`?289E%V3IpIa3t$%_(lsDv?1UD)ZZ)t-K8woNBrc_SpKrQ=Il!ZAff%f%hHZ6;5H=Pp~+AU3F*tt$4?PWZ~U=cif|9xKBncFE7ai!oyF z7ewW7%0r3#s1KKl_dw!9{w1|7`r$wKuAwFa_A(lMxbn9U zDs&aKYzA>)_yGvKM@=BEd*CTJJ+y+YUV2x*2h)Wb#-1e1jls!?=srman`!~9~lbm9RrQP#)_W!fdcy5*3)KwBJVgsoU)n6#o zc1GA1hJGTUguWU*Uef|j1rBh%|Mmuv4yQ~TB#opDyTg3`%Qd7SGnR?`8B3M@+4G*U z1f(;^o+v8pE&%RBcti+$%H<90GI!#7>?jxMDa|?>p@XC`2HSr%-!#`>Wt{MUZwo$b zn&?reG(CTy;(=p5|W(nPMv#kTZ$ks%{lT-bZ5J3kDY%FrV#mw;=bsKQee{0vJOpf`%Tl zBJn?W?@D3zNt#yj9D89`a+`(c0~J8#>>Ulm=x)y?n@JODd1C)Wp8x6t1;$Rp8;HWm zxw1c~uh2b~OOZ0UI#RH;|7=du3va;Q^50wJhdmgYG1>q5aO_KLw;p|qTWwNb{BKi$ zS8(vm!M!jcjZ_K$-%Bxk;P(FaU0`wkcO|gf4ZBVL|E|R0HOIL3*Q~tr>KovnlKktJ JrE+G${|7pE1pNR2 literal 0 HcmV?d00001 diff --git a/docs/examples/straight_skeleton_2.rst b/docs/examples/straight_skeleton_2.rst index cc1a9bf7..9d33bbbc 100644 --- a/docs/examples/straight_skeleton_2.rst +++ b/docs/examples/straight_skeleton_2.rst @@ -18,3 +18,21 @@ .. literalinclude:: straight_skeleton_2_holes.py :language: python + + +.. figure:: /_images/cgal_straight_skeleton_2_offset.png + :figclass: figure + :class: figure-img img-fluid + + +.. literalinclude:: straight_skeleton_2_offset.py + :language: python + + +.. figure:: /_images/cgal_straight_skeleton_2_offset_weighted.png + :figclass: figure + :class: figure-img img-fluid + + +.. literalinclude:: straight_skeleton_2_offset_weighted.py + :language: python diff --git a/docs/examples/straight_skeleton_offset.py b/docs/examples/straight_skeleton_2_offset.py similarity index 80% rename from docs/examples/straight_skeleton_offset.py rename to docs/examples/straight_skeleton_2_offset.py index 5d11de0a..c2dfd464 100644 --- a/docs/examples/straight_skeleton_offset.py +++ b/docs/examples/straight_skeleton_2_offset.py @@ -1,8 +1,8 @@ -from compas.datastructures import Graph from compas.geometry import Polygon -from compas_cgal.straight_skeleton_2 import create_offset_polygons_2 from compas_viewer import Viewer +from compas_cgal.straight_skeleton_2 import create_offset_polygons_2 + points = [ (-1.91, 3.59, 0.0), (-5.53, -5.22, 0.0), @@ -27,10 +27,11 @@ viewer = Viewer(width=1600, height=900) viewer.scene.add(polygon) +viewer.config.renderer.show_grid = False for opolygon in offset_polygons_inner: - viewer.scene.add(opolygon, linecolor=(1.0, 0.0, 0.0)) + viewer.scene.add(opolygon, linecolor=(1.0, 0.0, 0.0), facecolor=(1.0, 1.0, 1.0, 0.0)) for opolygon in offset_polygons_outer: - viewer.scene.add(opolygon, linecolor=(0.0, 0.0, 1.0)) + viewer.scene.add(opolygon, linecolor=(0.0, 0.0, 1.0), facecolor=(1.0, 1.0, 1.0, 0.0)) viewer.show() diff --git a/docs/examples/straight_skeleton_2_offset_weighted.py b/docs/examples/straight_skeleton_2_offset_weighted.py new file mode 100644 index 00000000..b7ce2b05 --- /dev/null +++ b/docs/examples/straight_skeleton_2_offset_weighted.py @@ -0,0 +1,37 @@ +from compas.geometry import Polygon +from compas_viewer import Viewer + +from compas_cgal.straight_skeleton_2 import create_weighted_offset_polygons_2 + +points = [ + (-1.91, 3.59, 0.0), + (-5.53, -5.22, 0.0), + (-0.39, -1.98, 0.0), + (2.98, -5.51, 0.0), + (4.83, -2.02, 0.0), + (9.70, -3.63, 0.0), + (12.23, 1.25, 0.0), + (3.42, 0.66, 0.0), + (2.92, 4.03, 0.0), + (-1.91, 3.59, 0.0), +] +polygon = Polygon(points) + + +distances = [0.1, 0.3, 0.6, 0.1, 0.7, 0.5, 0.2, 0.4, 0.8, 0.2] +weights = [1.0 / d for d in distances] +offset = 1.0 +offset_polygons_outer = create_weighted_offset_polygons_2(points, -offset, weights) + +# ============================================================================== +# Viz +# ============================================================================== + +viewer = Viewer(width=1600, height=900) +viewer.scene.add(polygon) +viewer.config.renderer.show_grid = False + +for opolygon in offset_polygons_outer: + viewer.scene.add(opolygon, linecolor=(0.0, 0.0, 1.0), facecolor=(1.0, 1.0, 1.0, 0.0)) + +viewer.show() From 198a609532d68fbb28ccd79b8246905aaa6bbede Mon Sep 17 00:00:00 2001 From: Romana Rust Date: Fri, 5 Jul 2024 11:38:58 +0200 Subject: [PATCH 04/11] tests --- src/compas_cgal/straight_skeleton_2.py | 70 +++++++++++++++++++++++--- tests/test_straight_skeleton_2.py | 7 +++ 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/src/compas_cgal/straight_skeleton_2.py b/src/compas_cgal/straight_skeleton_2.py index fc7bccb2..510475aa 100644 --- a/src/compas_cgal/straight_skeleton_2.py +++ b/src/compas_cgal/straight_skeleton_2.py @@ -1,6 +1,5 @@ import numpy as np -from compas.geometry import normal_polygon -from compas.geometry import Polygon +from compas.geometry import Polygon, normal_polygon from compas.tolerance import TOL from compas_cgal._cgal import straight_skeleton_2 @@ -69,15 +68,74 @@ def create_interior_straight_skeleton_with_holes(points, holes) -> PolylinesNump return straight_skeleton_2.create_interior_straight_skeleton_with_holes(V, H) -def create_offset_polygons_2(points, offset) -> PolylinesNumpy: +def create_offset_polygons_2(points, offset): + """Compute the polygon offset. + + Parameters + ---------- + points : list of point coordinates or :class:`compas.geometry.Polygon` + The points of the polygon. + offset : float + The offset distance. If negative, the offset is outside the polygon, otherwise inside. + + Returns + ------- + list of Polygon + The offset polygon(s). + + Raises + ------ + ValueError + If the normal of the polygon is not [0, 0, 1]. + """ points = list(points) if not TOL.is_allclose(normal_polygon(points, True), [0, 0, 1]): raise ValueError("Please pass a polygon with a normal vector of [0, 0, 1].") V = np.asarray(points, dtype=np.float64) offset = float(offset) - if offset < 0: # outside - offset_polygons = straight_skeleton_2.create_offset_polygons_2_outer(V, abs(offset))[1:] # first one is box - else: # inside + if offset < 0: # outside + offset_polygons = straight_skeleton_2.create_offset_polygons_2_outer(V, abs(offset))[1:] # first one is box + else: # inside offset_polygons = straight_skeleton_2.create_offset_polygons_2_inner(V, offset) return [Polygon(points.tolist()) for points in offset_polygons] + +def create_weighted_offset_polygons_2(points, offset, weights): + """Compute the polygon offset with weights. + + Parameters + ---------- + points : list of point coordinates or :class:`compas.geometry.Polygon` + The points of the polygon. + offset : float + The offset distance. If negative, the offset is outside the polygon, otherwise inside. + weights : list of float + The weights for each edge, starting with the edge between the last and the first point. + + Returns + ------- + list of Polygon + The offset polygon(s). + + Raises + ------ + ValueError + If the normal of the polygon is not [0, 0, 1]. + ValueError + If the number of weights do not match the number of points. + """ + points = list(points) + if not TOL.is_allclose(normal_polygon(points, True), [0, 0, 1]): + raise ValueError("Please pass a polygon with a normal vector of [0, 0, 1].") + V = np.asarray(points, dtype=np.float64) + offset = float(offset) + W = np.asarray(weights, dtype=np.float64) + if W.shape[0] != V.shape[0]: + raise ValueError( + "The number of weights should be equal to the number of points %d != %d." % (W.shape[0], V.shape[0]) + ) + if offset < 0: + offset_polygons = straight_skeleton_2.create_weighted_offset_polygons_2_outer(V, abs(offset), W)[1:] + else: + offset_polygons = straight_skeleton_2.create_weighted_offset_polygons_2_inner(V, offset, W) + return [Polygon(points.tolist()) for points in offset_polygons] diff --git a/tests/test_straight_skeleton_2.py b/tests/test_straight_skeleton_2.py index c700dc40..6286ed32 100644 --- a/tests/test_straight_skeleton_2.py +++ b/tests/test_straight_skeleton_2.py @@ -3,6 +3,8 @@ from compas_cgal.straight_skeleton_2 import create_interior_straight_skeleton from compas_cgal.straight_skeleton_2 import create_interior_straight_skeleton_with_holes from compas_cgal.straight_skeleton_2 import create_offset_polygons_2 +from compas_cgal.straight_skeleton_2 import create_weighted_offset_polygons_2 + def test_straight_polygon(): points = [ @@ -91,3 +93,8 @@ def test_offset(): assert len(polygons) == 1, len(polygons) polygons = create_offset_polygons_2(points, -offset) assert len(polygons) == 1, len(polygons) + weights = [0.1, 0.5, 0.3, 0.3, 0.9, 1.0, 0.2, 1.0] + polygons = create_weighted_offset_polygons_2(points, offset, weights) + assert len(polygons) == 1, len(polygons) + polygons = create_weighted_offset_polygons_2(points, -offset, weights) + assert len(polygons) == 1, len(polygons) From a6516f9916663252aec9cb3788dd90db79a50443 Mon Sep 17 00:00:00 2001 From: Romana Rust Date: Fri, 5 Jul 2024 11:43:45 +0200 Subject: [PATCH 05/11] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d7c8b07..317ca0a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Added `compas_cgal.straight_skeleton_2.create_interior_straight_skeleton`. * Added `compas_cgal.straight_skeleton_2.create_interior_straight_skeleton_with_holes`. +* Added `compas_cgal.straight_skeleton_2.create_offset_polygons_2_inner`. +* Added `compas_cgal.straight_skeleton_2.create_offset_polygons_2_outer`. +* Added `compas_cgal.straight_skeleton_2.create_weighted_offset_polygons_2_inner`. +* Added `compas_cgal.straight_skeleton_2.create_weighted_offset_polygons_2_outer`. ### Changed From 5fa634be00e10f6f49608722abb7b66102b287a0 Mon Sep 17 00:00:00 2001 From: Romana Rust Date: Wed, 3 Jul 2024 21:42:53 +0200 Subject: [PATCH 06/11] adding inner and outer offsets --- docs/examples/straight_skeleton_offset.py | 36 +++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 docs/examples/straight_skeleton_offset.py diff --git a/docs/examples/straight_skeleton_offset.py b/docs/examples/straight_skeleton_offset.py new file mode 100644 index 00000000..5d11de0a --- /dev/null +++ b/docs/examples/straight_skeleton_offset.py @@ -0,0 +1,36 @@ +from compas.datastructures import Graph +from compas.geometry import Polygon +from compas_cgal.straight_skeleton_2 import create_offset_polygons_2 +from compas_viewer import Viewer + +points = [ + (-1.91, 3.59, 0.0), + (-5.53, -5.22, 0.0), + (-0.39, -1.98, 0.0), + (2.98, -5.51, 0.0), + (4.83, -2.02, 0.0), + (9.70, -3.63, 0.0), + (12.23, 1.25, 0.0), + (3.42, 0.66, 0.0), + (2.92, 4.03, 0.0), + (-1.91, 3.59, 0.0), +] +polygon = Polygon(points) +offset = 1.5 + +offset_polygons_inner = create_offset_polygons_2(points, offset) +offset_polygons_outer = create_offset_polygons_2(points, -offset) + +# ============================================================================== +# Viz +# ============================================================================== + +viewer = Viewer(width=1600, height=900) +viewer.scene.add(polygon) + +for opolygon in offset_polygons_inner: + viewer.scene.add(opolygon, linecolor=(1.0, 0.0, 0.0)) +for opolygon in offset_polygons_outer: + viewer.scene.add(opolygon, linecolor=(0.0, 0.0, 1.0)) + +viewer.show() From 2633d4eed7140084733058d48531abe415dd19de Mon Sep 17 00:00:00 2001 From: Romana Rust Date: Fri, 5 Jul 2024 14:56:53 +0200 Subject: [PATCH 07/11] forgot by merging --- src/straight_skeleton_2.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/straight_skeleton_2.cpp b/src/straight_skeleton_2.cpp index 9360d30d..dcbde6aa 100644 --- a/src/straight_skeleton_2.cpp +++ b/src/straight_skeleton_2.cpp @@ -15,6 +15,8 @@ typedef CGAL::Straight_skeleton_2 Ss; typedef boost::shared_ptr SsPtr; typedef CGAL::Straight_skeleton_2::Halfedge_const_handle Halfedge_const_handle; typedef CGAL::Straight_skeleton_2::Vertex_const_handle Vertex_const_handle; +typedef boost::shared_ptr PolygonPtr; +typedef std::vector PolygonPtrVector; compas::Edges pmp_create_interior_straight_skeleton( Eigen::Ref &V) From 9ea8c3cb9c3b8c2447da4e6a758f6b8b5b609cfd Mon Sep 17 00:00:00 2001 From: Romana Rust Date: Fri, 5 Jul 2024 15:08:38 +0200 Subject: [PATCH 08/11] lint --- src/compas_cgal/straight_skeleton_2.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/compas_cgal/straight_skeleton_2.py b/src/compas_cgal/straight_skeleton_2.py index 510475aa..0ab59cc9 100644 --- a/src/compas_cgal/straight_skeleton_2.py +++ b/src/compas_cgal/straight_skeleton_2.py @@ -1,5 +1,6 @@ import numpy as np -from compas.geometry import Polygon, normal_polygon +from compas.geometry import Polygon +from compas.geometry import normal_polygon from compas.tolerance import TOL from compas_cgal._cgal import straight_skeleton_2 @@ -131,9 +132,7 @@ def create_weighted_offset_polygons_2(points, offset, weights): offset = float(offset) W = np.asarray(weights, dtype=np.float64) if W.shape[0] != V.shape[0]: - raise ValueError( - "The number of weights should be equal to the number of points %d != %d." % (W.shape[0], V.shape[0]) - ) + raise ValueError("The number of weights should be equal to the number of points %d != %d." % (W.shape[0], V.shape[0])) if offset < 0: offset_polygons = straight_skeleton_2.create_weighted_offset_polygons_2_outer(V, abs(offset), W)[1:] else: From 1170d4093671bd6dea8ef6c70270bc3528317883 Mon Sep 17 00:00:00 2001 From: Romana Rust Date: Fri, 5 Jul 2024 15:09:33 +0200 Subject: [PATCH 09/11] Update straight_skeleton_2.py --- src/compas_cgal/straight_skeleton_2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compas_cgal/straight_skeleton_2.py b/src/compas_cgal/straight_skeleton_2.py index 0ab59cc9..2f549e0a 100644 --- a/src/compas_cgal/straight_skeleton_2.py +++ b/src/compas_cgal/straight_skeleton_2.py @@ -123,7 +123,7 @@ def create_weighted_offset_polygons_2(points, offset, weights): ValueError If the normal of the polygon is not [0, 0, 1]. ValueError - If the number of weights do not match the number of points. + If the number of weights does not match the number of points. """ points = list(points) if not TOL.is_allclose(normal_polygon(points, True), [0, 0, 1]): From 07689571a912043c1fd7156214f53a54fbb860bb Mon Sep 17 00:00:00 2001 From: Romana Rust Date: Tue, 9 Jul 2024 11:28:37 +0200 Subject: [PATCH 10/11] more elaborate error --- src/compas_cgal/straight_skeleton_2.py | 28 ++++++++++++++++---------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/compas_cgal/straight_skeleton_2.py b/src/compas_cgal/straight_skeleton_2.py index 2f549e0a..ba8a4861 100644 --- a/src/compas_cgal/straight_skeleton_2.py +++ b/src/compas_cgal/straight_skeleton_2.py @@ -27,8 +27,9 @@ def create_interior_straight_skeleton(points) -> PolylinesNumpy: If the normal of the polygon is not [0, 0, 1]. """ points = list(points) - if not TOL.is_allclose(normal_polygon(points, True), [0, 0, 1]): - raise ValueError("Please pass a polygon with a normal vector of [0, 0, 1].") + normal = normal_polygon(points, True) + if not TOL.is_allclose(normal, [0, 0, 1]): + raise ValueError("The normal of the polygon should be [0, 0, 1]. The normal of the provided polygon is {}".format(normal)) V = np.asarray(points, dtype=np.float64) return straight_skeleton_2.create_interior_straight_skeleton(V) @@ -55,15 +56,17 @@ def create_interior_straight_skeleton_with_holes(points, holes) -> PolylinesNump If the normal of a hole is not [0, 0, -1]. """ points = list(points) - if not TOL.is_allclose(normal_polygon(points, True), [0, 0, 1]): - raise ValueError("Please pass a polygon with a normal vector of [0, 0, 1].") + normal = normal_polygon(points, True) + if not TOL.is_allclose(normal, [0, 0, 1]): + raise ValueError("The normal of the polygon should be [0, 0, 1]. The normal of the provided polygon is {}".format(normal)) V = np.asarray(points, dtype=np.float64) H = [] - for hole in holes: + for i, hole in enumerate(holes): points = list(hole) - if not TOL.is_allclose(normal_polygon(points, True), [0, 0, -1]): - raise ValueError("Please pass a hole with a normal vector of [0, 0, -1].") + normal_hole = normal_polygon(points, True) + if not TOL.is_allclose(normal_hole, [0, 0, -1]): + raise ValueError("The normal of the hole should be [0, 0, -1]. The normal of the provided {}-th hole is {}".format(i, normal_hole)) hole = np.asarray(points, dtype=np.float64) H.append(hole) return straight_skeleton_2.create_interior_straight_skeleton_with_holes(V, H) @@ -90,8 +93,9 @@ def create_offset_polygons_2(points, offset): If the normal of the polygon is not [0, 0, 1]. """ points = list(points) - if not TOL.is_allclose(normal_polygon(points, True), [0, 0, 1]): - raise ValueError("Please pass a polygon with a normal vector of [0, 0, 1].") + normal = normal_polygon(points, True) + if not TOL.is_allclose(normal, [0, 0, 1]): + raise ValueError("The normal of the polygon should be [0, 0, 1]. The normal of the provided polygon is {}".format(normal)) V = np.asarray(points, dtype=np.float64) offset = float(offset) if offset < 0: # outside @@ -126,8 +130,10 @@ def create_weighted_offset_polygons_2(points, offset, weights): If the number of weights does not match the number of points. """ points = list(points) - if not TOL.is_allclose(normal_polygon(points, True), [0, 0, 1]): - raise ValueError("Please pass a polygon with a normal vector of [0, 0, 1].") + normal = normal_polygon(points, True) + if not TOL.is_allclose(normal, [0, 0, 1]): + raise ValueError("The normal of the polygon should be [0, 0, 1]. The normal of the provided polygon is {}".format(normal)) + V = np.asarray(points, dtype=np.float64) offset = float(offset) W = np.asarray(weights, dtype=np.float64) From 56c5ad42e655ba588e27ba04daa82a473bb2a04c Mon Sep 17 00:00:00 2001 From: Romana Rust Date: Tue, 9 Jul 2024 11:33:07 +0200 Subject: [PATCH 11/11] type annotations --- src/compas_cgal/straight_skeleton_2.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compas_cgal/straight_skeleton_2.py b/src/compas_cgal/straight_skeleton_2.py index ba8a4861..31d94178 100644 --- a/src/compas_cgal/straight_skeleton_2.py +++ b/src/compas_cgal/straight_skeleton_2.py @@ -72,7 +72,7 @@ def create_interior_straight_skeleton_with_holes(points, holes) -> PolylinesNump return straight_skeleton_2.create_interior_straight_skeleton_with_holes(V, H) -def create_offset_polygons_2(points, offset): +def create_offset_polygons_2(points, offset) -> list[Polygon]: """Compute the polygon offset. Parameters @@ -84,7 +84,7 @@ def create_offset_polygons_2(points, offset): Returns ------- - list of Polygon + list[:class:`Polygon`] The offset polygon(s). Raises @@ -105,7 +105,7 @@ def create_offset_polygons_2(points, offset): return [Polygon(points.tolist()) for points in offset_polygons] -def create_weighted_offset_polygons_2(points, offset, weights): +def create_weighted_offset_polygons_2(points, offset, weights) -> list[Polygon]: """Compute the polygon offset with weights. Parameters @@ -119,7 +119,7 @@ def create_weighted_offset_polygons_2(points, offset, weights): Returns ------- - list of Polygon + list[:class:`Polygon`] The offset polygon(s). Raises