es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Creando una simulación de fuegos artificiales en Processing.

Tengo una tarea en la que tengo que hacer una simulación de fuegos artificiales utilizando Processing. Mi objetivo es tener un fuego artificial que pueda lanzar múltiples elipses en una formación circular. La imagen de lo que estoy tratando de lograr se puede encontrar aquí.

El código que tengo ahora parece generar las elipses en espiral. He copiado y pegado un enlace de descarga para el código al final, por si alguien quiere probarlo.

Enlace del código aquí:

“`java
ArrayList<ball> ballList;
int timer;
int amount;
int ball;
float angle;
boolean draws;
Ball b;

void setup() {
size(1300, 700);

ballList = new ArrayList<ball>(ball);
ball = 36;
amount = 1000;
}

void draw() {
background(0);
for (int i = ballList.size()-1; i > -1; i–) {
for (int k = 0; k < ball; k++) {
Ball b = ballList.get(i);
fill(255, 0, 0, b.a);
b.display();
}
}
}

void mousePressed() {
for (int j = 0; j < ball; j++) {
ballList.add(new Ball(angle));
}
}

class Ball {
float X;
float Y;
float rad;
float mx;
float my;
float a;
float draw;
color c = color(random(0, 255), random(0, 255), random(0, 255));
float d;

float angle;
float X2;
float Y2;
float angle2;
float x;
float y;

Ball(float _angle) {
X = mouseX; //mouse X
Y = mouseY; //mouseY;
d = 0;
rad = 10;
angle = _angle;
a = 255;
}

void display() {
noStroke();
a–;
d++;
angle += 10;
if (angle >= 360) {
angle = 0;
}
angle2 = radians(angle);
X2 = cos(angle2) * d + X;
Y2 = sin(angle2) * d + Y;
a -= 0.5;
ellipse(X2, Y2, rad, rad);
}
}
“`

Tags:  ,

Answer

  1. Avatar for davy.ai

    Simulación de fuegos artificiales con formación circular de elipses

    Para lograr la deseada formación circular de elipses en la simulación de los fuegos artificiales, hay algunas cosas que deben modificarse en el código proporcionado:

    1. Eliminar el movimiento en forma de espiral de las elipses cambiando el incremento del ángulo en la función display(). El valor actual de incremento de 10 está causando la forma de espiral. Para crear la formación circular, necesitamos establecer el valor de incremento en 360/ball. Esto distribuirá las elipses uniformemente en un círculo.
    2. Cambiar los valores X e Y del objeto Ball al centro del círculo, que en este caso es el evento de clic del ratón. Podemos calcular la posición de cada elipse utilizando los parámetros angle y radius.

    3. Ajustar la función draw() para crear el número deseado de explosiones de fuegos artificiales en diferentes ubicaciones en el lienzo. Podemos usar la función random() para determinar la posición de cada explosión.

    Aquí está el código modificado:

    ArrayList<ball> ballList;
    int timer;
    int ball;
    float angle;
    Ball b;
    
    void setup() {
      size(1300, 700);
      ballList = new ArrayList<ball>();
      ball = 36;
    }
    
    void draw() {
      background(0);
    
      // dibujar todas las elipses en la lista
      for (int i = 0; i < ballList.size(); i++) {
        Ball b = ballList.get(i);
        fill(b.c, b.a);
        b.display();
      }
    
      // eliminar las elipses que se han desvanecido
      for (int i = ballList.size()-1; i >= 0; i--) {
        Ball b = ballList.get(i);
        if (b.a <= 0) {
          ballList.remove(i);
        }
      }
    }
    
    void mousePressed() {
      // crear una explosión de fuegos artificiales en la posición del ratón
      float x = mouseX;
      float y = mouseY;
      int numExplosions = 5;
      int minRadius = 50;
      int maxRadius = 200;
    
      for (int i = 0; i < numExplosions; i++) {
        float explosionX = x + random(minRadius, maxRadius) * cos(radians(i*(360/numExplosions))));
        float explosionY = y + random(minRadius, maxRadius) * sin(radians(i*(360/numExplosions))));
    
        for (int j = 0; j < ball; j++) {
          ballList.add(new Ball(explosionX, explosionY));
        }
      }
    }
    
    class Ball {
      float X;
      float Y;
      float rad;
      float mx;
      float my;
      float a;
      color c;
    
      Ball(float _x, float _y) {
        X = _x;
        Y = _y;
        rad = 10;
        a = 255;
        c = color(random(0, 255), random(0, 255), random(0, 255));
      }
    
      void display() { 
        a -= 3;
        ellipse(X, Y, rad, rad);
    
        if (a > 0) {
          for (int i = 0; i < ball; i++) {
            float angle = radians(i*(360/ball));
            float radius = random(10, 100);
            float xPos = X + radius*cos(angle);
            float yPos = Y + radius*sin(angle);
            float size = random(3, 15);
            fill(c, a);
            ellipse(xPos, yPos, size, size);
          }
        }
      }
    }
    

    (Enlace al código modificado: https://drive.google.com/file/d/1YNpTvLJ-6t7SyXXEFpW_Jgn8qXrBYgsr/view?usp=sharing)

Comments are closed.