Funcionamiento de PVector o constructores... No lo entiendo

Hola, esto me está amargando :sweat_smile:, a ver si alguien me puede ayudar :

Algo extraño me pasa al crear un objeto, le paso dos PVector al constructor y un flotante, y al crear el objeto, cuando trato de sumar el float a el valor x de un PVector, se actualiza el valor de otro PVector… Mejor ver el ejemplo:

Codigo principal:
Menu menu;
PVector a,b;
float c = 150*4;

void setup() {
  size(displayWidth, displayHeight, P3D);
  a = new PVector(200,height-175);
  b = new PVector(600,height);
  menu = new Menu (a,b,c);

}

void draw() {
  background(200,200,0);
  menu.display();  
}
La clase:

class Menu{
  PVector esquina1, esquina2, limiteY;
  
  Menu(PVector a, PVector b, float c){
    esquina1 = a;
    esquina2 = b;
    println("Me llega: \n a: " + a + "\n b: " +b + "\n c: " + c);
    limiteY = a;
    println("Aqui, las cosas valen: \n esquina1: " + esquina1 + "\n esqina2: "
                +esquina2 + "\n limiteY: " + limiteY);
                
                
    println("Opero: \n limiteY.x: " + limiteY.x + " + c: "
                + c + " = " + (limiteY.x+c));
    limiteY.x = (limiteY.x+c);
    println("Y por último: \n esquina1: " + esquina1 + "\n esqina2: "
                +esquina2 + "\n limiteY: " + limiteY);
  }
  
  void display(){
    rectMode(CORNERS);
      rect(esquina1.x,esquina1.y,esquina2.x,esquina2.y);
  }  
}

Pero bueno, lo interesante está aquí, la parte que no entiendo:

Menu(PVector a, PVector b, float c){
    esquina1 = a;
    esquina2 = b;
    limiteY = a;
    limiteY.x = (limiteY.x+c);
  }

Y obtengo estos valores:

Me llega:

  • a: [ 200.0, 849.0, 0.0 ]
  • b: [ 600.0, 1024.0, 0.0 ]
  • c: 600.0
    Aqui, las cosas valen:
  • esquina1: [ 200.0, 849.0, 0.0 ]
  • esqina2: [ 600.0, 1024.0, 0.0 ]
  • limiteY: [ 200.0, 849.0, 0.0 ]
    Opero:
  • limiteY.x: 200.0 + c: 600.0 = 800.0
    Y por último:
  • esquina1: [ 800.0, 849.0, 0.0 ]
  • esqina2: [ 600.0, 1024.0, 0.0 ]
  • limiteY: [ 800.0, 849.0, 0.0 ]

My pregunta es ¿por qué la variable esquina1 actualiza su valor cuando le sumo un valor a la variable limiteY?

Gracias por leer y ayudar :smiley:

1 Like

ProcessingJS.org/reference/PVector_get_/
limiteY = a.get();

1 Like

Gracias por contestar @GoToLoop, pero mi duda es principalmente ¿Por qué la variable esquina1 cambia su valor cuando le sumo a OTRA variable ( PVector limiteY ) otra variable ( float c )?

 limiteY = a; 

Funciona en mi caso sin necesidad de usar " a.get(); "

Y mirando la referencia ya he conseguido sumarle la variable usando:

 limiteY.add(0,c);

Y por curiosidad, ¿ qué diferencia hay entre esta referencia (processing.org) y esta referencia (processingjs.org) ?

Graciaaaas :hugs:

1 Like

You mean this statement here, right? limiteY.x = (limiteY.x+c);

BtW, the statement above can be shortened like this: limiteY.x = limiteY.x + c;

An even shorter version of it: limiteY.x += c;

As you can see, you are not mutating the field limiteY itself, but the field x from the PVector object which limiteY points to.

Which btW is the very same PVector object field esquina1 also points to:
esquina1 = a; & limiteY = a;

Which is originally the PVector object created inside setup(), assigned to the sketch’s global field a:
a = new PVector(200, height - 175);

And then passed as argument for the Menu’s constructor:
menu = new Menu(a, b, c);

In short fields a, esquina1 and limiteY are all alias to the same PVector object.

And therefore, mutating its fields x, y and z via either of them will reflect on the other 2 fields as well.

If alias are undesirable, we need to assign a clone of the object to a field instead of its original object.

For PVector objects, we have methods get() & copy(), which return a clone of the object that invokes it:
Processing.org/reference/PVector_copy_.html

The former is for the Processing’s default Java Mode, while the latter is for the old Processing’s JS flavor called ProcessingJS (Pjs).

2 Likes