Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Posiciones y signos de las (hasta) 50 cargas
- int posx[] = new int [50];
- int posy[] = new int [50];
- int sign[] = new int [50];
- //Contador del número de cargas que hay
- int counter = 0;
- //¿Hay que mover la central o no? Y sus coordenadas (inicialmente en el centro)
- int moveit = 0;
- float centralX = 250;
- float centralY = 250;
- void setup(){
- size(500,500);
- textAlign(CENTER, CENTER);
- }
- //Para crear el vector total
- PVector crearVector(float x, float y){
- //Crea un vector que no mide nada
- PVector v = new PVector(0,0);
- //Con VectorCampo calcula los vectores individuales de cada carga, y los suma para obtener el total
- for(int i = 0; i < counter; i++){
- PVector ind = vectorCampo(i,x,y);
- v.add(ind);
- }
- return v;
- }
- PVector vectorCampo(int i,float x, float y){
- //Crea el vector entre el punto considerado y la carga de índice 'i'
- PVector campo = new PVector(posx[i]-x,posy[i]-y);
- //Calcula la distancia
- float multiplicador = campo.mag();
- //Como el campo es inversamente proporcional a la distancia lo escala, de forma que cuánto más grande es la distancia menos es la longitud del vector
- multiplicador = map(multiplicador,0,700,sqrt(50),0);
- //Como depende del cuadrado de la distancia lo eleva al cuadrado, y luego lo multiplica por el signo (para que si es una carga negativa vaya hacia ella y viceversa)
- multiplicador *= -multiplicador * sign[i];
- //Lo hace medir uno y lo escala por ese número que ha calculado antes
- campo.normalize();
- campo.mult(multiplicador);
- //Si el signo es positivo dibuja la flecha roja, si es negativo azul
- strokeWeight(1);
- if(sign[i] == 1) stroke(255,0,0);
- if(sign[i] == -1) stroke (50,50,200);
- arrow(x,y,x+campo.x,y+campo.y);
- stroke(0);
- return campo;
- }
- void draw(){
- //Background para refrescar todo el rato y los controles
- background(255);
- stroke(0);
- textSize(10);
- text("Controles:\nW para que se mueva la partícula central (positiva)\nS para que deje de moverse la partícula central\nD para que regrese al centro\nClick derecho para carga negativa\nClick izquierdo para carga positiva",width/2,50);
- textSize(20);
- //Crea el vector total donde se encuentra el ratón y lo dibuja
- PVector v = crearVector(mouseX,mouseY);
- strokeWeight(3);
- if(counter > 0) arrow(mouseX,mouseY,mouseX+v.x,mouseY+v.y);
- //Crea el vector total de la partícula
- v = crearVector(centralX,centralY);
- //Lo muestra
- strokeWeight(3);
- if(counter > 0) arrow(centralX,centralY,centralX+v.x,centralY+v.y);
- //Si la partícula central se tiene que mover
- if(moveit == 1){
- //Lo escala por un valor que compensa el número de partículas
- float mult = map(v.mag(),0,1,0,0.001/counter);
- v.mult(mult);
- //Suma a la posición tanto en x como en y lo que le corresponde
- centralX += v.x;
- centralY += v.y;
- }
- //Dibujando el círculo después
- circle(centralX,centralY,10);
- strokeWeight(1);
- //Dibuja todas las cargas, de un color u otro dependiendo del signo
- for(int i = 0; i < counter; i++){
- fill(255);
- if(sign[i] == 1){
- fill(255,0,0);
- circle(posx[i],posy[i],20);
- fill(0);
- text("+",posx[i],posy[i]-3);
- }
- else{
- fill(50,50,200);
- circle(posx[i],posy[i],20);
- fill(0);
- text("-",posx[i],posy[i]-3);
- }
- }
- }
- //Cuando el ratón está pulsado
- void mousePressed(){
- //Guarda el sitio donde se ha hecho click y el signo dependiendo del tipo de click
- posx[counter] = mouseX;
- posy[counter] = mouseY;
- if(mouseButton == LEFT){
- sign[counter] = 1;
- }
- else if(mouseButton == RIGHT){
- sign[counter] = -1;
- }
- }
- void mouseReleased(){
- counter++;
- }
- //Función que dibuja una flecha (más elegante que una línea)
- void arrow(float x1, float y1, float x2, float y2) {
- line(x1, y1, x2, y2);
- pushMatrix();
- translate(x2, y2);
- float a = atan2(x1-x2, y2-y1);
- rotate(a);
- line(0, 0, -3, -3);
- line(0, 0, 3, -3);
- popMatrix();
- }
- //Si se pulsa la W la partícula central se mueve, si se pulsa la S se para, si se pulsa la D vuelve a la posición inicial
- void keyPressed(){
- if(key == 'W' || key == 'w') moveit = 1;
- if(key == 'S' || key == 's') moveit = 0;
- if(key == 'D' || key == 'd'){
- centralX = 250;
- centralY = 250;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement