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();
}
}
}
La cuestión es el bucle en el método de detect
la 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 detect
se establece en cada iteración del bucle. Así pues, el después del bucle ha terminado, el estado de detect
depende 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 detect
convierte 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.