Processing 处理-当球从屏幕边缘反弹时,会模糊一段时间

Processing 处理-当球从屏幕边缘反弹时,会模糊一段时间,processing,blur,bounce,Processing,Blur,Bounce,我在寻找一种当球接近屏幕边缘时使球模糊的方法。当他们接近中心时,他们应该回到清晰的焦点 你对如何实现这一目标有什么建议吗 希望它有意义 ArrayList < Ball > list = new ArrayList(); void setup() { fullScreen(); for (int iter = 0; iter < 7; iter++) //qty of balls on the screen list.add(new

我在寻找一种当球接近屏幕边缘时使球模糊的方法。当他们接近中心时,他们应该回到清晰的焦点

你对如何实现这一目标有什么建议吗

希望它有意义

   ArrayList < Ball > list = new ArrayList();

   void setup() {
    fullScreen();
     for (int iter = 0; iter < 7; iter++) //qty of balls on the screen
      list.add(new Ball());
   }

   void draw() {
     background(0);
     for (Ball thisBall: list)
       thisBall.render();
   }

   class Ball {
     //1.Attributes
     float xPos, yPos, xSpeed, ySpeed;
     float size;
     color colour;

     //2.Constructor
     Ball() {
       xPos = width / 2;
       yPos = height / 2;
       xSpeed = random(-4, 4);
       ySpeed = random(-4, 4); 
       size = random(700, 1000); 
       colour = color(random(0,255), random(0,255), random(0,255));
     }

     //3.Actions
      void render() {
        stroke(colour,100);
        fill(colour, 100);
        ellipse(xPos, yPos, size, size);
        xPos += xSpeed;
        yPos += ySpeed;
        if (xPos < 0)
         xSpeed *= -1;
        if (xPos > width)
          xSpeed *= -1;
        if (yPos < 0)
         ySpeed *= -1;
        if (yPos > height)
         ySpeed *= -1;
     }
   }
ArrayListlist=newarraylist();
无效设置(){
全屏();
for(int-iter=0;iter<7;iter++)//屏幕上的球数
添加(新球());
}
作废提款(){
背景(0);
对于(球Thispall:列表)
thisBall.render();
}
班级舞会{
//1.属性
浮动XPO、YPO、xSpeed、ySpeed;
浮子大小;
颜色;
//2.建造师
Ball(){
xPos=宽度/2;
yPos=高度/2;
xSpeed=random(-4,4);
Y速度=随机(-4,4);
大小=随机(7001000);
颜色=颜色(随机(0255)、随机(0255)、随机(0255));
}
//3.行动
void render(){
笔画(彩色,100);
填充物(颜色,100);
椭圆(XPO、YPO、大小、大小);
xPos+=xSpeed;
yPos+=Y速度;
如果(xPos<0)
xSpeed*=-1;
如果(xPos>宽度)
xSpeed*=-1;
if(yPos<0)
y速度*=-1;
如果(yPos>高度)
y速度*=-1;
}
}

有几种方法可以做到这一点。。。虽然我觉得“正常”的不是你想要的

1. 首先,显而易见的一点是:已经有了一个可供处理的解决方案。但它模糊了整个图像。您仍然可以通过先绘制“模糊的圆”,模糊图像,然后绘制尖锐的圆来成功地使用它

但这里有两个问题:首先,我很确定这不是你想要的结果。第二,这种方法成本极高。除非你有一台怪物机器,否则它会减速的

2. 可以将已模糊的圆绘制到
p图像
,并在应用模糊条件时使用它来代替尖锐的圆。虽然这种方法可行,但我仍然怀疑您是否在寻找这种方法。我给你一些代码,以防你想自己尝试(但只有
Ball
类,其余的不必更改):


我鼓励你们按照这些思路进行实验,因为我认为你们脑子里有一些精确的想法。祝你好运

有几种方法可以做到这一点。。。虽然我觉得“正常”的不是你想要的

1. 首先,显而易见的一点是:已经有了一个可供处理的解决方案。但它模糊了整个图像。您仍然可以通过先绘制“模糊的圆”,模糊图像,然后绘制尖锐的圆来成功地使用它

但这里有两个问题:首先,我很确定这不是你想要的结果。第二,这种方法成本极高。除非你有一台怪物机器,否则它会减速的

2. 可以将已模糊的圆绘制到
p图像
,并在应用模糊条件时使用它来代替尖锐的圆。虽然这种方法可行,但我仍然怀疑您是否在寻找这种方法。我给你一些代码,以防你想自己尝试(但只有
Ball
类,其余的不必更改):


我鼓励你们按照这些思路进行实验,因为我认为你们脑子里有一些精确的想法。祝你好运

如果模糊“渐进”,如“离中心越近,模糊越少”?可能是您必须尝试围绕着色器工作。不久前,我一直在努力解决这个问题,也许你能找到一些对你有帮助的@laancelot-是的,如果它是进步的,那就太好了@克努佩尔,谢谢你,我会尝试一下,如果有任何问题,我会回复你的!如果模糊“渐进”,如“离中心越近,模糊越少”?可能是您必须尝试围绕着色器工作。不久前,我一直在努力解决这个问题,也许你能找到一些对你有帮助的@laancelot-是的,如果它是进步的,那就太好了@克努佩尔,谢谢你,我会尝试一下,如果有任何问题,我会回复你的!
class Ball {
  //1.Attributes
  PGraphics blurredCircle;
  boolean blur;
  float xPos, yPos, xSpeed, ySpeed, blurSize;
  float size;
  color colour;

  //2.Constructor
  Ball() {
    blur = false;
    blurSize = 200;
    xPos = width / 2;
    yPos = height / 2;
    xSpeed = random(-4, 4);
    ySpeed = random(-4, 4); 
    size = random(700, 1000);
    colour = color(random(0, 255), random(0, 255), random(0, 255));

    // drawing a blurred circle to memory
    blurredCircle = createGraphics((int)(size+2*blurSize), (int)(size+2*blurSize), P2D);
    blurredCircle.beginDraw();
    blurredCircle.background(0, 0, 0, 0); // using transparency to avoid drawing a white rectangle around the circle
    blurredCircle.stroke(colour, 100);
    blurredCircle.fill(colour, 100);
    blurredCircle.ellipseMode(CENTER);
    blurredCircle.ellipse(blurredCircle.width/2, blurredCircle.height/2, size, size);
    blurredCircle.filter(BLUR, blurSize);
    blurredCircle.endDraw();
  }

  //3.Actions
  void render() {
    if (blur) {
      imageMode(CENTER);
      image(blurredCircle, xPos, yPos);
    } else {
      stroke(colour, 100);
      fill(colour, 100);
      ellipse(xPos, yPos, size, size);
    }

    UpdateSpeed();
    UpdateBlur();
  }

  void UpdateSpeed() {
    xPos += xSpeed;
    yPos += ySpeed;

    // direction
    if (xPos < 0 || xPos > width) {
      xSpeed *= -1;
    }
    if (yPos < 0 || yPos > height) {
      ySpeed *= -1;
    }
  }

  void UpdateBlur() {
    int blurDistance = 50;
    blur = xPos < 0 + blurDistance || xPos > width - blurDistance || yPos < 0 + blurDistance || yPos > height - blurDistance;
  }
}
ArrayList < Ball > list = new ArrayList();

void setup() {
  //fullScreen(P2D);
  size(500, 500, P2D);
  for (int iter = 0; iter < 5; iter++) //qty of balls on the screen
    list.add(new Ball());
}

void draw() {
  background(0);

  // way better!
  for (Ball thisBall : list)
    thisBall.render();
}

class Ball {
  //1.Attributes
  PGraphics blurredCircle;
  float xPos, yPos, xSpeed, ySpeed, blurSize, blur, blurDistance, maxBlurPercentIncrease;
  float size;
  color colour;

  //2.Constructor
  Ball() {
    blur = 1;
    blurSize = 200;
    blurDistance = 200;
    maxBlurPercentIncrease = 75;
    xPos = width / 2;
    yPos = height / 2;
    xSpeed = random(-2, 2);
    ySpeed = random(-2, 2); 
    size = random(200, 400);
    colour = color(random(0, 255), random(0, 255), random(0, 255));

    // drawing a blurred circle to memory
    blurredCircle = createGraphics((int)(size+2*blurSize), (int)(size+2*blurSize), P2D);
    blurredCircle.beginDraw();
    blurredCircle.background(0, 0, 0, 0); // using transparency to avoid drawing a white rectangle around the circle
    blurredCircle.noStroke();
    blurredCircle.fill(colour, 100);
    blurredCircle.ellipseMode(CENTER);
    blurredCircle.ellipse(blurredCircle.width/2, blurredCircle.height/2, size, size);
    blurredCircle.filter(BLUR, blurSize);
    blurredCircle.endDraw();
  }

  //3.Actions
  void render() {
    UpdateBlur();

    float currentSize = size * blur;
    imageMode(CENTER);
    image(blurredCircle, xPos, yPos, currentSize, currentSize);
    noStroke();
    fill(colour, 100);
    ellipse(xPos, yPos, size/2, size/2);
    fill(255);

    UpdateSpeed();
  }

  void UpdateSpeed() {
    xPos += xSpeed;
    yPos += ySpeed;

    // direction
    if (xPos < 0 || xPos > width) {
      xSpeed *= -1;
    }
    if (yPos < 0 || yPos > height) {
      ySpeed *= -1;
    }
  }

  void UpdateBlur() {
    float[] values = { xPos, yPos, abs(xPos-width), abs(yPos-height) };
    float min = min(values);
    if (min == 0) {
      min = 1;
    }

    blur = 1;
    if (min < blurDistance) {
      float adjustment = ((blurDistance-min)/blurDistance)*maxBlurPercentIncrease;
      if (adjustment > 5) {
        blur += adjustment/100;
      }
    }
  }
}