Мои частицы не взаимодействуют должным образом при обработке, почему это может быть? - PullRequest
2 голосов
/ 28 марта 2020

Я работаю над большим проектом, в котором нужно взаимодействовать с людьми, когда они приближаются друг к другу. Программа довольно простая. Когда шары касаются друг друга или центры находятся ближе друг к другу, чем их общий радиус, они меняют цвет. Тем не менее, шары меняются в случайном порядке прямо сейчас, и я понятия не имею, почему. У объектов есть Arraylist со всеми объектами, поэтому они могут взаимодействовать, и это один большой класс, который функционирует как генератор частиц.

Box box;

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

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

объект

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

генератор

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

1 Ответ

1 голос
/ 28 марта 2020

Проблема заключается в l oop в методе detect int class 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;
        }
    }
}

Переменная detect устанавливается в каждой итерации л oop. Таким образом, после завершения l oop состояние detect зависит от последнего элемента в списке others. Результат точно такой же, как если бы вы просто оценили последний элемент списка.

Прервите l oop, если значение detect станет истинным. Например:

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

    // [...]
}

Обратите внимание, что 3-й и 4-й параметр ellipse() - это ширина и высота эллипса, поэтому минимальное расстояние составляет 50, а не 100 .

...