{"id":2011,"date":"2019-07-10T18:00:16","date_gmt":"2019-07-10T16:00:16","guid":{"rendered":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/?page_id=2011"},"modified":"2019-08-17T23:11:21","modified_gmt":"2019-08-17T21:11:21","slug":"4-4-movimiento","status":"publish","type":"page","link":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/4-4-movimiento\/","title":{"rendered":"4.4. Movimiento"},"content":{"rendered":"<p>Seguro que record\u00e1is que hab\u00edamos visto ya que la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">draw()<\/span> se repite 60 veces por segundo. Y tambi\u00e9n que hab\u00edamos dicho que esto se puede cambiar. La funci\u00f3n que nos permite cambiar el n\u00famero de veces que se repite la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">draw()<\/span> por segundo se llama\u00a0<a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/frameRate\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">frameRate()<\/span><\/a>. Podemos usar esta funci\u00f3n de dos maneras diferentes:<\/p>\n<ol>\n<li>Podemos usarla para consultar cu\u00e1ntas veces por segundo se repite actualmente la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">draw()<\/span>.<\/li>\n<li>Tambi\u00e9n podemos usarla para fijar este valor.<\/li>\n<\/ol>\n<div class=\"featured featured-blue\"><p><strong><em>Frame rate<\/em><\/strong> o <a href=\"https:\/\/es.wikipedia.org\/wiki\/Fotogramas_por_segundo\" target=\"_blank\" rel=\"noopener\">fotogramas por segundo<\/a>, que es la traducci\u00f3n m\u00e1s habitual, es un concepto que viene del v\u00eddeo y se refiere al n\u00famero de im\u00e1genes que proyecta un reproductor de v\u00eddeo en un segundo. Es un concepto heredado de las pel\u00edculas anal\u00f3gicas, pero que se contin\u00faa usando en el v\u00eddeo y animaciones digitales. En el cine, para garantizar la continuidad de la imagen, se usan 24 fotogramas por segundo.<\/p>\n<\/div>\n<p>El ejemplo 8-1 del libro usa la primera opci\u00f3n; consultad el <span style=\"font-family: Courier, Arial;\">frameRate()<\/span> y mostrad el resultado de la consulta en la consola. Si lo us\u00e1is, ver\u00e9is que no siempre da el mismo resultado, que va variando entre 55 y 65 aproximadamente.<\/p>\n<div class=\"featured featured-grey\"><\/p>\n<p><strong>Fotogramas a p5.js<\/strong><\/p>\n<p>p5.js intenta que el n\u00famero de fotogramas por segundo sean 60. Pero esto depende de muchas cosas: la velocidad del procesador, de todo aquello que se est\u00e9 ejecutando en el ordenador, del navegador (no todos los navegadores ejecutan JavaScript del mismo modo), del c\u00f3digo que haya dentro de <span style=\"font-family: Courier, Arial;\">draw()<\/span>. p5.js tiene que \u00abpelearse\u00bb con todas estas posibilidades para conseguir que el n\u00famero de fotogramas sea el indicado y se mantenga estable. Esto es bastante complicado y por eso el valor fluct\u00faa.<\/p>\n<p>\n<\/div>\n<p>En el ejemplo 8-2 se a\u00f1ade, a la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">setup()<\/span> la segunda opci\u00f3n y nos sugiere cambiar el valor de fotogramas por segundo a n\u00fameros m\u00e1s bajos. Hacedlo y comprobad c\u00f3mo se comporta a diferentes velocidades.<\/p>\n<h2><span lang=\"es\">Velocidad y direcci\u00f3n<\/span><\/h2>\n<p>Nuestras animaciones tendr\u00e1n diferentes objetos que se pueden mover a diferentes velocidades, de forma que teniendo el n\u00famero de fotogramas por segundo de base, tendremos que usar variables para determinar la velocidad de cada objeto. Una cosa parecida pasar\u00e1 con la direcci\u00f3n en que se mueven los objetos.<\/p>\n<p>El ejemplo 8-3 es un buen ejemplo de movimiento fluido donde usamos una variable, <span style=\"font-family: Courier, Arial;\">speed<\/span>, para determinar la velocidad del objeto. Modificando el valor de esta variable, el objeto se mueve m\u00e1s r\u00e1pido o m\u00e1s despacio (probad a modificar el valor de\u00a0<span style=\"font-family: Courier, Arial;\">speed<\/span> a 1 y a 0.25).<\/p>\n<p>El movimiento va de izquierda a derecha gracias a la modificaci\u00f3n de la variable <strong>x<\/strong>, que nos marca la posici\u00f3n horizontal. Cuando la <strong>x<\/strong> tiene un valor superior al l\u00edmite derecho del <em>canvas<\/em>, el objeto se deja de ver.<\/p>\n<p>Un \u00faltimo detalle interesante, a pesar de que ya lo hab\u00edamos visto, es el hecho de que pintando el fondo de nuevo cada vez, borramos la figura ya dibujada antes de dibujar una nueva.<\/p>\n<p>A partir de este ejemplo b\u00e1sico, se pueden hacer variaciones. As\u00ed, el ejemplo 8-4 hace que, cuando la variable <strong>x<\/strong> tiene un valor m\u00e1s grande que la medida horizontal del canvas m\u00e1s el radio de la figura (esto quiere decir que la figura habr\u00e1 desaparecido), le pone el valor inicial para que vuelva a salir por la derecha. Esta variaci\u00f3n se hace con este c\u00f3digo:<\/p>\n<pre>if (x &gt; width+radius) { \/\/ Si la imagen sale del canvas\r\n x = -radius;     \/\/ la movemos a la izquierda.\r\n}<\/pre>\n<p>Y el ejemplo 8-5 hace que rebote al llegar al final. Como pod\u00e9is ver, el rebotar son dos cosas: primero, cambiar la direcci\u00f3n (que no es m\u00e1s que hacer la velocidad negativa) y, segundo, cambiar la figura para que la boca apunte a la derecha.<\/p>\n<pre>x += speed * direction; \/\/ Si direction es 1 se mueve de izquierda\r\n            \/\/ a derecha.\r\n            \/\/ Si direction es -1 se mueve de derecha\r\n            \/\/ a izquierda.\r\nif ((x &gt; width - radius) || (x &lt; radius)) {\r\n direction = -direction; \/\/ Cambiar la direcci\u00f3n\r\n}\r\nif (direction == 1) {\r\n arc(x, 60, radius, radius, 0.52, 5.76); \/\/ Hacia la derecha\r\n} else {\r\n arc(x, 60, radius, radius, 3.67, 8.9); \/\/ Hacia la izquierda\r\n}<\/pre>\n<h2><span lang=\"es\">Movi\u00e9ndose en cualquier direcci\u00f3n<\/span><\/h2>\n<p>Mover un objeto de derecha a izquierda es f\u00e1cil. En general, cualquier movimiento horizontal o vertical ser\u00e1 f\u00e1cil de simular porque solo habr\u00e1 que modificar la posici\u00f3n <strong>x<\/strong> o la posici\u00f3n <strong>y<\/strong>. Pero si queremos mover un objeto en una direcci\u00f3n que no sea la horizontal o la vertical, habr\u00e1 que modificar <strong>x<\/strong> e <strong>y<\/strong> de forma que el movimiento parezca suave, por lo que habr\u00e1 que calcular qu\u00e9 posici\u00f3n tendr\u00e1 que tener el objeto en cada momento.<\/p>\n<div class=\"featured featured-blue\"><p>Este c\u00e1lculo que nos permite dibujar el objeto donde toca cuando toca recibe el nombre, en ingl\u00e9s, de <strong><em>tweening<\/em><\/strong>, y en castellano le llamamos\u00a0<a href=\"https:\/\/dle.rae.es\/srv\/search?m=30&amp;w=interpolar\" target=\"_blank\" rel=\"noopener\"><strong>interpolar<\/strong><\/a> (poner una cosa entre otras).<\/p>\n<\/div>\n<p>Viendo el c\u00f3digo del ejemplo 8-6 del libro nos puede parecer que la interpolaci\u00f3n es una cosa complicada. Pero no es as\u00ed; vamos a ver el ejemplo paso a paso para ver que no es complicado.<\/p>\n<p><strong><div class=\"featured featured-grey\"><p><\/strong><\/p>\n<p><strong>Fe de erratas<\/strong><\/p>\n<p>En el libro hay un error en la instrucci\u00f3n<\/p>\n<pre>y = startY + ((stopY-startX) * pct);<\/pre>\n<p>como estamos calculando la posici\u00f3n de la <strong>y<\/strong>, <span style=\"font-family: Courier, Arial;\">startX<\/span> tendr\u00eda que ser en realidad\u00a0<span style=\"font-family: Courier, Arial;\">startY<\/span> y, por lo tanto, la instrucci\u00f3n tendr\u00eda que ser esta:<\/p>\n<pre>y = startY + ((stopY-startY) * pct);<\/pre>\n<p>Usaremos esta versi\u00f3n corregida en esta gu\u00eda.<\/p>\n<\/div><\/p>\n<p>Lo primero que hace el ejemplo es declarar las variables que usa: \u00a1ocho! Bien, vamos a hacer un repaso de qu\u00e9 hace cada una de ellas. Empezamos por las cuatro primeras, que son las m\u00e1s f\u00e1ciles de entender; indican la posici\u00f3n inicial y final del objeto:<\/p>\n<pre>var startX = 20; \/\/ Indica la posici\u00f3n x inicial\r\nvar stopX = 160; \/\/ Indica la posici\u00f3n x final \r\nvar startY = 30; \/\/ Indica la posici\u00f3n y inicial\r\nvar stopY = 80; \/\/ Indica la posici\u00f3n y final<\/pre>\n<p>Las dos siguientes tambi\u00e9n son f\u00e1ciles de entender: indican la posici\u00f3n actual del objeto:<\/p>\n<pre>var x = startX; \/\/ Posici\u00f3n x actual\r\nvar y = startY; \/\/ Posici\u00f3n y actual<\/pre>\n<p>Solo nos quedan dos que son algo m\u00e1s complicadas:<\/p>\n<pre>var step = 0.005; \/\/ Tama\u00f1o de cada paso que daremos (de 0.0 hasta 1.0)\r\nvar pct = 0.0;  \/\/ Porcentaje ya hecho (0.0 to 1.0)<\/pre>\n<p>De las dos variables, <span style=\"font-family: Courier, Arial;\">pct<\/span> es quiz\u00e1s la m\u00e1s clara. Nos indica qu\u00e9 porcentaje de recorrido hemos hecho. Empezaremos por 0 (por eso, siempre la inicializaremos a 0.0) y acabaremos cuando sea 1.0.<\/p>\n<p><span style=\"font-family: Courier, Arial;\">step<\/span> es la variable quiz\u00e1s m\u00e1s complicada de entender. Determina el tama\u00f1o de cada paso que daremos y, en la pr\u00e1ctica, cu\u00e1ntos pasos haremos para ir de un lugar al otro. Si nos fijamos en el c\u00f3digo que hay en la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">draw()<\/span>, en cada vuelta el porcentaje que hemos avanzado incrementa la cantidad guardada en la variable <span style=\"font-family: Courier, Arial;\">step<\/span>.<\/p>\n<p>Como vamos de 0 a 1 en incrementos de 0.005, en realidad esto significa que haremos 200 pasos antes de llegar al destino (0.005 * 200 \u21d2 1).<\/p>\n<p>Vemos ahora el c\u00f3digo de la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">draw()<\/span>:<\/p>\n<pre>function draw() {\r\n background(0);\r\n if (pct &lt; 1.0) {\r\n  x = startX + ((stopX-startX) * pct); \/\/ nueva posici\u00f3n x\r\n  y = startY + ((stopY-startY) * pct); \/\/ nueva posici\u00f3n y\r\n  pct += step;\r\n }\r\n ellipse(x, y, 20, 20);\r\n}<\/pre>\n<p>Vamos a hacer una breve simulaci\u00f3n de c\u00f3mo funcionar\u00eda el programa:<\/p>\n<p>Valores iniciales:<\/p>\n<pre>var startX = 20; \/\/ Indica la posici\u00f3n x inicial\r\nvar stopX = 160; \/\/ Indica la posici\u00f3n x final \r\nvar startY = 30; \/\/ Indica la posici\u00f3n y inicial\r\nvar stopY = 80; \/\/ Indica la posici\u00f3n y final \r\nvar step = 0.005; \/\/ Tama\u00f1o de cada paso que daremos (de 0.0 hasta 1.0)\r\nvar pct = 0.0;  \/\/ Porcentaje ya hecho (0.0 to 1.0)<\/pre>\n<table>\n<thead>\n<tr>\n<th>N.\u00ba ejecuciones<br \/>\n<span style=\"font-family: Courier, Arial;\"> draw()<\/span><\/th>\n<th>Valores de la variable<br \/>\n<span style=\"font-family: Courier, Arial;\"> pct<\/span><br \/>\nal entrar en la funci\u00f3n<br \/>\n<span style=\"font-family: Courier, Arial;\"> draw()<\/span><\/th>\n<th>Valores de las variables <em>x<\/em> e <em>y<\/em> calculadas dentro del<br \/>\n<span style=\"font-family: Courier, Arial;\"> if<br \/>\nx = startX + ((stopX-startX) * pct);<br \/>\ny = startY + ((stopY-startY) * pct);<\/span><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>0<\/td>\n<td><em>x<\/em> = 20 + ((160 &#8211; 20) * 0) \u21d2 0<br \/>\n<em>y<\/em> = 30 + ((80 &#8211; 30) * 0) \u21d2 0<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>0.005<\/td>\n<td><em>x<\/em> = 20 + ((160 &#8211; 20) * 0.005) \u21d2 20.7 (21)<br \/>\n<em>y<\/em> = 30 + ((80 &#8211; 30) * 0.005) \u21d2 30.25 (30)<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>0.010<\/td>\n<td><em>x<\/em> = 20 + ((160 &#8211; 20) * 0.010) \u21d2 21.4 (21)<br \/>\n<em>y<\/em> = 30 + ((80 &#8211; 30) * 0.010) \u21d2 30.5 (31)<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>0.015<\/td>\n<td><em>x<\/em> = 20 + ((160 &#8211; 20) * 0.015) \u21d2 22.1 (22)<br \/>\n<em>y<\/em> = 30 + ((80 &#8211; 30) * 0.015) \u21d2 30.75 (31)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Cada posici\u00f3n de <em>x<\/em> la calculamos sumando a la posici\u00f3n inicial la distancia a recorrer (posici\u00f3n final menos posici\u00f3n inicial), multiplicado por el porcentaje que hemos recorrido.<\/p>\n<p>Como trabajamos en p\u00edxeles (y los p\u00edxeles no se pueden dividir), el ordenador autom\u00e1ticamente hace un redondeo, que es el valor que hemos puesto entre par\u00e9ntesis junto al resultado.<\/p>\n<h3><span lang=\"es\">Ejercicios<\/span><\/h3>\n<p>Para entender bien este ejemplo, vale la pena probar a cambiar algunas cosas. Aqu\u00ed van unas cuantas propuestas:<\/p>\n<ul>\n<li>Cambi\u00e1is el origen y el final. \u00bfQu\u00e9 pasa cuando la\u00a0<strong>x<\/strong> del origen (variable <span style=\"font-family: Courier, Arial;\">startX<\/span>)\u00a0es m\u00e1s grande que la <strong>x<\/strong> de destino (variable <span style=\"font-family: Courier, Arial;\">stopX<\/span>)?<\/li>\n<\/ul>\n<p>Para entender mejor c\u00f3mo funciona esto de los pasos, a\u00f1adiremos una variable m\u00e1s a la que llamaremos <span style=\"font-family: Courier, Arial;\">numeroP<\/span>. En esta variable guardaremos el n\u00famero de pasos que queremos hacer desde el inicio hasta el final. La declaraci\u00f3n de variables tendr\u00e1 que quedar de este modo:<\/p>\n<pre>var startX = 20; \/\/ Indica la posici\u00f3n x inicial\r\nvar stopX = 160; \/\/ Indica la posici\u00f3n x final  \r\nvar startY = 30; \/\/ Indica la posici\u00f3n y inicial\r\nvar stopY = 80; \/\/ Indica la posici\u00f3n y final \r\n<span style=\"color: red; font-weight: bold;\">var numeroP = 200;<\/span> \/\/ N\u00famero de pasos a hacer entre los dos puntos.\r\n<span style=\"color: red; font-weight: bold;\">var step = 1.0 \/ numeroP;<\/span> \/\/ Tama\u00f1o de cada paso\r\nvar pct = 0.0;  \/\/ Porcentaje ya hecho (0.0 to 1.0)\r\n\r\n<\/pre>\n<p>Con\u00a0<span style=\"font-family: Courier, Arial;\">numeroP<\/span> igual a 200 estamos igual que en el enunciado inicial (<span style=\"font-family: Courier, Arial;\">step<\/span> tendr\u00e1 el valor de 0.005). Cambiad el n\u00famero de pasos para ver qu\u00e9 cambios se producen.<\/p>\n<h2><span lang=\"es\">Movimiento aleatorio<\/span><\/h2>\n<p>Ya hemos visto c\u00f3mo la funci\u00f3n\u00a0<a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/random\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">random()<\/span><\/a> nos permite crear n\u00fameros aleatorios. Como vimos, el primer par\u00e1metro que le pasamos es el valor m\u00ednimo y el segundo el valor m\u00e1ximo. Con la caracter\u00edstica de que el valor m\u00e1ximo no aparecer\u00e1 nunca. En matem\u00e1ticas lo expresamos as\u00ed: [min,max) (el m\u00ednimo incluido, el m\u00e1ximo excluido).<\/p>\n<p>Vamos a probar bien la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">random()<\/span>. Probad este c\u00f3digo (no necesitamos funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">setup()<\/span>):<\/p>\n<pre>function draw() {\r\n var r = random(0, 10);\r\n print(r);\r\n}<\/pre>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-266\" src=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_025.jpg\" alt=\"\" width=\"188\" height=\"247\" \/><\/p>\n<p>Este es el resultado: nos escribe n\u00fameros aleatorios entre 0 y 10; 60 por segundo. Son n\u00fameros con muchos decimales.<\/p>\n<p>Demos un paso m\u00e1s, qued\u00e9monos solo con la parte entera:<\/p>\n<pre>function draw() {\r\n\u00a0var r = int(random(0, 10));\r\n\u00a0print(r);\r\n}<\/pre>\n<p>Ahora los n\u00fameros que nos da son m\u00e1s comprensibles:<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-267\" src=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_027.jpg\" alt=\"\" width=\"47\" height=\"238\" \/><\/p>\n<p>Demos un paso m\u00e1s, calculando el m\u00e1ximo y el m\u00ednimo. Este c\u00f3digo os tendr\u00eda que resultar f\u00e1cil de entender:<\/p>\n<pre>var maxim = 0;\r\nvar minim = 99;\r\n\r\nfunction draw() {\r\n var r = int(random(0, 10));\r\n if (r &gt; maxim) {\r\n  maxim = r;\r\n  print(\"Nou m\u00e0xim: \",r);\r\n }\r\n if (r &lt; minim) {\r\n  minim = r;\r\n  print(\"Nou m\u00ednim: \",r);\r\n }\r\n}<\/pre>\n<p>Lo que escribe en la consola este c\u00f3digo es algo parecido a esto:<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-268\" src=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_029.jpg\" alt=\"\" width=\"162\" height=\"231\" \/><\/p>\n<p>Podemos probar con diferentes n\u00fameros de m\u00e1ximo y m\u00ednimo para ver c\u00f3mo funciona.<\/p>\n<p>Ahora tenemos bastante claro el modo en que funciona la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">random()<\/span>, ahora podemos probar el ejemplo 8-7 del libro. Es muy parecido a nuestro ejemplo, pero pone como m\u00e1ximo la\u00a0posici\u00f3n\u00a0<strong>x<\/strong> del rat\u00f3n.<\/p>\n<p>El ejemplo 8-8 es bastante interesante porque genera un efecto muy efectivo. Veamos el c\u00f3digo y coment\u00e9moslo un poco:<\/p>\n<pre>function setup() {\r\n createCanvas(240, 120);\r\n}\r\nfunction draw() {\r\n background(204);\r\n for (var x = 20; <span style=\"color: red; font-weight: bold;\">x &lt; width<\/span>; <span style=\"color: green; font-weight: bold;\">x += 20<\/span>) {\r\n  var mx = mouseX \/ 10;\r\n  var offsetA = random(-mx, mx);\r\n  var offsetB = random(-mx, mx);\r\n  line(<span style=\"color: #bb9017; font-weight: bold;\">x<\/span> + <span style=\"color: #f835fc; font-weight: bold;\">offsetA<\/span>, 20, <span style=\"color: #4a86e8; font-weight: bold;\">x<\/span> - <span style=\"color: #f835fc; font-weight: bold;\">offsetB<\/span>, 100);\r\n }\r\n}<\/pre>\n<p>Lo que hace este c\u00f3digo es, antes que nada, guardar en la variable <span style=\"font-family: Courier, Arial;\">mx<\/span> el valor <strong>x<\/strong> de la posici\u00f3n del rat\u00f3n dividido por 10 (divide por 10 para que los cambios sean m\u00e1s suaves). Probad qu\u00e9 pasa si dividimos por 2, por 100 o no dividimos.<\/p>\n<p>La posici\u00f3n del rat\u00f3n se usa para crear todas\u00a0<span style=\"color: red;\">las l\u00edneas que quepan dentro del\u00a0<em>canvas<\/em><\/span>, pero\u00a0<span style=\"color: green;\">separadas 20 p\u00edxels<\/span> entre ellas.<\/p>\n<p>Al pintar cada l\u00ednea, en la\u00a0<span style=\"color: #bb9017;\"><strong>x<\/strong> del inicio<\/span> y en la\u00a0<span style=\"color: #4a86e8;\"><strong>x <\/strong>del final<\/span> les a\u00f1adimos o restamos un <span style=\"color: #f835fc;\">valor calculado aleatoriamente<\/span>.<\/p>\n<p>El ejemplo 8-9 va un paso m\u00e1s all\u00e1 y hace todo el movimiento de manera aleatoria. Inicialmente dibuja el c\u00edrculo en medio del <em>canvas<\/em> (independientemente del tama\u00f1o del <em>canvas<\/em>) y despu\u00e9s el c\u00edrculo se va moviendo dependiendo de dos valores (uno para <strong>x<\/strong> y otro para <strong>y<\/strong>) calculados aleatoriamente.<\/p>\n<p>Como siempre, es aconsejable probar el ejemplo y cambiar cosas como por ejemplo el tama\u00f1o del <em>canvas<\/em> (para comprobar que siempre se empieza desde el centro), la velocidad o el di\u00e1metro del c\u00edrculo.<\/p>\n<h2><span lang=\"es\">Temporizadores<\/span><\/h2>\n<p>p5.js cuenta el tiempo desde que se inicia la ejecuci\u00f3n de nuestro programa. Nosotros podemos consultar el tiempo pasado desde el inicio mediante la funci\u00f3n\u00a0<a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/millis\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">millis()<\/span><\/a>. El ejemplo 8-10 nos permite ver c\u00f3mo va pasando el tiempo. La\u00a0funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">millis()<\/span> nos devuelve el tiempo en milisegundos, lo que quiere decir que 1000 \u21d2 1 segundo.<\/p>\n<p>El uso de la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">millis()<\/span> nos permite hacer que en nuestro programa pasen cosas en un momento determinado. El ejemplo 8-11 es un caso de ello. A continuaci\u00f3n, ten\u00e9is otro ejemplo que comentaremos paso a paso. B\u00e1sicamente, es un c\u00edrculo que se hace m\u00e1s grande cada segundo, hasta que llega a un di\u00e1metro de 200. A partir de este momento se va haciendo m\u00e1s peque\u00f1o cada vez, hasta llegar a un di\u00e1metro de 0 que vuelve a crecer.<\/p>\n<pre>var diametro = 0;\r\nvar crece  = true; \/\/ Variable que determina si el c\u00edrculo tiene que\r\n          \/\/ crecer o decrecer\r\n\r\nfunction setup() {\r\n createCanvas(480, 480);\r\n}\r\nfunction draw() {\r\n var currentTime = millis(); \/\/ Guardamos el tiempo actual\r\n background(204);\r\n if (currentTime % 1000 &gt; 900) { \/\/ Calculamos el residuo de dividir \r\n                 \/\/ por 1000\r\n  if (diametro == 200) {  \/\/ Si llegamos a 200 toca decrecer\r\n   crece = false;\r\n  }\r\n  if (diametro == 0) { \/\/ Si llegamos a 0 volver a crecer\r\n   crece = true;\r\n  }\r\n  if (crece) {\r\n   diametro++;\r\n  } else { \r\n   diametro--;\r\n  }\r\n }\r\n ellipse(width\/2, height\/2, diametro, diametro);\r\n}<\/pre>\n<p>Este ejemplo es muy sencillo y es f\u00e1cil ver c\u00f3mo funciona. La \u00fanica dificultad est\u00e1 en el hecho de usar el residuo de la divisi\u00f3n por 1000.<\/p>\n<h2><span lang=\"es\">Movimiento circular<\/span><\/h2>\n<p>Vamos a ver c\u00f3mo hacer mover objetos por el <em>canvas<\/em>, usando un movimiento circular. Para hacerlo, usaremos las funciones <span style=\"font-family: Courier, Arial;\">sen()<\/span> y <span style=\"font-family: Courier, Arial;\">cos()<\/span> que corresponden al seno y al coseno. Como no podemos explicar trigonometr\u00eda aqu\u00ed, nos tendremos que conformar sabiendo que estas funciones devuelven valores de entre -1 y 1.<\/p>\n<p>Aqu\u00ed ten\u00e9is un ejemplo que nos permite hacernos una idea de c\u00f3mo podemos usar las funciones senos y cosenos:<\/p>\n<pre>var x = 0.0;\r\n\r\nfunction setup() {\r\n createCanvas(400, 400);\r\n strokeWeight(4);\r\n}\r\n\r\nfunction draw() {\r\n stroke(0);\r\n point(x*10,sin(x)*50+200);\r\n stroke(255,0,0)\r\n point(x*10,cos(x)*50+200);\r\n x=x+0.08;\r\n}<\/pre>\n<p>Este c\u00f3digo da como resultado este dibujo:<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-269\" src=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_031.jpg\" alt=\"\" width=\"423\" height=\"147\" srcset=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_031.jpg 423w, http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_031-300x104.jpg 300w\" sizes=\"(max-width: 423px) 100vw, 423px\" \/><\/p>\n<p>Donde la funci\u00f3n seno se ha dibujado en negro y la coseno en rojo.<\/p>\n<p>Pues bien, estas dos funciones se pueden usar para varias cosas. Por ejemplo, en el ejemplo 8-12 se usa para generar una sensaci\u00f3n de oscurecimiento y aclaraci\u00f3n del color del cuadro. En este c\u00f3digo se usa la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">map()<\/span> que, recordar\u00e9is, nos permite hacer un cambio de escala de un valor. As\u00ed, como la funci\u00f3 <span style=\"font-family: Courier, Arial;\">sen()<\/span>\u00a0devuelve un valor que va desde -1 hasta 1 y se quiere tener un n\u00famero que vaya desde 0 (negro) hasta 255 (blanco), queremos convertir el resultado de calcular el seno en un color.<\/p>\n<pre>var sinval = sin(angle);\r\nprint(sinval);\r\n<strong>var gray = map(sinval, -1, 1, 0, 255);<\/strong>\r\nbackground(gray);<\/pre>\n<p>El ejemplo 8-13 nos muestra c\u00f3mo se puede usar la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">sen()<\/span>para generar movimiento.<\/p>\n<p>Combinando la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">sen()<\/span> y la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">cos()<\/span> para dar valor a <strong>x<\/strong> e <strong>y<\/strong>, podemos hacer movimientos circulares. El ejemplo 8-14 aprovecha esta posibilidad. Modificamos y comentamos el ejemplo del libro.<\/p>\n<pre>var angle = 0.0; \r\nvar offset = 120; \/\/ El centro del movimiento circular.  \r\n         \/\/ x = 120 i y = 120 es el centro del canvas.\r\nvar scalar = 50; \/\/ Un valor m\u00e1s grande dibuja un c\u00edrculo m\u00e1s grande\r\nvar speed = 0.05;\r\nfunction setup() {\r\n createCanvas(240, 240);\r\n background(204);\r\n}\r\nfunction draw() {\r\n var x = offset + cos(angle) * scalar;\r\n var y = offset + sin(angle) * scalar;\r\n ellipse(x, y, 40, 40);\r\n angle += speed;\r\n}<\/pre>\n<p>El \u00faltimo ejemplo de este cap\u00edtulo es el 8-15, que no es complicado. Este dibuja una espiral. El punto clave est\u00e1 en la variable <span style=\"font-family: Courier, Arial;\">scalar<\/span>, que cambia en cada vuelta y multiplica el resultado del seno y coseno.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seguro que record\u00e1is que hab\u00edamos visto ya que la funci\u00f3n\u00a0draw() se repite 60 veces por segundo. Y tambi\u00e9n que hab\u00edamos dicho que esto se puede cambiar. La funci\u00f3n que nos permite cambiar el n\u00famero de veces que se repite la funci\u00f3n\u00a0draw() por segundo se llama\u00a0frameRate(). Podemos usar esta funci\u00f3n de dos maneras diferentes: Podemos usarla [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false},"acf":[],"_links":{"self":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages\/2011"}],"collection":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/comments?post=2011"}],"version-history":[{"count":26,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages\/2011\/revisions"}],"predecessor-version":[{"id":3996,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages\/2011\/revisions\/3996"}],"wp:attachment":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/media?parent=2011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}