У меня есть этот странный случай, когда сетка эллипсов схлопывается друг с другом и создает своего рода взрывное столкновение, что является интересным эффектом, но нежелательным. Я действительно просто хочу плавный переход меньших эллипсов, увеличивающихся по мере их сближения. в центр экрана, а затем медленно переходят друг в друга, не создавая «взрыва». Я не знаю, с чего начать, почему это может происходить. Какие-либо предложения?
Я пытался сделать скриншот, но заснять взрыв довольно сложно. По сути, если вы можете представить, что все 8 эллипсов входят в одну центральную точку, а затем быстро растут, в результате чего остальная часть окна становится белой.
ArrayList<RotatingEllipse> ellipses = new ArrayList<RotatingEllipse>();
float updateSize = 1;
float minSize = 1;
float maxSize = 10;
float sizeSpeed = 0.015;
void setup() {
size(500, 500);
noStroke();
smooth();
ellipses.add(new RotatingEllipse(width*.25, height*.25));
ellipses.add(new RotatingEllipse(width*.75, height*.25));
ellipses.add(new RotatingEllipse(width*.75, height*.75));
ellipses.add(new RotatingEllipse(width*.25, height*.75));
ellipses.add(new RotatingEllipse(width/2, height*.25));
ellipses.add(new RotatingEllipse(width/2, height*.75));
ellipses.add(new RotatingEllipse(width*.25, height/2));
ellipses.add(new RotatingEllipse(width*.75, height/2));
}
void draw() {
background(#202020);
for (RotatingEllipse e : ellipses) {
e.stepAndDraw();
updateSize = map(sin(frameCount * sizeSpeed), -1.0, 1.0, minSize, maxSize);
}
}
class RotatingEllipse {
float rotateAroundX;
float rotateAroundY;
float distanceFromRotatingPoint;
float angle;
public RotatingEllipse(float startX, float startY) {
rotateAroundX = (width/2 + startX)/2;
rotateAroundY = (height/2 + startY)/2;
distanceFromRotatingPoint = dist(startX, startY, rotateAroundX, rotateAroundY);
angle = atan2(startY-height/2, startX-width/2);
}
public void stepAndDraw() {
angle += PI/128;
float x = rotateAroundX + cos(angle)*distanceFromRotatingPoint;
float y = rotateAroundY + sin(angle)*distanceFromRotatingPoint;
float distance = dist(x, y, width/2, height/2);
float diameter = 50*(200-distance)/500;
float m = map ( updateSize, 0, distance, 1, diameter);
ellipse(x, y, m, m);
}
}