2016-08-31 8 views
1

Это является следствием этого question.Обработка, неспособная установить значение альфа для объектов в ArrayList

Я ищу, чтобы получить кучу частиц объектов, чтобы остаться с определенным значением «альфа». Это альфа-значение будет увеличиваться/уменьшаться в зависимости от его близости с соседними частицами.

В настоящее время код У меня есть результаты для всех частиц, находящихся в макс альфа. Я считаю, что это связано с повторением результатов ArrayList, когда альфа перерисовывается несколько раз. Из-за этого программа работает вяло.

class Particle{ 

    PVector velocity, location; //PVector variables for each particle. 

    Particle(){ //Constructor - random location and speed for each particle. 
    velocity = new PVector(random(-0.5,0.5), random(-0.5,0.5)); 
    location = new PVector(random(0,width),random(0,width)); 
    } 

    void update() { location.add(velocity); } //Motion method. 

    void edge() { //Wraparound case for particles. 
    if (location.x > width) {location.x = 0;} 
    else if (location.x < 0) {location.x = width;} 

    if (location.y > height) {location.y = 0;} 
    else if (location.y < 0) {location.y = height;} 
    } 

    void display(ArrayList<Particle> p){ //Display method to show lines and ellipses between particles. 

    for(Particle other: p){ //For every particle in the ArrayList. 
    float d = PVector.dist(location,other.location); //Get distance between any two particle. 
    float a = 255 - map(d,0,112,0,255); //Map variable 'a' as alpha based on distance. E.g. if distance is high, d = 100, alpha is low, a = 255 - 225 = 30. 

if(other==this){continue;} 

    println("Lowest distance of any two particle =" + d); //Debug output. 

    if(d<112){ //If the distance of any two particle falls bellow 112. 
     noStroke(); //No outline. 
     fill(0,a); //Particle are coloured black, 'a' to vary alpha. 
     ellipse(location.x, location.y, 8, 8); //Draw ellipse based on location of particle. 

    }else{ 
     noStroke(); //No outline. 
     fill(0,30); //For particles far away, set them to a fix alpha of '30' 
     ellipse(location.x, location.y, 8, 8); //Draw ellipse based on location of particle. 
    } 
    } 
} 
} 

ArrayList<Particle> particles = new ArrayList<Particle>(); //Create a new arraylist of type Particle. 

void setup(){ 
    size(640,640,P2D); //Setup frame of sketch. 

    for (int i=0; i<40; i++) { 
    particles.add(new Particle()); //Add five Particle elements into arraylist. 
    } 
} 

void draw(){ 
background(255); //Set white background. 
for(Particle p: particles){ //For every 'p' of type Particle in arraylist particles. 
    p.update(); //Update location based on velocity. 
    p.display(particles); //Display each particle in relation to other particles. 
    p.edge(); //Wraparound if particle reaches edge of screen. 
} 
} 
+0

свяжите между перекрестными объявлениями: https://forum.processing.org/two/discussion/18015/processing-ellipse-not-following-alpha-values#latest –

ответ

1

У вас есть такая же проблема с your previous question: для каждого Particle, вы циклически каждый другой Particle, так что вы в конечном итоге рисунок 40 эллипсы для каждого Particle. Вместо этого вам нужно пройти через Particle s и найти ближайшего соседа, а затем основать ваши альфа-вычисления с одинParticle.

Другими словами, ваш код рисунка должен быть послеfor петля.

Расположения ближайшего соседа выглядит следующим образом:

Particle closestNeighbor = null; 
float closestDistance = 100000; 

for (Particle other : p) { //For every particle in the ArrayList. 

    if (other == this) { 
    continue; 
    } 


    float d = PVector.dist(location, other.location); 
    if (d < closestDistance) { 
    closestDistance = d; 
    closestNeighbor = other; 
    } 
} 

После завершения этого цикла, closestNeighbor будет указывать на ближайший сосед, и closestDistance будет ближе расстоянием. Вы можете использовать это в своих расчетах альфа:

float a = 255 - map(closestDistance, 0, 112, 0, 255); //Map variable 'a' as alpha based on distance. E.g. if distance is high, d = 100, alpha is low, a = 255 - 225 = 30. 

if (closestDistance<112) { 
    noStroke(); //No outline. 
    fill(0, a); //Particle are coloured black, 'a' to vary alpha. 
    ellipse(location.x, location.y, 8, 8); //Draw ellipse based on location of particle. 
} else { 
    noStroke(); //No outline. 
    fill(0, 30); //For particles far away, set them to a fix alpha of '30' 
    ellipse(location.x, location.y, 8, 8); //Draw ellipse based on location of particle. 
}