作者: homeless_honey | 来源:发表于2019-11-09 10:52 被阅读0次

绘制力场

  • 鼠标拖动,叠加相应的力到场上
void onMouseDrag() {
    PVector direc = new PVector(mouseX-pmouseX, mouseY-pmouseY).normalize();
    drawField(pmouseX, pmouseY, direc.mult(force));
  }

void drawField(float x, float y, PVector v) {
    int column = int(constrain(x/resolution, 0, cols-1));
    int row = int(constrain(y/resolution, 0, rows-1));
    for (int i=-affectRadius; i<=affectRadius; i++) {
      for (int j=-affectRadius; j<=affectRadius; j++) {
        if (i*i+j*j<affectRadius*affectRadius) {
          try {
            field[column+i][row+j].add(v).mult(0.9);
          }
  • 显示场
  private void showField() {
    for (int y = 0; y < rows; y++) {
      for (int x = 0; x < cols; x++) {
        PVector v = field[x][y];
        if (v != null) {
          stroke(255, v.mag()*100);
          strokeWeight(1);
          pushMatrix();
          translate(x * resolution, y * resolution);
          rotate(v.heading());
          line(0, 0, resolution*0.5, 0);
          popMatrix();

粒子

  • 添加粒子
class myVector extends PVector {
  myVector (float p_x, float p_y) {
    super(p_x, p_y);
  }
  PVector pre;
  int count;
  color myColor;
}

private void setParticle(int i) {
    tabParticles[i] = new myVector((int)random(width), (int)random(height));
    tabParticles[i].pre = tabParticles[i].copy();
    tabParticles[i].count = (int)random(MIN_LIFE_TIME, MAX_LIFE_TIME);   
    tabParticles[i].myColor = color(255, 0, 0);
  }
  • 粒子受到力场影响
void update() {
    for (int i = 0; i < NB_PARTICLES; i++) {
      myVector t = tabParticles[i];
      t.pre = t.copy();
      PVector v = ff.lookup(t.x, t.y);
      v.limit(MAX_PARTICLE_SPEED);
      t.add(v);
      t.count--;
  • 触边检测
void cheak() {
    for (int i = 0; i < NB_PARTICLES; i++) {
      myVector t = tabParticles[i];
      if ( (t.x < 0) || (t.x > width-1) 
        || (t.y < 0) || (t.y > height-1)
        || t.count < 0) {
        setParticle(i);

使用图片

  • 粒子使用背景图片颜色
oid initializeImage() {
  myImage = loadImage(IMAGE_PATH);
  myImage.resize(width, 0);
  imageW = myImage.width;
  imageH = myImage.height;
  myPixels = new color[imageW * imageH];
  myImage.loadPixels();
  myPixels = myImage.pixels;
  image(myImage, 0, 0);
}

tabParticles[i].myColor = myPixels[(int)(tabParticles[i].y)*imageW + (int)(tabParticles[i].x)];
    
  • 添加gui控件方便绘制
  • 隐藏力场
void setup() {
    cp5.setColorBackground(0x141414);
    sliderR = cp5.addSlider("Radius")
      .setPosition(width/4*3, height-150)
      .setRange(1, 20)
      .setValue(5).setSize(150, 25);
    sliderF = cp5.addSlider("Force")
      .setPosition(width/4*3, height-100)
      .setRange(0.1, 0.5)
      .setValue(0.2).setSize(150, 25);
    sliderS = cp5.addSlider("Particle Size")
      .setPosition(width/4*3, height-50)
      .setRange(0.8, 2)
      .setValue(0.5).setSize(150, 25);
  }

一流

持久化

  • 粒场的保存
void saveField() {
    try {
      FileWriter out = new FileWriter(file);
      for (int i=0; i<cols; i++) {
        for (int j=0; j<rows; j++) {
          out.write(field[i][j].x+","+field[i][j].y+"\t");
        }
        out.write("\r\n");
      }
      out.close();
    }
    catch(Exception e) {
    }
  }
  • 读取
void readField() throws IOException {
    try {
      BufferedReader in = new BufferedReader(new FileReader(file));
      String line;
      for (int i = 0; (line = in.readLine()) != null; i++) {
        String[] temp = line.split("\t");
        for (int j=0; j<temp.length; j++) {
          String[] xy = temp[j].split(",");
          float x = Float.parseFloat(xy[0]);
          float y = Float.parseFloat(xy[1]);
          field[i][j] = new PVector(x, y);
        }
      }
      in.close();
    }
    catch(Exception e) {
      throw new IOException("no field.txt");
    }
  }
  • 附上近期采风的一个作品,也是用一样的方法做的哦
  • 当然场的种类也更丰富了 引力场,螺旋场,噪声场等

相关文章

  • 。一一,一,一,一。

    一,、

  • 一 一

    2018年6月22日 星期五 雨 一水一万物 一星一宇宙 一字一文章 一书一世界 一读一微笑 一赞一知音

  • 一 一

    杨德昌《一 一》,早年曾看过一遍。 婷婷短发,白净,蓝色衬衫,学生裙,黑皮鞋,白袜子,学习很好的中学女生。温柔,懂...

  • 一 一

    给自己无处安放的灵魂找到了家!简书,我的新写作时光!继续,在流年里拾荒,禅落一身的光!

  • 一.一

  • 一.一

    一节车厢,一只行囊,肯为当时一念疯狂。 一根点燃,一缕惆怅,不许未来一片迷茫。 一眼远看,一众不详,哪知各位一去何...

  • 一(一)

    我叫一,总有人喜欢在背后说我,因为很多时候我都是自己一个人。很多人都说我很孤单,看起来很可怜,但我觉得很奇怪,他们...

  • (一-一)

    白天不看书晚上开灯照亮全宿舍的sb们该睡了

  • 一梦一寻(一)

    01 你在想什么?宝贝。” 一个磁性而温柔的声音传来。一双温柔的手轻抚我的头,这温暖使我从漫天的思绪中挣脱出来。 ...

  • 一梦一浮生(一)

    我曾做过一个梦。 曾梦见你给我画了很多很多的画,写了一封很长很长的信。 我看信看到很感动很感动但却很悲伤。 但我却...

网友评论

      本文标题:

      本文链接:https://www.haomeiwen.com/subject/hjggbctx.html