{"id":392,"date":"2022-10-04T16:13:19","date_gmt":"2022-10-04T14:13:19","guid":{"rendered":"http:\/\/quadern-programacio.recursos.uoc.edu\/?page_id=392"},"modified":"2022-10-04T16:13:19","modified_gmt":"2022-10-04T14:13:19","slug":"4-4-bucles-anidados","status":"publish","type":"page","link":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/4-4-bucles-anidados\/","title":{"rendered":"4.4. Bucles anidados"},"content":{"rendered":"<p>Una t\u00e9cnica que se utiliza con mucha frecuencia en proyectos de computaci\u00f3n creativa es la de crear un bucle anidado dentro de otro para tener no una sucesi\u00f3n lineal de elementos como hemos hecho hasta ahora, sino un patr\u00f3n bidimensional, con elementos que se repiten tanto en el eje horizontal como en el vertical.<\/p>\n<figure id=\"attachment_128\" aria-describedby=\"caption-attachment-128\" style=\"width: 400px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-128\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_047.jpg\" alt=\"\" width=\"400\" height=\"400\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_047.jpg 400w, \/wp-content\/uploads\/2022\/10\/PID_00290094_047-300x300.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_047-150x150.jpg 150w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><figcaption id=\"caption-attachment-128\" class=\"wp-caption-text\">Figura 48. El patr\u00f3n que queremos dibujar<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>Un primer acercamiento para dibujar el patr\u00f3n de la figura 48 podr\u00eda ser crear un bucle para una fila (o columna) y repetirlo todas las veces que necesitemos:<\/p>\n<pre>\/\/ Fila 0 (0px en Y)\r\nfor (let i = 0; i &lt;= width; i += 50) {\r\n    circle(i, 0, 25);\r\n}\r\n\/\/ Fila 1 (50px en Y)\r\nfor (let i = 0; i &lt;= width; i += 50) {\r\n    circle(i, 50, 25);\r\n}\r\n\/\/ ...y as\u00ed para el resto de las filas<\/pre>\n<p>Sin embargo, ya ser\u00e9is capaces de detectar que seguramente haya una manera m\u00e1s eficiente y flexible de realizar esta tarea. Es aqu\u00ed donde entran en juego los bucles anidados:<\/p>\n<figure id=\"attachment_130\" aria-describedby=\"caption-attachment-130\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-130\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_048.jpg\" alt=\"\" width=\"800\" height=\"315\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_048.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_048-300x118.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_048-768x302.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-130\" class=\"wp-caption-text\">Figura 49. Bucles anidados<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>Centr\u00e9monos en c\u00f3mo hemos construido el set de bucles anidados:<\/p>\n<pre>let separation = 50;\r\nlet circleSize = separation * 0.5;\r\nfor (let i = 0; i &lt;= width; i += separation) {\r\n\tfor (let j = 0; j &lt;= height; j += separation) {\r\n\t\tcircle(i, j, circleSize);\r\n\t}\r\n}<\/pre>\n<p>Primero, hemos definido un par de variables que almacenan la distancia entre los c\u00edrculos y su tama\u00f1o. A continuaci\u00f3n, hemos creado un bucle de la misma manera que lo hicimos antes para dibujar una <strong>fila<\/strong> de c\u00edrculos: damos un valor de inicio, una condici\u00f3n que ese valor tiene que cumplir para ejecutar el cuerpo del bucle y una actualizaci\u00f3n del valor cada vez que el bucle se complete.<\/p>\n<p>La novedad estriba en que en el cuerpo del bucle hemos creado <strong>otro bucle<\/strong>. En este nuevo bucle creamos una nueva variable, una nueva condici\u00f3n y una nueva actualizaci\u00f3n, que nos ayudar\u00e1n a dibujar las <strong>columnas<\/strong> de nuestro patr\u00f3n.<\/p>\n<p>En el cuerpo de este segundo bucle es donde esta vez escribiremos el c\u00f3digo que dibujar\u00e1 los c\u00edrculos. Para definir las coordenadas <em>x<\/em> e <em>y<\/em> de los c\u00edrculos, utilizaremos los valores de las variables <span class=\"courier\">i<\/span> y <span class=\"courier\">j<\/span> que hemos definido en los respectivos bucles.<\/p>\n<p>De esta manera, entramos en el primer bucle e inmediatamente entramos en el segundo. En la primera iteraci\u00f3n <span class=\"courier\">i<\/span> vale 0 y <span class=\"courier\">j<\/span> tambi\u00e9n vale 0, por lo que nos dibujar\u00e1 el primer c\u00edrculo en las coordenadas (0, 0). A continuaci\u00f3n, actualiza el valor de <span class=\"courier\">j<\/span> y, como se cumple que <span class=\"courier\">j &lt;= height<\/span>, entramos de nuevo en el segundo bucle. Ahora <span class=\"courier\">j<\/span> vale 50 e <span class=\"courier\">i<\/span> sigue valiendo 0, por lo que nos dibujar\u00e1 el segundo c\u00edrculo en las coordenadas (0, 50). La variable <span class=\"courier\">j<\/span> seguir\u00e1 increment\u00e1ndose hasta que <span class=\"courier\">j &lt;= height<\/span> no se cumpla, momento en el que saldr\u00e1 del segundo bucle y pasar\u00e1 a la fase de actualizaci\u00f3n del primer bucle, incrementando <span class=\"courier\">i<\/span>, por lo que pasaremos a tener una <span class=\"courier\">i<\/span> con valor 50 y entraremos de nuevo en el segundo bucle con una <span class=\"courier\">j<\/span> valor 0. De esta manera, nos crear\u00e1 la segunda columna. Este proceso se repetir\u00e1 hasta rellenar todo el <em>canvas<\/em>.<\/p>\n<p>De nuevo, podemos usar nuestra funci\u00f3n <span class=\"courier\">eye()<\/span> para dibujar los ojos dentro de los bucles anidados:<\/p>\n<figure id=\"attachment_132\" aria-describedby=\"caption-attachment-132\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-132\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_049.jpg\" alt=\"\" width=\"800\" height=\"460\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_049.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_049-300x173.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_049-768x442.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-132\" class=\"wp-caption-text\">Figura 50. La funci\u00f3n <span class=\"courier\">eye()<\/span> dentro de bucles anidados<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Una t\u00e9cnica que se utiliza con mucha frecuencia en proyectos de computaci\u00f3n creativa es la de crear un bucle anidado dentro de otro para tener no una sucesi\u00f3n lineal de elementos como hemos hecho hasta ahora, sino un patr\u00f3n bidimensional, con elementos que se repiten tanto en el eje horizontal como en el vertical. 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\/392"}],"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=392"}],"version-history":[{"count":1,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/392\/revisions"}],"predecessor-version":[{"id":393,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/392\/revisions\/393"}],"wp:attachment":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/media?parent=392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}