Mis partículas no interactúan de manera correcta en el procesamiento, por qué puede ser esto?

marijn:

Estoy trabajando en un proyecto más grande, fueron los perticles necesitan interactuar cuando se acercan a unos de otros. El programa es bastante SIMPEL. Cuando las bolas se tocan entre sí, o los centros están más cerca entre sí que su radio combinado, cambian de color. Sin embargo, las bolas están cambiando de color al azar en este momento y no tienen idea de por qué. Los objetos tienen un ArrayList con todos los objetos, para que puedan interactuar y su es una clase grande, que los funtions como un generador de partículas.

Box box;

void setup() {
    size(1000,1000);
    box = new Box(20);
}

void draw() {
    background(255);
    box.run();
}

el objeto

class Object {
    int on;
    PVector loc = new PVector(500,500);
    boolean detect = false;
    PVector v;
    ArrayList<Object> others = new ArrayList<Object>();

    Object(int nin) {
        this.on = nin;
        this.loc = this.loc.add(PVector.random2D().mult(100));
        this.v = PVector.random2D();
    }

    void move() {
        loc.add(PVector.random2D().limit(5));
    }

    void detect() {
        for(int i = 0; i<others.size(); i++) {

          if(i != on) {
              Object o = others.get(i);
              float distance = sqrt(sq(o.loc.x-this.loc.x)+sq(o.loc.y - this.loc.y));
              if(distance < 100) {
                  detect = true;
              }
              else {
                detect = false;
              }
            }
        }
    }

    void display() {
        if(detect == false) {
            noFill();
        }
        if(detect == true) {
            fill(200);
        }
        stroke(50);
        ellipse(loc.x,loc.y, 50,50);
        fill(0);
        text(on, loc.x, loc.y);
    }
}

el generador

class Box {
    int n;
    ArrayList<Object> objects = new ArrayList<Object>();

    Box(int nin) {
        this.n = nin;
        for(int i = 0; i<n; i++) {
            objects.add(new Object(i));
        }
        for(int i = 0; i< objects.size();i++) {
            Object x =  objects.get(i);
            x.others = this.objects;
        }
    }

    void run() {
        for(Object i : objects) {
            i.move();
            i.detect();
            i.display();
        }
    }
}
Rabbid76:

La cuestión es el bucle en el método de detectla clase int Object:

for(int i = 0; i<others.size(); i++) {
    if(i != on) {
        Object o = others.get(i);
        float distance = sqrt(sq(o.loc.x-this.loc.x)+sq(o.loc.y - this.loc.y));
        if(distance < 100) {
            detect = true;
        }
        else {
            detect = false;
        }
    }
}

La variable detectse establece en cada iteración del bucle. Así pues, el después del bucle ha terminado, el estado de detectdepende del último elemento de la lista others. El resultado es exactamente el mismo, como usted acaba de evaluar el último elemento de la lista.

Romper el bucle, si el valor de la detectconvierte en verdad. p.ej:

class Object {
    // [...]

    void detect() {
        detect = false;     
        for(int i = 0; i < others.size() && !detect; i++) {
            if(i != on) {
                Object o = others.get(i);
                float distance = sqrt(sq(o.loc.x-this.loc.x)+sq(o.loc.y - this.loc.y));
                detect = distance < 50;
            }
        }
    }

    // [...]
}

Nota, el parámetro tercero y cuarto de la ellipse()son la anchura y la altura de la elipse, por lo tanto la distancia que el mínimo es de 50, en lugar de 100.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=356696&siteId=1
Recomendado
Clasificación