If you're seeing this message, it means we're having trouble loading external resources on our website.

Si estás detrás de un filtro de páginas web, por favor asegúrate de que los dominios *.kastatic.org y *.kasandbox.org estén desbloqueados.

Contenido principal

Ruido en dos dimensiones

Esta idea de valores de ruido que viven en un espacio unidimensional es importante porque nos lleva directo a una discusión sobre un espacio bidimensional. Pensemos acerca de esto por un momento. Con ruido unidimensional, tenemos una secuencia de valores en los que cualquier valor dado es parecido a su vecino. Como el valor está en una dimensión, solo tiene dos vecinos: un valor que viene antes que él (a la izquierda en la gráfica) y uno que viene después de él (a la derecha).
Imagen de la Naturaleza del Código
Figura I.10: Ruido unidimensional
Conceptualmente, el ruido bidimensional funciona exactamente de la misma manera. Por supuesto, la diferencia es que no estamos viendo valores a lo largo de una trayectoria lineal, sino que los valores están en una cuadrícula. Piensa en un pedazo de papel milimétrico con números escritos en cada celda. Un valor dado será parecido a todos sus vecinos: arriba, abajo, a la derecha, a la izquierda y a lo largo de cualquier diagonal.
Imagen de la Naturaleza del Código
Figura I.10: Ruido bidimensional
Si fueras a visualizar este papel milimétrico con cada valor mapeado al brillo de un color, obtendrías algo que se parece a las nubes. El blanco está al lado del gris claro, que está al lado del gris, que está al lado del gris oscuro, que está al lado del negro, que está al lado del gris oscuro, etc.
Imagen de la Naturaleza del Código
Por esto es por lo que el ruido fue inventado originalmente. Ajustas un poco los parámetros o juegas con el color para hacer que la imagen resultante se parezca más al mármol o la madera o a cualquier otra textura orgánica.
Echemos un vistazo rápido a cómo implementar ruido bidimensional en ProcessingJS. Si quisieras colorear aleatoriamente cada pixel de una ventana, necesitarías un bucle anidado, uno que accediera a cada pixel y escogiera un brillo aleatorio.
Para colorear cada pixel de acuerdo con la función noise(), haremos exactamente lo mismo, solo que en vez de llamar a random() llamaremos a noise().
var bright = map(noise(x,y), 0, 1, 0, 255);
Conceptualmente esto es un buen comienzo: te da un valor de ruido para cada posición (x, y) en nuestro espacio bidimensional. El problema es que esto no tendrá la calidad de nubosidad que queremos. Saltar del pixel 200 al pixel 201 es un salto demasiado grande a través del ruido. Recuerda, cuando trabajamos con ruido unidimensional, incrementamos nuestra variable por 0.01 en cada cuadro, ¡no por 1! Una muy buena solución a este problema es utilizar diferentes variables para los argumentos del ruido. Por ejemplo, podríamos incrementar una variable llamada xoff cada vez que nos movemos horizontalmente y una variable yoff cada vez que nos movemos verticalmente a través de los bucles anidados.
Examinamos varios usos tradicionales del ruido Perlin en esta lección. Con ruido unidimensional, utilizamos valores suaves para asignar la posición de un objeto para darle la apariencia de estar vagando. Con ruido bidimensional, creamos un patrón nublado con valores suavizados en un plano de pixeles. Sin embargo, es importante recordar que los valores del ruido Perlin son solo eso: valores. No están inherentemente atados a las posiciones de los pixeles o al color. Cualquier ejemplo en estas lecciones que tenga una variable podría ser controlado mediante ruido Perlin. Cuando modelamos una fuerza de viento, su intensidad podría ser controlada por ruido Perlin. Lo mismo pasa para los ángulos entre las ramas en el patrón de un árbol fractal, o la velocidad y dirección de objetos moviéndose a lo largo de una cuadrícula en una simulación de un campo de flujo, como en el programa a continuación.
Comenzamos la lección pasada hablando de cómo la aleatoriedad puede ser un soporte. En muchos sentidos, es la respuesta más obvia a los tipos de preguntas que hacemos continuamente: ¿cómo debe moverse este objeto? ¿De qué color debe ser? Sin embargo, esta respuesta obvia también puede ser una respuesta perezosa.
A medida que terminamos esta lección, también es importante destacar que podríamos fácilmente caer en la trampa de utilizar ruido Perlin como un soporte. ¿Cómo debe moverse este objeto? ¡Ruido Perlin! ¿De qué color debe ser? ¡Ruido Perlin! ¿Qué tan rápido debe crecer? ¡Ruido Perlin!
El punto de todo esto no es decir que debas o no utilizar la aleatoriedad. O que debas o no usar ruido Perlin. El punto es que las reglas de tu sistema son definidas por ti, y mientras más grande sea tu caja de herramientas, más opciones tendrás a medida que implementes esas reglas. El objetivo de estas lecciones es ayudarte a llenar tu caja de herramientas.  Si solo conoces un tipo de aleatoriedad, entonces todos tus diseños incluirán un único tipo de aleatoriedad. El ruido Perlin es otra herramienta para la aleatoriedad que puedes utilizar en tus programas. Después de un poco de práctica con el ruido Perlin vamos a pasar a otro tipo de herramienta: ¡vectores!

Este curso de "Simulaciones Naturales" es un derivado de "La Naturaleza del Código" por Daniel Shiffman, usado bajo una Licencia Creative Commons Reconocimiento-NoComercial 3.0 Unported.

¿Quieres unirte a la conversación?

  • Avatar male robot hal style para el usuario Rubén Jiménez
    Alguien podría explicar qué hay que hacer para que funcione el desafío del ruido animado?
    yo he puesto esto y no va:


    var xOff = 0.0;
    var zOff = 0.0;


    draw = function() {
    for (var x = 0; x < 100; x++) {
    var yOff = 0.0;
    for (var y = 0; y < 100; y++) {
    var bright = map(noise(xOff, yOff, zOff), 0, 1, 0, 255);
    stroke(bright, bright, bright);
    point(x, y);
    yOff += 0.01;
    }
    xOff += 0.01;
    }


    zOff+=0.01;
    };
    (3 votos)
    Avatar Default Khan Academy avatar para el usuario
    • Avatar leafers sapling style para el usuario jaime andres
      casi lo logras, mira como se declara var yOff = 0.0 dentro del bucle exterior entonces así mismo debería declararse var xOff = 0.0 dentro de la función draw

      var zOff = 0.0;
      draw = function() {
      var xOff = 0.0;
      for (var x = 0; x < 100; x++) {
      var yOff = 0.0;
      for (var y = 0; y < 100; y++) {
      var bright = map(noise(xOff, yOff, zOff), 0, 1, 0, 255);
      stroke(bright, bright, bright);
      point(x, y);
      yOff += 0.01;
      }
      xOff += 0.01;
      }
      zOff += 0.01;
      };


      saludos :D
      (13 votos)
¿Sabes inglés? Haz clic aquí para ver más discusiones en el sitio en inglés de Khan Academy.