处理:同时绘制随机粒子轨迹

时间:2015-01-22 08:19:27

标签: processing

class loc {
float[] x;
float[] y;
float v_o_x, v_o_y;

float[] locationx = new float[0];
float[] locationy = new float[0];

loc(float x_o, float y_o, float v_o, float theta, int t_end) {

theta = radians(theta);

v_o_x = v_o_x = v_o * cos(theta);

v_o_y = abs(v_o) * sin(theta);

for (int i=0; i<t_end; i++) {
  locationx = append(locationx, (v_o_x * i + x_o));
  locationy = append(locationy, (0.5*10*pow(i, 2) - v_o_y*i + y_o));
}

this.x = locationx;
this.y = locationy;
}
}

loc locations;

int wait = 75; // change delay between animation
int i = 0;
int j = 0;

float randV = random(-70, 70);
float randAng = random(30, 50);

int len = 17;

void setup() {

  size(1500, 800);

  background(255);
}

void draw() {


  fill(0);


  int d = 20; // diameter

  float[] xx, yy;

  if (i < len) {

    locations = new loc(width/2, height/3.5, randV, randAng, len);

    xx = locations.x;
    yy = locations.y;

    //background(255);
    rect(width/2-d, height/3.5+d, d*2, d*2);

    float s = 255/locations.x.length;
    fill((0+i*s));
    ellipse(xx[i], yy[i], d, d);

    i += 1;

    delay(wait);
  } else { 
    randV = random(-70, 70);
    randAng = random(30, 50);
    i = 0;
  }
}

我编写了一个简单的代码,用于为随机初始角度和速度设置球的轨迹。当它运行时,它会发出一个球,等待着陆,然后再发出一个随机球。我的希望是让它同时发出多个随机球,以创造一种喷泉效果。我有很多麻烦要做到这一点,有什么建议吗?

2 个答案:

答案 0 :(得分:2)

现在你已经有了一些代表单个球的位置(和过去位置)的变量。为了这个问题,我会暂时忽略你似乎没有使用其中的一些变量。

您可以复制所有这些变量,并为您想要的每个球重复这些变量。你会有ballOneLocations,ballTwoLocations等。

但那太可怕了,所以你应该把所有这些变量都包装成Ball类。 Ball的每个实例都代表一个单独的球及其过去的位置。

然后你需要做的就是创建一个Ball实例的数组或ArrayList,然后遍历它们来更新和绘制它们。

Here是一个关于如何在Processing中使用OOP创建多个球在屏幕上弹跳的教程。

答案 1 :(得分:2)

与Kevin Workman同意,课程是前往这里的方式。 这篇文章的最佳资源之一是Daniel Shiffman,特别是他的书Nature of Code。您的问题在粒子系统章节(第4章)中处理。