{"id":392,"date":"2004-05-22T06:58:54","date_gmt":"2004-05-22T13:58:54","guid":{"rendered":"http:\/\/www.kirainet.com\/delaunay-y-voronoi\/"},"modified":"2004-05-22T06:58:54","modified_gmt":"2004-05-22T13:58:54","slug":"delaunay-y-voronoi","status":"publish","type":"post","link":"https:\/\/www.robotic-lab.com\/blog\/2004\/05\/22\/delaunay-y-voronoi\/","title":{"rendered":"Delaunay y Voronoi"},"content":{"rendered":"<p>Vamos a comentar intuitivamente uno de los algoritmos m&aacute;s famosos y m&aacute;s &uacute;tiles de la geometr&iacute;a computacional usando un ejemplo pr&aacute;ctico. Aprenderemos a generar im&aacute;genes como esta:<\/p>\n<p><img decoding=\"async\" class=\"photoframe\"  src=\"http:\/\/www.kirainet.com\/images\/voronoi.jpg\" \/><\/p>\n<p>Comenzamos la aventura. Imaginaros que tenemos una empresa de transporte con varias centrales de distribuci&oacute;n, cada punto de la im&aacute;gen representa uno de estos centros:<\/p>\n<p><img decoding=\"async\" class=\"photoframe\"  src=\"http:\/\/www.kirainet.com\/images\/voronoi1.jpg\" \/><\/p>\n<p>Ahora imaginaros que debemos determinar las zona que debe cubrir cada central de distribuci&oacute;n de forma que tengamos que viajar lo m&iacute;nimo posible. Es decir, debemos determinar las zonas del plano que est&aacute;n m&aacute;s cercanas a cada punto. <\/p>\n<p>Para calcular estas zonas hay que seguir una serie de pasos. Primero debemos aplicar el algoritmo de Delaunay, que consiste en trazar tri&aacute;ngulos entre los v&eacute;rtices con ciertas restricciones que ahora veremos. Veamos una posible triangulaci&oacute;n:<\/p>\n<p><img decoding=\"async\" class=\"photoframe\"  src=\"http:\/\/www.kirainet.com\/images\/voronoi2.jpg\" \/><\/p>\n<p>Esta es una forma de triangular, pero para nuestro prop&oacute;sito no es v&aacute;lida. Debemos conseguir una triangulaci&oacute;n de forma que <strong>Cualquier circunferencia trazada entre los 3 v&eacute;rtices de cada tri&aacute;ngulo no tenga ning&uacute;n otro punto dentro<\/strong>. Lo veremos m&aacute;s claro con una im&aacute;gen que demuestra que la triangulaci&oacute;n anterior no era v&aacute;lida:<\/p>\n<p><img decoding=\"async\" class=\"photoframe\"  src=\"http:\/\/www.kirainet.com\/images\/voronoi3.jpg\" \/><\/p>\n<p>&iquest;C&oacute;mo solucionamos el problema? Pues probando diversas triangulaciones (Hay un m&eacute;todo complicado de explicar que lo hace muy bien) hasta que no haya ninguna circunferencia que toque m&aacute;s de 3 v&eacute;rtices. En nuestro caso solo tenemos que cambiar una arista:<\/p>\n<p><img decoding=\"async\" class=\"photoframe\"  src=\"http:\/\/www.kirainet.com\/images\/voronoi4.jpg\" \/><\/p>\n<p>Fijaros que hemos cambiado un poco la triangulaci&oacute;n y ahora al trazar la circunferencia ya no tenemos ning&uacute;n otro v&eacute;rtice interior. Si hacemos lo mismo con el resto de tri&aacute;ngulos vemos que hemos conseguido que no tengan otros v&eacute;rtices dentro, en este momento hemos conseguido la <strong>Triangulaci&oacute;n de Delaunay<\/strong> a partir de los v&eacute;rtices\/centrales de distribuci&oacute;n iniciales. En la siguiente imagen trazamos todas las circunferencias posibles, fijaros que ninguna toca m&aacute;s de 3 v&eacute;rtices.<\/p>\n<p><img decoding=\"async\" class=\"photoframe\"  src=\"http:\/\/www.kirainet.com\/images\/voronoi5.jpg\" \/><\/p>\n<p>Pufff, un poco lioso pero lo que queda es cuesta abajo.  A continuaci&oacute;n debemos calcular las regiones m&aacute;s cercanas a cada punto (A estas regiones las llamaremos <strong>Regiones de Voronoi<\/strong>). Para ello nos apoyaremos en la Triangulaci&oacute;n de Delaunay que ya hemos calculado. <strong>Marcamos el punto central de cada circunferencia y trazamos Perpendiculares a las aristas de los tri&aacute;ngulos<\/strong>. Vamos a verlo con dos de los c&iacute;rculos para no liar (Los puntos amarillos son los centros de las circunferencias y las l&iacute;neas naranjas son perpendiculares a las aristas de los tri&aacute;ngulos):<\/p>\n<p><img decoding=\"async\" class=\"photoframe\"  src=\"http:\/\/www.kirainet.com\/images\/voronoi6.jpg\" \/><\/p>\n<p>Si seguimos aplicando el mismo m&eacute;todo (y eliminamos del dibujo los circulos para no liar) obtendremos lo siguiente:<\/p>\n<p><img decoding=\"async\" class=\"photoframe\"  src=\"http:\/\/www.kirainet.com\/images\/voronoi7.jpg\" \/><\/p>\n<p>Si adem&aacute;s eliminamos la Triangulaci&oacute;n de Delaunay, tendremos la imagen definitiva donde se definen las zonas m&aacute;s cercanas a cada centro de distribuci&oacute;n:<\/p>\n<p><img decoding=\"async\" class=\"photoframe\"  src=\"http:\/\/www.kirainet.com\/images\/voronoi8.jpg\" \/><\/p>\n<p>Por ejemplo, la zona coloreada de verde es la <strong>Regi&oacute;n de Voronoi<\/strong> del punto A. <strong>Esto quiere decir que todo lo que est&aacute; pintado de verde est&aacute; m&aacute;s cerca de A que de cualquier otro punto del dibujo<\/strong>. Lo pod&eacute;is comprobar con una regla si no os convenzo <img src='http:\/\/www.kirainet.com\/wp-includes\/images\/smilies\/icon_wink.gif' alt=';)' class='wp-smiley' \/> <\/p>\n<p><img decoding=\"async\" class=\"photoframe\"  src=\"http:\/\/www.kirainet.com\/images\/voronoi9.jpg\" \/><\/p>\n<p>Si hab&eacute;is llegado hasta aqu&iacute;, ten&eacute;is premio: <a href=\"http:\/\/www.kirainet.com\/images\/voronoi\/PruebaApplet.html\">Un applet<\/a> donde haciendo clicks pod&eacute;is ir colocando las sedes de vuestra empresa y vais viendo en tiempo real la triangulaci&oacute;n de Delaunay y las regiones de Voronoi. Tambi&eacute;n pod&eacute;is generar muchos puntos d&aacute;ndole al bot&oacute;n <strong>Generar<\/strong>, con el que conseguir&eacute;is una imagen similar a la mostrada al inicio de este art&iacute;culo. A los programadores os pongo <a href=\"http:\/\/www.kirainet.com\/images\/voronoi\/source.zip\">el c&oacute;digo fuente<\/a> por si quieren trastear algo, os aviso que est&aacute;  muy poco documentado.<\/p>\n<p>Resumiendo, <strong>en geometr&iacute;a computacional las regiones de Voronoi son las zonas del plano m&aacute;s cercanas a un conjunto dado de puntos<\/strong>. Esto a nivel pr&aacute;ctico lo utilizan muchas empresas para definir sus zonas de cobertura. Por ejemplo, McDonalds lo utiliza para decidir donde tiene que poner una nueva sede. Tambi&eacute;n se utiliza en planes de prevenci&oacute;n de riesgos para saber a que zonas afectar&iacute;a un escape de una central nuclear.<\/p>\n<p>Tambi&eacute;n se utiliza en aplicaciones m&aacute;s art&iacute;sticas, como en la primera im&aacute;gen de este art&iacute;culo, la creaci&oacute;n de cristaleras etc. Tambi&eacute;n pod&eacute;is generar vuestras regiones de voronoi utilizando Photoshop: <strong>Filtro -&gt; Textura -&gt;Vidriera <\/strong>. Para aplicar ese filtro Photoshop internamente realizar la Triangulaci&oacute;n de Delaunay que hemos aprendido y posteriormente calcula las Regiones de Voronoi. Todos a crear Vidrieras y si no os queda algo claro preguntad <img src='http:\/\/www.kirainet.com\/wp-includes\/images\/smilies\/icon_smile.gif' alt=':)' class='wp-smiley' \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vamos a comentar intuitivamente uno de los algoritmos m&#225;s famosos y m&#225;s &#250;tiles de la geometr&#237;a computacional usando un ejemplo pr&#225;ctico. Aprenderemos a generar im&#225;genes como esta:<\/p>\n<p>Comenzamos la aventura. Imaginaros que tenemos una empresa de transporte con varias centrales de distribuci&#243;n, cada punto de la im&#225;gen representa uno de estos centros:<\/p>\n<p>Ahora imaginaros que debemos determinar [&#8230;]<\/p>\n","protected":false},"author":31,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1],"tags":[],"class_list":["post-392","post","type-post","status-publish","format-standard","hentry","category-otros"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p1YYAx-6k","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/posts\/392","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/users\/31"}],"replies":[{"embeddable":true,"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/comments?post=392"}],"version-history":[{"count":0,"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/posts\/392\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/media?parent=392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/categories?post=392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.robotic-lab.com\/blog\/wp-json\/wp\/v2\/tags?post=392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}