Advertisement
ahorsewithnoname

ProcessingCampo

Nov 13th, 2021 (edited)
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.34 KB | None | 0 0
  1. //Posiciones y signos de las (hasta) 50 cargas
  2. int posx[] = new int [50];
  3. int posy[] = new int [50];
  4. int sign[] = new int [50];
  5.  
  6. //Contador del número de cargas que hay
  7. int counter = 0;
  8.  
  9. //¿Hay que mover la central o no? Y sus coordenadas (inicialmente en el centro)
  10. int moveit = 0;
  11. float centralX = 250;
  12. float centralY = 250;
  13.  
  14. void setup(){
  15.   size(500,500);
  16.   textAlign(CENTER, CENTER);
  17. }
  18.  
  19. //Para crear el vector total
  20. PVector crearVector(float x, float y){
  21.  
  22.   //Crea un vector que no mide nada
  23.   PVector v = new PVector(0,0);
  24.  
  25.   //Con VectorCampo calcula los vectores individuales de cada carga, y los suma para obtener el total
  26.   for(int i = 0; i < counter; i++){
  27.     PVector ind = vectorCampo(i,x,y);
  28.     v.add(ind);
  29.   }
  30.   return v;
  31. }
  32.  
  33. PVector vectorCampo(int i,float x, float y){
  34.  
  35.   //Crea el vector entre el punto considerado y la carga de índice 'i'
  36.   PVector campo = new PVector(posx[i]-x,posy[i]-y);
  37.  
  38.   //Calcula la distancia
  39.   float multiplicador = campo.mag();
  40.  
  41.   //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
  42.   multiplicador = map(multiplicador,0,700,sqrt(50),0);
  43.  
  44.   //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)
  45.   multiplicador *= -multiplicador * sign[i];
  46.  
  47.   //Lo hace medir uno y lo escala por ese número que ha calculado antes
  48.   campo.normalize();
  49.   campo.mult(multiplicador);
  50.  
  51.   //Si el signo es positivo dibuja la flecha roja, si es negativo azul
  52.   strokeWeight(1);
  53.   if(sign[i] == 1) stroke(255,0,0);
  54.   if(sign[i] == -1) stroke (50,50,200);
  55.   arrow(x,y,x+campo.x,y+campo.y);
  56.   stroke(0);
  57.   return campo;
  58. }
  59.  
  60. void draw(){
  61.   //Background para refrescar todo el rato y los controles
  62.   background(255);
  63.   stroke(0);
  64.   textSize(10);
  65.   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);
  66.   textSize(20);
  67.  
  68.   //Crea el vector total donde se encuentra el ratón y lo dibuja
  69.   PVector v = crearVector(mouseX,mouseY);
  70.   strokeWeight(3);
  71.   if(counter > 0) arrow(mouseX,mouseY,mouseX+v.x,mouseY+v.y);
  72.  
  73.   //Crea el vector total de la partícula
  74.   v = crearVector(centralX,centralY);
  75.  
  76.   //Lo muestra
  77.   strokeWeight(3);
  78.   if(counter > 0) arrow(centralX,centralY,centralX+v.x,centralY+v.y);
  79.  
  80.  
  81.    
  82.   //Si la partícula central se tiene que mover
  83.   if(moveit == 1){
  84.    
  85.     //Lo escala por un valor que compensa el número de partículas
  86.     float mult = map(v.mag(),0,1,0,0.001/counter);
  87.     v.mult(mult);
  88.    
  89.     //Suma a la posición tanto en x como en y lo que le corresponde
  90.     centralX += v.x;
  91.     centralY += v.y;
  92.   }
  93.  
  94.   //Dibujando el círculo después
  95.   circle(centralX,centralY,10);
  96.   strokeWeight(1);
  97.  
  98.   //Dibuja todas las cargas, de un color u otro dependiendo del signo
  99.   for(int i = 0; i < counter; i++){
  100.     fill(255);
  101.     if(sign[i] == 1){
  102.       fill(255,0,0);
  103.       circle(posx[i],posy[i],20);
  104.       fill(0);
  105.       text("+",posx[i],posy[i]-3);
  106.     }
  107.     else{
  108.       fill(50,50,200);
  109.       circle(posx[i],posy[i],20);
  110.       fill(0);
  111.       text("-",posx[i],posy[i]-3);
  112.     }
  113.   }
  114. }
  115.  
  116. //Cuando el ratón está pulsado
  117. void mousePressed(){
  118.  
  119.   //Guarda el sitio donde se ha hecho click y el signo dependiendo del tipo de click
  120.   posx[counter] = mouseX;
  121.   posy[counter] = mouseY;
  122.   if(mouseButton == LEFT){
  123.     sign[counter] = 1;
  124.   }
  125.   else if(mouseButton == RIGHT){
  126.     sign[counter] = -1;
  127.   }
  128. }
  129.  
  130. void mouseReleased(){
  131.   counter++;
  132. }
  133.  
  134. //Función que dibuja una flecha (más elegante que una línea)
  135. void arrow(float x1, float y1, float x2, float y2) {
  136.   line(x1, y1, x2, y2);
  137.   pushMatrix();
  138.   translate(x2, y2);
  139.   float a = atan2(x1-x2, y2-y1);
  140.   rotate(a);
  141.   line(0, 0, -3, -3);
  142.   line(0, 0, 3, -3);
  143.   popMatrix();
  144. }
  145.  
  146.  
  147. //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
  148. void keyPressed(){
  149.   if(key == 'W' || key == 'w') moveit = 1;
  150.   if(key == 'S' || key == 's') moveit = 0;
  151.   if(key == 'D' || key == 'd'){
  152.     centralX = 250;
  153.     centralY = 250;
  154.   }
  155. }
  156.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement