{"id":408,"date":"2022-10-06T09:53:11","date_gmt":"2022-10-06T07:53:11","guid":{"rendered":"http:\/\/quadern-programacio.recursos.uoc.edu\/?page_id=408"},"modified":"2022-10-06T09:53:11","modified_gmt":"2022-10-06T07:53:11","slug":"5-7-bucles-y-condicionales","status":"publish","type":"page","link":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/5-7-bucles-y-condicionales\/","title":{"rendered":"5.7. Bucles y condicionales"},"content":{"rendered":"<p>Pasemos ahora a combinar las dos estructuras de control que hemos aprendido en este tema y en el anterior: la iteraci\u00f3n y las estructuras condicionales.<\/p>\n<p>Igual que hicimos en el tema pasado con el uso de la aleatoriedad para hacer que nuestros patrones fuesen m\u00e1s org\u00e1nicos, con el uso de las estructuras condicionales abrimos un mundo de nuevas posibilidades que pueden hacer nuestros dise\u00f1os mucho m\u00e1s interesantes.<\/p>\n<p>Partamos de un ejemplo sencillo y vayamos implementando los nuevos conocimientos que hemos adquirido:<\/p>\n<figure id=\"attachment_154\" aria-describedby=\"caption-attachment-154\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-154\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_060.jpg\" alt=\"\" width=\"800\" height=\"448\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_060.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_060-300x168.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_060-768x430.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-154\" class=\"wp-caption-text\">Figura 61. Patr\u00f3n con condicional<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>En este ejemplo estamos creando un patr\u00f3n de c\u00edrculos mediante bucles <span class=\"courier\">for<\/span> anidados. La novedad la tenemos en que dentro del bucle hemos incluido una estructura condicional que solo dibuja el c\u00edrculo que toca cuando se cumple que <span class=\"courier\">random()<\/span> (recordemos que si no le pasamos ning\u00fan par\u00e1metro, devuelve valores decimales entre 0 y 1) sea mayor que la variable <span class=\"courier\">prob<\/span>, a la que en el principio del <em>sketch<\/em> le hemos asignado el valor 0,5. Es como si cada vez que tocase dibujar un c\u00edrculo tir\u00e1semos una moneda al aire: si sale cara dibujamos el c\u00edrculo, si sale cruz no lo dibujamos.<\/p>\n<p>Podr\u00edamos cambiar el valor de la variable <span class=\"courier\">prob<\/span> para que la probabilidad de dibujar o no el c\u00edrculo cambie; veamos c\u00f3mo queda el dibujo con distintos valores:<\/p>\n<p><figure id=\"attachment_156\" aria-describedby=\"caption-attachment-156\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-156\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_061.jpg\" alt=\"\" width=\"800\" height=\"262\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_061.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_061-300x98.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_061-768x252.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-156\" class=\"wp-caption-text\">Figura 62. <span class=\"courier\">prob = 0,2<\/span>; <span class=\"courier\">prob = 0,5<\/span>; <span class=\"courier\">prob = 0,9<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>Ahora mismo tenemos puesto un <span class=\"courier\">noLoop()<\/span> que impide que el patr\u00f3n se redibuje en cada <em>frame<\/em>, pero podr\u00edamos poner un temporizador para que el patr\u00f3n se redibuje cuando transcurra un segundo:<\/p>\n<figure id=\"attachment_158\" aria-describedby=\"caption-attachment-158\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-158\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_062.jpg\" alt=\"\" width=\"800\" height=\"555\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_062.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_062-300x208.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_062-768x533.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-158\" class=\"wp-caption-text\">Figura 63. Redibujando el patr\u00f3n con un temporizador<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>Hemos encapsulado todo el c\u00f3digo que dibuja el patr\u00f3n en la funci\u00f3n <span class=\"courier\">drawPattern()<\/span> y estamos invoc\u00e1ndola \u00fanicamente cuando <span class=\"courier\">frameCount % 60 == 0<\/span>, es decir, cada vez que pase un segundo. Ya podemos eliminar el <span class=\"courier\">noLoop()<\/span> y nuestro patr\u00f3n se redibujar\u00e1 cada vez que transcurra un segundo.<\/p>\n<p>Podr\u00edamos tambi\u00e9n hacer que la probabilidad cambiase cada vez que el patr\u00f3n se dibuje. Para ello, podemos pasarle un valor aleatorio entre 0 y 1 a la funci\u00f3n <span class=\"courier\">drawPattern()<\/span> y utilizar este par\u00e1metro dentro de la funci\u00f3n:<\/p>\n<p><figure id=\"attachment_160\" aria-describedby=\"caption-attachment-160\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-160\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_063.jpg\" alt=\"\" width=\"800\" height=\"537\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_063.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_063-300x201.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_063-768x516.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-160\" class=\"wp-caption-text\">Figura 64. Pasando un valor aleatorio como par\u00e1metro a <span class=\"courier\">drawPattern()<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>Vemos ahora que, como a la definici\u00f3n de la funci\u00f3n <span class=\"courier\">drawPattern()<\/span> le hemos a\u00f1adido el par\u00e1metro <span class=\"courier\">prob<\/span>, que dentro de la funci\u00f3n utilizamos en el condicional para compararlo con el valor de <span class=\"courier\">coin<\/span>, cuando invocamos la funci\u00f3n cada segundo le pasamos a <span class=\"courier\">prob<\/span> un valor aleatorio entre 0 y 1. De esta manera, cada segundo la probabilidad de dibujar los c\u00edrculos cambia y tenemos patrones de distinta densidad.<\/p>\n<p>El siguiente paso que podemos llevar a cabo es dibujar una figura distinta cuando no se dibuje un c\u00edrculo. De esta manera, podemos darle mayor riqueza a nuestro patr\u00f3n. Para ello, podemos a\u00f1adir un <span class=\"courier\">else<\/span> a nuestro <span class=\"courier\">if<\/span> para que cuando no entre en el <span class=\"courier\">if<\/span> dibuje la nueva figura. Al cambiar la probabilidad cada segundo, tendremos mayor o menor prevalencia de una u otra figura.<\/p>\n<p><figure id=\"attachment_162\" aria-describedby=\"caption-attachment-162\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-162\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_064.jpg\" alt=\"\" width=\"800\" height=\"498\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_064.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_064-300x187.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_064-768x478.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-162\" class=\"wp-caption-text\">Figura 65. A\u00f1adiendo una nueva figura al patr\u00f3n con un <span class=\"courier\">else<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>Se ha a\u00f1adido a continuaci\u00f3n del <span class=\"courier\">if<\/span>, en el <span class=\"courier\">else<\/span>, el dibujo de una l\u00ednea en diagonal cruzando el punto <span class=\"courier\">(i, j)<\/span>. Para conservar la apariencia de los c\u00edrculos, tambi\u00e9n hemos movido el <span class=\"courier\">noStroke()<\/span> con el fin de que afecte \u00fanicamente al dibujo de los c\u00edrculos.<\/p>\n<p>Ahora ya tenemos un sistema generativo que nos crea patrones aleatorios con combinaciones pr\u00e1cticamente infinitas (con un patr\u00f3n de 20 \u00d7 20 figuras son un total de 2<sup>400 <\/sup>combinaciones, o lo que es lo mismo:<\/p>\n<p>255822500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 combinaciones posibles).<\/p>\n<p>Por \u00faltimo, podr\u00eda resultarnos \u00fatil tener una manera de ir guardando estas distintas combinaciones. Podr\u00edan ser, por ejemplo, variaciones de un dise\u00f1o para distintas aplicaciones: cartel impreso, <em>flyer<\/em>, publicaci\u00f3n en redes sociales, <em>banner<\/em> web, etc.<\/p>\n<p>Para poder guardar el resultado de nuestros <em>sketches<\/em> de P5 podemos usar el m\u00e9todo <span class=\"courier\">save()<\/span>, que nos permite almacenar nuestro <em>canvas<\/em> como una imagen PNG o JPG de la siguiente manera:<\/p>\n<pre>if (frameCount % 60 == 0){\r\n    drawPattern(random());\r\n    save(\u201cmyPattern.png\u201d);\r\n}<\/pre>\n<p>De este modo, cada vez que dibujemos el patr\u00f3n estaremos guard\u00e1ndolo en nuestro disco duro. Es probable que el navegador web muestre una advertencia diciendo que el sitio web est\u00e1 intentando guardar muchos archivos. En este caso, al estar guard\u00e1ndolas cada segundo no deber\u00eda resultar un problema, pero debemos tener cuidado cuando usemos el m\u00e9todo <span class=\"courier\">save()<\/span>, ya que si lo ponemos directamente en el <span class=\"courier\">draw()<\/span>, estaremos intentando guardar 60 im\u00e1genes por segundo desde el navegador y es muy probable que se bloquee.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pasemos ahora a combinar las dos estructuras de control que hemos aprendido en este tema y en el anterior: la iteraci\u00f3n y las estructuras condicionales. Igual que hicimos en el tema pasado con el uso de la aleatoriedad para hacer que nuestros patrones fuesen m\u00e1s org\u00e1nicos, con el uso de las estructuras condicionales abrimos un [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/408"}],"collection":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/comments?post=408"}],"version-history":[{"count":1,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/408\/revisions"}],"predecessor-version":[{"id":409,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/408\/revisions\/409"}],"wp:attachment":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/media?parent=408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}