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;
}
}
}
}