diff --git a/delaunay.md b/delaunay.md new file mode 100644 index 0000000000000000000000000000000000000000..9143430c313de86e6f57b2ed8b19a09c707aef51 --- /dev/null +++ b/delaunay.md @@ -0,0 +1,159 @@ +% Triangulation de Delaunay +% Travail pratique de programmation déquentielle +% 19 février 2020 + +# La triangulation de Delaunay + +## Généralités + +* Soit un ensemble de $N$ points $\mathcal{P}=\{p_i\}_{i=1}^N$. +* Une triangulation est un ensemble de triangle dont les sommets sont formés des points de $\mathcal{P}$ et couvrant leur envelope convexe. + +).](figs/PointSetTriangulations.svg){#fig:tri width=100%} + +## La triangulation de Delaunay + +* La triangulation de Delaunay (TD) d'un ensemble de points $\mathcal{P}$ est telle qu'aucun point de $\mathcal{P}$ ne se trouve dans le cercle circonscrit d'un triangle de la TD. +* Les points sont tous sur la surface de chaque cercle circonscrit des triangles de la TD. +* Elle maximise le plus petit angle de tous les triangles (on essaie d'éviter les triangle avec les angles très petits). +* Il existe plusieurs algorithmes pour construire cette triangulation: *flip algorithm*, *incremental edge flip*, *Bowyer--Watson**, ... + +## L'algorithme de Bowyer--Watson + +* Dans cet algorithme on commence par construire un **super-triangle** contenant tous les points de $\mathcal{P}$. +* On ajoute ensuite les points itérativement: + * Chaque fois qu'on ajoute un point, $\vec p$, on retire tous les triangles dont le triangle circonscrit contient le point $\vec p$. + * On se retrouve avec avec un "trou" qui contient $\vec p$. + * Toutes les arrêtes du polygones sont reliées à $\vec p$ pour former les nouveau triangles à ajouter à la triangulation. +* On retire tous les triangles qui contiennent les points du super-triangle. + + +## Exemple d'ajouts (1/6) (voir [wikipedia](https://bit.ly/2vJs5p2)) + +{#fig:tri width=100%} + +## Exemple d'ajouts (2/6) (voir [wikipedia](https://bit.ly/2vJs5p2)) + +{#fig:tri width=100%} + +## Exemple d'ajouts (3/6) (voir [wikipedia](https://bit.ly/2vJs5p2)) + +{#fig:tri width=100%} + +## Exemple d'ajouts (4/6) (voir [wikipedia](https://bit.ly/2vJs5p2)) + +{#fig:tri width=100%} + +## Exemple d'ajouts (5/6) (voir [wikipedia](https://bit.ly/2vJs5p2)) + +{#fig:tri width=100%} + +## Exemple d'ajouts (6/6) (voir [wikipedia](https://bit.ly/2vJs5p2)) + +{#fig:tri width=100%} + +<!-- ## Pseudo-code de l'algorithme (1/2) + +\scriptsize + +```C +void bowyer_watson(point *points, int num_p, vec_triangle *t, int *num_t) { + ajout_super_triangle(vec_triangle, num_t); // ajout super triangle + + pour chaque p dans points { + mauvais_triangles = vecteur_vide(); + pour chaque t dans vec_triangle { + si p est dans le triangle circonscrit de t { + vecteur_push(mauvais_triangles, t); + } + } + + vec_arretes = vecteur_vide(); + pour chaque t dans mauvais_triangles { + pour chaque arrete dans t { + si l'arrete n'est partagée avec aucun triangle de mauvais_triangles { + vecteur_push(vec_arretes, arrete); + } + } + } + + pour chaque t dans mauvais_triangles { + vec_remove(vec_triangles, t); + } + + pour chaque arrete dans vec_arretes { + t = form_triangle_from_edge_and_point(arrete, p); + vector_push(vec_triangles, t); + } + + pour chaque t dans vec_triangles { + if t contient un point du super triangle { + vec_remove(vec_triangles, t); + } + } + } +} +``` --> + +## Pseudo-code de l'algorithme (1/2) + +\scriptsize + +```C +void bowyer_watson(point *points, int num_p, vec_triangle *t, int *num_t) { + ajout_super_triangle(vec_triangle, num_t); // ajout super triangle + + pour chaque p dans points { + mauvais_triangles = vecteur_vide(); + // on détermine les mauvais triangles + pour chaque t dans vec_triangle { + si p est dans le triangle circonscrit de t { + vecteur_push(mauvais_triangles, t); + } + } + vec_arretes = vecteur_vide(); + // stockage du polynogone entourant le "trou" + pour chaque t dans mauvais_triangles { + pour chaque arrete dans t { + si l'arrete n'est partagée avec aucun triangle de mauvais_triangles { + vecteur_push(vec_arretes, arrete); + } + } + } + // on retire les mauvais triangles + pour chaque t dans mauvais_triangles { + vec_remove(vec_triangles, t); + } +} +``` + +## Pseudo-code de l'algorithme (2/2) + +\scriptsize + +```C + // on forme les nouveaux triangles et on les ajoute + pour chaque arrete dans vec_arretes { + t = form_triangle_from_edge_and_point(arrete, p); + vector_push(vec_triangles, t); + } + + // on retire les points du super triangle + pour chaque t dans vec_triangles { + if t contient un point du super triangle { + vec_remove(vec_triangles, t); + } + } + } +} +``` + + +## Appartenance au cercle circonscrit + +* Une partie fondamentale de l'algorithme réside dans la capacité à déterminer si un point est dans le cercle circonscrit. +* On peut déterminer si un point $D$ est dans le triangle circonscrit délimité par les points $A$, $B$, et $C$ (qui sont ordonnés dans le sens inverse des aiguilles d'une montre), si +$$ +\begin{vmatrix}A_{x}-D_{x}&A_{y}-D_{y}&(A_{x}-D_{x})^{2}+(A_{y}-D_{y})^{2}\\B_{x}-D_{x}&B_{y}-D_{y}&(B_{x}-D_{x})^{2}+(B_{y}-D_{y})^{2}\\C_{x}-D_{x}&C_{y}-D_{y}&(C_{x}-D_{x})^{2}+(C_{y}-D_{y})^{2}\end{vmatrix}>0, +$$ +où $|.|$ signifie le calcul du déterminant. \ No newline at end of file diff --git a/figs/Bowyer-Watson_0.png b/figs/Bowyer-Watson_0.png new file mode 100644 index 0000000000000000000000000000000000000000..2050bf90cb6e85cbaf9eaa4d12cc6e1721031665 Binary files /dev/null and b/figs/Bowyer-Watson_0.png differ diff --git a/figs/Bowyer-Watson_1.png b/figs/Bowyer-Watson_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a568d4d9098f21efc3d8522376b6af5199aaeab8 Binary files /dev/null and b/figs/Bowyer-Watson_1.png differ diff --git a/figs/Bowyer-Watson_2.png b/figs/Bowyer-Watson_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3db6503e2210098985c0a9d36817acd6beeea669 Binary files /dev/null and b/figs/Bowyer-Watson_2.png differ diff --git a/figs/Bowyer-Watson_3.png b/figs/Bowyer-Watson_3.png new file mode 100644 index 0000000000000000000000000000000000000000..0f8bcf7c553c5c295b52b1a7ca066935918df623 Binary files /dev/null and b/figs/Bowyer-Watson_3.png differ diff --git a/figs/Bowyer-Watson_4.png b/figs/Bowyer-Watson_4.png new file mode 100644 index 0000000000000000000000000000000000000000..22fafe0df1025c59a7581e0ab26a1c92b8aaef44 Binary files /dev/null and b/figs/Bowyer-Watson_4.png differ diff --git a/figs/Bowyer-Watson_6.png b/figs/Bowyer-Watson_6.png new file mode 100644 index 0000000000000000000000000000000000000000..85f11cdcdab285087ddc3ba94f5e3eab6b8884ce Binary files /dev/null and b/figs/Bowyer-Watson_6.png differ diff --git a/figs/PointSetTriangulations.svg b/figs/PointSetTriangulations.svg new file mode 100644 index 0000000000000000000000000000000000000000..aa957a344f98203a45566d9211d1643c76bf4c8a --- /dev/null +++ b/figs/PointSetTriangulations.svg @@ -0,0 +1,421 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.0" + id="Layer_1" + x="0px" + y="0px" + width="427.10229" + height="129.364" + viewBox="0 0 427.1023 129.364" + enable-background="new 0 0 250 300" + xml:space="preserve" + sodipodi:docname="PointSetTriangulations.svg" + inkscape:version="0.92.4 5da689c313, 2019-01-14"><metadata + id="metadata151"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs149"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + </defs><sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1028" + id="namedview147" + showgrid="false" + inkscape:zoom="1.5733333" + inkscape:cx="176.06205" + inkscape:cy="77.593548" + inkscape:window-x="0" + inkscape:window-y="24" + inkscape:window-maximized="1" + inkscape:current-layer="Layer_1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> + +<g + id="g4856" + transform="translate(196.52429,-157.989)"><g + id="g4702"><g + id="g4684"><polygon + points="228.896,213.671 201.896,267.671 93.896,285.671 30.896,258.671 21.896,204.671 111.896,159.671 192.896,177.671 " + id="polygon2" + style="fill:#e7e8e9" /><polygon + points="228.896,213.671 201.896,267.671 93.896,285.671 30.896,258.671 21.896,204.671 111.896,159.671 192.896,177.671 " + id="polygon4" + style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round" /><line + x1="156.896" + y1="204.67101" + x2="228.896" + y2="213.67101" + id="line6" + style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round" /><line + x1="156.896" + y1="204.67101" + x2="30.896" + y2="258.67099" + id="line8" + style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round" /><line + x1="111.896" + y1="159.67101" + x2="30.896" + y2="258.67099" + id="line10" + style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round" /><line + x1="192.896" + y1="177.67101" + x2="93.896004" + y2="222.67101" + id="line12" + style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round" /><line + x1="111.896" + y1="159.67101" + x2="93.896004" + y2="222.67101" + id="line20" + style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round" /><line + x1="192.896" + y1="177.67101" + x2="156.896" + y2="204.67101" + id="line22" + style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round" /><polyline + points="93.896,222.671 156.896,204.671 201.896,267.671 " + id="polyline24" + style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round" /><polyline + points="93.896,222.671 30.896,258.671 201.896,267.671 " + id="polyline26" + style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round" /></g></g><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path30" + d="m 23.078,204.671 c 0,0.652 -0.53,1.182 -1.182,1.182 -0.653,0 -1.183,-0.527 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.651,0 1.182,0.53 1.182,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path32" + d="m 23.078,204.671 c 0,0.652 -0.53,1.182 -1.182,1.182 -0.653,0 -1.183,-0.527 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.651,0 1.182,0.53 1.182,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path34" + d="M 21.896,204.671" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path36" + d="m 113.078,159.671 c 0,0.652 -0.53,1.182 -1.182,1.182 -0.653,0 -1.183,-0.527 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.651,0 1.182,0.53 1.182,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path38" + d="m 113.078,159.671 c 0,0.652 -0.53,1.182 -1.182,1.182 -0.653,0 -1.183,-0.527 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.651,0 1.182,0.53 1.182,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path40" + d="M 111.896,159.671" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path42" + d="m 95.077,222.671 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.652,0 -1.182,-0.527 -1.182,-1.182 0,-0.652 0.528,-1.182 1.182,-1.182 0.653,0 1.182,0.53 1.182,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path44" + d="m 95.077,222.671 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.652,0 -1.182,-0.527 -1.182,-1.182 0,-0.652 0.528,-1.182 1.182,-1.182 0.653,0 1.182,0.53 1.182,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path46" + d="M 93.896,222.671" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path48" + d="m 158.077,204.671 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.653,0 -1.183,-0.527 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.653,0 1.182,0.53 1.182,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path50" + d="m 158.077,204.671 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.653,0 -1.183,-0.527 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.653,0 1.182,0.53 1.182,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path52" + d="M 156.896,204.671" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path54" + d="m 32.078,258.671 c 0,0.652 -0.53,1.182 -1.182,1.182 -0.653,0 -1.183,-0.527 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.651,0 1.182,0.53 1.182,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path56" + d="m 32.078,258.671 c 0,0.652 -0.53,1.182 -1.182,1.182 -0.653,0 -1.183,-0.527 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.651,0 1.182,0.53 1.182,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path58" + d="M 30.896,258.671" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path60" + d="m 95.077,285.671 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.652,0 -1.182,-0.527 -1.182,-1.182 0,-0.652 0.528,-1.182 1.182,-1.182 0.653,0 1.182,0.53 1.182,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path62" + d="m 95.077,285.671 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.652,0 -1.182,-0.527 -1.182,-1.182 0,-0.652 0.528,-1.182 1.182,-1.182 0.653,0 1.182,0.53 1.182,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path64" + d="M 93.896,285.671" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path66" + d="m 203.077,267.671 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.653,0 -1.183,-0.527 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.653,0 1.182,0.53 1.182,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path68" + d="m 203.077,267.671 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.653,0 -1.183,-0.527 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.653,0 1.182,0.53 1.182,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path70" + d="M 201.896,267.671" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path72" + d="m 194.077,177.671 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.653,0 -1.183,-0.527 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.653,0 1.182,0.53 1.182,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path74" + d="m 194.077,177.671 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.653,0 -1.183,-0.527 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.653,0 1.182,0.53 1.182,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path76" + d="M 192.896,177.671" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path78" + d="m 230.078,213.671 c 0,0.652 -0.53,1.182 -1.183,1.182 -0.653,0 -1.183,-0.527 -1.183,-1.182 0,-0.652 0.527,-1.182 1.183,-1.182 0.653,0 1.183,0.53 1.183,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path80" + d="m 230.078,213.671 c 0,0.652 -0.53,1.182 -1.183,1.182 -0.653,0 -1.183,-0.527 -1.183,-1.182 0,-0.652 0.527,-1.182 1.183,-1.182 0.653,0 1.183,0.53 1.183,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path82" + d="M 228.896,213.671" /></g><g + id="g4891" + transform="translate(-20.213,-13.9885)"><g + id="g4689"><polygon + style="fill:#e7e8e9" + id="polygon14" + points="30.896,114.671 21.896,60.671 111.896,15.671 192.896,33.671 228.896,69.671 201.896,123.671 93.896,141.671 " /><polygon + style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round" + id="polygon16" + points="30.896,114.671 21.896,60.671 111.896,15.671 192.896,33.671 228.896,69.671 201.896,123.671 93.896,141.671 " /><line + style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round" + id="line18" + y2="78.669998" + x2="93.896004" + y1="141.67" + x1="93.896004" /></g><polyline + style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round" + id="polyline84" + points="201.896,123.67 93.896,78.67 156.896,60.67 201.896,123.67 192.896,33.67 156.896,60.67 111.896,15.67 93.896,78.67 " /><polyline + style="fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round" + id="polyline86" + points="21.896,60.671 93.896,78.671 30.896,114.671 " /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path88" + d="m 23.078,60.671 c 0,0.652 -0.53,1.182 -1.182,1.182 -0.653,0 -1.183,-0.528 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.651,0 1.182,0.529 1.182,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path90" + d="m 23.078,60.671 c 0,0.652 -0.53,1.182 -1.182,1.182 -0.653,0 -1.183,-0.528 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.651,0 1.182,0.529 1.182,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path92" + d="M 21.896,60.671" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path94" + d="m 113.078,15.67 c 0,0.653 -0.53,1.182 -1.182,1.182 -0.653,0 -1.183,-0.528 -1.183,-1.182 0,-0.651 0.528,-1.181 1.183,-1.181 0.651,0 1.182,0.53 1.182,1.181" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path96" + d="m 113.078,15.67 c 0,0.653 -0.53,1.182 -1.182,1.182 -0.653,0 -1.183,-0.528 -1.183,-1.182 0,-0.651 0.528,-1.181 1.183,-1.181 0.651,0 1.182,0.53 1.182,1.181" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path98" + d="M 111.896,15.67" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path100" + d="m 95.077,78.67 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.652,0 -1.182,-0.528 -1.182,-1.182 0,-0.652 0.528,-1.182 1.182,-1.182 0.653,0 1.182,0.531 1.182,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path102" + d="m 95.077,78.67 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.652,0 -1.182,-0.528 -1.182,-1.182 0,-0.652 0.528,-1.182 1.182,-1.182 0.653,0 1.182,0.531 1.182,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path104" + d="M 93.896,78.67" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path106" + d="m 158.077,60.671 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.653,0 -1.183,-0.529 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.653,0 1.182,0.529 1.182,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path108" + d="m 158.077,60.671 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.653,0 -1.183,-0.529 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.653,0 1.182,0.529 1.182,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path110" + d="M 156.896,60.671" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path112" + d="m 32.078,114.67 c 0,0.652 -0.53,1.182 -1.182,1.182 -0.653,0 -1.183,-0.528 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.651,0 1.182,0.531 1.182,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path114" + d="m 32.078,114.67 c 0,0.652 -0.53,1.182 -1.182,1.182 -0.653,0 -1.183,-0.528 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.651,0 1.182,0.531 1.182,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path116" + d="M 30.896,114.67" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path118" + d="m 95.077,141.67 c 0,0.653 -0.529,1.182 -1.182,1.182 -0.652,0 -1.182,-0.527 -1.182,-1.182 0,-0.652 0.528,-1.182 1.182,-1.182 0.653,0 1.182,0.531 1.182,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path120" + d="m 95.077,141.67 c 0,0.653 -0.529,1.182 -1.182,1.182 -0.652,0 -1.182,-0.527 -1.182,-1.182 0,-0.652 0.528,-1.182 1.182,-1.182 0.653,0 1.182,0.531 1.182,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path122" + d="M 93.896,141.67" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path124" + d="m 203.077,123.67 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.653,0 -1.183,-0.528 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.653,0 1.182,0.531 1.182,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path126" + d="m 203.077,123.67 c 0,0.652 -0.529,1.182 -1.182,1.182 -0.653,0 -1.183,-0.528 -1.183,-1.182 0,-0.652 0.528,-1.182 1.183,-1.182 0.653,0 1.182,0.531 1.182,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path128" + d="M 201.896,123.67" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path130" + d="m 194.077,33.67 c 0,0.653 -0.529,1.182 -1.182,1.182 -0.653,0 -1.183,-0.528 -1.183,-1.182 0,-0.651 0.528,-1.181 1.183,-1.181 0.653,0 1.182,0.53 1.182,1.181" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path132" + d="m 194.077,33.67 c 0,0.653 -0.529,1.182 -1.182,1.182 -0.653,0 -1.183,-0.528 -1.183,-1.182 0,-0.651 0.528,-1.181 1.183,-1.181 0.653,0 1.182,0.53 1.182,1.181" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path134" + d="M 192.896,33.67" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path136" + d="m 230.078,69.671 c 0,0.652 -0.53,1.181 -1.183,1.181 -0.653,0 -1.183,-0.528 -1.183,-1.181 0,-0.652 0.527,-1.182 1.183,-1.182 0.653,0 1.183,0.53 1.183,1.182" /><path + style="fill:none;stroke:#000000" + inkscape:connector-curvature="0" + id="path138" + d="m 230.078,69.671 c 0,0.652 -0.53,1.181 -1.183,1.181 -0.653,0 -1.183,-0.528 -1.183,-1.181 0,-0.652 0.527,-1.182 1.183,-1.182 0.653,0 1.183,0.53 1.183,1.182" /><path + style="fill:#ffffff" + inkscape:connector-curvature="0" + id="path140" + d="M 228.896,69.671" /></g> +</svg> \ No newline at end of file