Как улучшить вложенный цикл для каждого пикселя?
Я пытаюсь создать метабалы с высоким разрешением. Вот мой алгоритм:
public constructor(){
this.image = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB);
this.rgbRaster = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
this.width = getWidth();
this.height = getHeight();
}
private void updateRaster() {
int red = c.getRed(), green = c.getGreen(), blue = c.getBlue();
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++) {
var sum = 0f;
for (Blob b : blobs)
sum += getSum(x, y, b);
sum = Math.min(sum, 255) / 255f;
rgbRaster[(width * y) + x] = ((0xFF) << 24) | (((int) (sum * red) & 0xFF) << 16) |
(((int) (sum * green) & 0xFF) << 8) | (((int) (sum * blue)) & 0xFF);
}
}
private float getSum(int x, int y, Blob b) {
var d = Point.distance(x, y, b.pos.x, b.pos.y);
return (float) map(1000f * b.r / d, 0, this.maxDist, 0, 255);
}
private double map(double n, double start1, double stop1, double start2, double stop2) {
return (n - start1) / (stop1 - start1) * (stop2 - start2) + start2;
}
Класс Blob довольно прост - это просто мяч, который отскакивает от экрана:
public class Blob {
public Vector2D pos;
public Vector2D vel;
public float r;
public Blob(Vector2D pos, Vector2D vel, float r) {
this.pos = pos;
this.vel = vel;
this.r = r;
}
public void update(float w, float h) {
this.pos.add(vel);
this.bounds(w, h);
}
public void draw(Graphics2D g) {
g.fill(new Ellipse2D.Double(this.pos.x - r, this.pos.y - r, r * 2, r * 2));
}
private void bounds(float w, float h) {
if (this.pos.x + r > w || this.pos.x - r < 0) this.vel.mult(new Vector2D(-1, 1));
if (this.pos.y + r > h || this.pos.y - r < 0) this.vel.mult(new Vector2D(1, -1));
}
}
Проблема в том, что слишком много итераций в ненастоящих циклах, и это вызывает серьезные зависания. Я не могу придумать другого способа отследить расстояние от каждого пикселя экрана до центральной точки всех капель, поэтому с изображением с высоким разрешением и большим количеством капель получается слайд-шоу. Также я знаю, что преобразование всего в BufferedImage - не лучшая идея, но я не знаю других способов преобразования растра в графический объект. Заранее спасибо за вашу помощь) (Edit: getSum() находит сумму всех расстояний для всех blob, сопоставляет ее с цветовым диапазоном и ограничивает его до 255, эта функция, конечно, не проблема, но немного сложна для понимания, поэтому я не включил его)(Edit 2: благодаря @ThatOtherGuy теперь этот способ более оптимизирован, но, вероятно, есть некоторые другие ошибки)