Programación creativa en procesamiento | Juego 2 (atractor de Lorenz)

Programación creativa en procesamiento | Conjunto 1 (Caminante aleatorio)
El sistema de Lorenz es un sistema de ecuaciones diferenciales ordinarias estudiado por primera vez por Edward Norton Lorenz, un matemático y meteorólogo estadounidense alrededor de 1963. Se destaca por tener soluciones caóticas para ciertos valores de parámetros y condiciones iniciales. Se derivó de un modelo simplificado de convección en la atmósfera terrestre. También surge de forma natural en modelos de láseres y dínamos. El atractor de Lorenz es un conjunto de soluciones caóticas del sistema de Lorenz que, cuando se trazan, se asemejan a una mariposa o un ocho. La siguiente imagen apareció en la revista Nature el 31 de agosto de 2000, página 949 como parte de un artículo titulado The Lorenz Attractor Exists, escrito por Ian Stewart.

El sistema de atracción de Lorenz se expresa más comúnmente como 3 ecuaciones diferenciales no lineales acopladas:

  • dx / dt = a (y - x)
  • dy / dt = x (b - z) - y
  • dz / dt = xy - c z

En el conjunto de ecuaciones anterior, ‘a’ a veces se conoce como número de Prandtl y ‘b’ como número de Rayleigh. Un conjunto de constantes de uso común es a = 10, b = 28, c = 8/3. Otro es a = 28, b = 46,92, c = 4.

Ejemplo de implementación de las ecuaciones diferenciales en Java: –

int i = 0;
double x0, y0, z0, x1, y1, z1;
double h = 0.01, a = 10.0, b = 28.0, c = 8.0 / 3.0;
  
x0 = 0.1;
y0 = 0;
z0 = 0;
for (i = 0; i < N; i++) {
    x1 = x0 + h * a * (y0 - x0);
    y1 = y0 + h * (x0 * (b - z0) - y0);
    z1 = z0 + h * (x0 * y0 - c * z0);
    x0 = x1;
    y0 = y1;
    z0 = z1;
    // Printing the coordinates
    if (i > 100)
        System.out.println(i + " " + x0 + " " + y0 + " " + z0);
}

Intentaremos implementar la lógica anterior en Processing Java visualmente. Dado que trazaremos los puntos en 3D, necesitamos usar un renderizador 3D. Usaremos el renderizador OPENGL en la siguiente implementación, pero también se puede usar un renderizador P3D. También necesitamos usar una biblioteca de procesamiento externa llamada PeasyCam que nos ayuda a crear un objeto de cámara interactivo para el flujo de trabajo del entorno 3D. PeasyCam se puede descargar usando el IDE de procesamiento desde herramientas -> Agregar herramienta -> Bibliotecas.

También usaremos las siguientes funciones para representar la estructura del atractor de Lorenz:

  • beginShape()– comienza a registrar los vértices de una forma.
  • endShape()– deja de registrar los vértices de una forma.
  • vertex()– esta función se usa para especificar las coordenadas de vértice para puntos, líneas, triángulos, cuadrantes y polígonos. Se utiliza exclusivamente dentro de las funciones beginShape()y endShape().

Implementación de Lorenz Attractor en Processing java: –

/* FINAL SKETCH FOR LORENZ ATTRACTOR */
  
import peasy.*; // Importing peasy package
  
// Initialization
float x = 0.01, y = 0, z = 0;
float a = 10, b = 28, c = 8.0 / 3.0;
  
// ArrayList of PVector objects to store
// the position vectors of the points to be plotted.
ArrayList<PVector> points = new ArrayList<PVector>();
PeasyCam cam; // Declaring PeasyCam object
  
void setup()
{
    // Creating the output window
    // and setting up the OPENGL renderer
    size(800, 600, OPENGL);
  
    // Initializing the cam object
    cam = new PeasyCam(this, 500);
}
  
void draw()
{
    background(0);
  
    // Implementation of the differential equations
    float dt = 0.01;
    float dx = (a * (y - x)) * dt;
    float dy = (x * (b - z) - y) * dt;
    float dz = (x * y - c * z) * dt;
    x += dx;
    y += dy;
    z += dz;
  
    // Adding the position vectors to points ArrayList
    points.add(new PVector(x, y, z));
    translate(0, 0, -80);
    scale(5);
    stroke(255);
    noFill();
  
    // Beginning plotting of points
    beginShape();
    for (PVector v : points) {
        // Adding random color to the structure in each frame
        stroke(random(0, 255), random(0, 255), random(0, 255));
        vertex(v.x, v.y, v.z); // plotting the vertices
    }
    endShape(); // Drawing ends
}

Producción:-

Materiales de origen

Este artículo es una contribución de Soumik Rakshit . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *