Processing


Este foro sigue el método de inteligencia colectiva. Buscamos moderadores para el foro para mas informacion envien un MP a goestin o comenten en el correspondiente post llamado ayuda con el foro en la sección de de todo
 
ÍndiceBuscarMiembrosRegistrarseConectarse
Buscar
 
 

Resultados por:
 
Rechercher Búsqueda avanzada
Últimos temas
» Modelado 3D processing
Lun Nov 09, 2015 11:23 pm por franciscoparrac

» Ingresar Números en pantalla de tipo entero
Jue Jul 23, 2015 8:50 pm por ALEXANDRO

» ayuda como hacer una imagen en movientos???
Vie Jul 10, 2015 10:46 pm por klenic

» Ayuda con procesing con imagenes y potenciometro
Mar Jun 16, 2015 2:16 pm por maria21

» Reproducir varios videos a la vez
Mar Mayo 12, 2015 6:36 am por mary8ab

» Libro Processing español , porfin lo encontré :D
Mar Mayo 12, 2015 6:33 am por mary8ab

» ejecutar video en processing
Mar Mayo 12, 2015 6:19 am por mary8ab

» Entrada de texto
Mar Nov 18, 2014 10:36 pm por Lader

» Fallo al exportar
Lun Oct 27, 2014 7:56 pm por santibatera

Sondeo
¿Añadimos arduino al foro?.
Si.
100%
 100% [ 26 ]
No
0%
 0% [ 0 ]
Votos Totales : 26

Comparte | 
 

 Movimiento para time-lapse

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
100cass
Recien llegado.
Recien llegado.


Mensajes : 1
Fecha de inscripción : 02/06/2014
Localización : Madrid

MensajeTema: Movimiento para time-lapse   Lun Jun 02, 2014 2:48 pm

Hola:

Estoy construyendo una guía para mover una cámara con tres grados de libertad y dispararla, y con el resultado hacer un vídeo de time-lapse.

Con Processing pretendo hacer un dibujo del recorrido que realizará la cámara y pasar un array de datos a Arduino que es el que se encargará de controlar los motores. Como solo llevo una semana programando con Processing, comprenderéis que no he avanzado mucho, pero el inicio creo que está bien perfilado. La cuestión que me trae aquí es intentar mejorar el código que tengo, y solucionar algunos inconvenientes.

En primer lugar: manejo tres curvas bezier concatenadas, esto genera 4 puntos para las curvas y 6 para los puntos de control. En el código que he logrado adaptar juntando varios ejemplos encontrados en tutoriales y la página oficial de Processing, consigo que se muevan como deseo, pero tengo que repetir casi el mismo código para los 10 puntos, pero no alcanzo a entender como hacer una función o ¿quizá una clase?, para simplificar el código y ganar en velocidad de proceso.

El segundo problema, no mejor inconveniente, es: Cuando clico sobre un punto y lo arrastro, si lo hago muy deprisa, el punto se me para y no me sigue. Claro, la solución "chapu" es mover el ratón despacio, pero no es muy profesional, ¿verdad?

Os dejo el código que tengo, cuando te acercas a los punto de control, cambian de color, si haces click en ellos y arrastras, los puedes mover y si haces click con el derecho del ratón aparecen una serie de puntos intermedios.
Código:
/*
Dibujar tres curvas bezier concatenadas y controlarlas con el ratón.
Obtener un fichero con varios de los puntos que recorren las curvas
resultantes.
*/

int P1x=50;
int P1y=200;
int P2x=350;
int P2y=200;
int P3x=650;
int P3y=200;
int P4x=950;
int P4y=200;
int Pc1x=50;
int Pc1y=350;
int Pc2x=350;
int Pc2y=350;
int Pc3x=350;
int Pc3y=50;
int Pc4x=650;
int Pc4y=50;
int Pc5x=650;
int Pc5y=350;
int Pc6x=950;
int Pc6y=350;

void setup( )
{
size(1000, 500);
background(240);
noFill();
}


void draw() {
background(240);

stroke(150);
rect(50,50,900,300);
stroke(200);
line(Pc1x, Pc1y, P1x, P1y);
line(Pc2x, Pc2y, P2x, P2y);
line(Pc3x, Pc3y, P2x, P2y);
line(Pc4x, Pc4y, P3x, P3y);
line(Pc5x, Pc5y, P3x, P3y);
line(Pc6x, Pc6y, P4x, P4y);

stroke(0);
beginShape();  // Iniciamos un bezier contínuo.
//vertex(50, 75); // primer punto
vertex(P1x,P1y); // primer punto
//bezierVertex(70, 50, 120, 80, 250, 150);
bezierVertex(Pc1x,Pc1y,Pc2x,Pc2y,P2x,P2y);
//bezierVertex(180, 160, 330, 180, 320, 200);
bezierVertex(Pc3x,Pc3y,Pc4x,Pc4y,P3x,P3y);
//bezierVertex(180, 160, 330, 180, 520, 300);
bezierVertex(Pc5x,Pc5y,Pc6x,Pc6y,P4x,P4y);
endShape();  // Terminamos el bezier.
noStroke();  // Quitamos la línea exterior.

// Punto de control 1  -------------------------------------------
  if (dist(Pc1x,Pc1y,  mouseX,mouseY) < 16){
  //si la distancia entre el ratón y el centro es menor que el radio.
    fill(255,200,0);  // Cambiamos el color del punto.
    if (mousePressed && (mouseButton == LEFT)){  // Si además pulsamos el ratón.
      Pc1x = mouseX;  // El centro del círculo se mueve a la posición del cursor.
      Pc1y = mouseY;
      strokeWeight(3);  // Cambiamos el ancho de la línea.
    } else {  // Al dejar de pulsar el ratón.
      strokeWeight(1);  // Recuperamos el ancho de la línea.
    }
   }
   else {  // Si el cursor está fuera de la círculo.
    noStroke();  // Quitamos la línea exterior.
    fill(0, 0, 255);  // Rellenamos con el color de reposo.
  }
  ellipse(Pc1x, Pc1y, 12, 12);  // Dibujamos el punto de control en la nueva posición.

// Punto de control 2  -------------------------------------------
  if (dist(Pc2x,Pc2y,  mouseX,mouseY) < 16){
  //si la distancia entre el ratón y el centro es menor que el radio.
    fill(255,200,0);  // Cambiamos el color del punto.
    if (mousePressed && (mouseButton == LEFT)){  // Si además pulsamos el ratón.
      Pc2x = mouseX;  // El centro del círculo se mueve a la posición del cursor.
      Pc2y = mouseY;
      strokeWeight(3);  // Cambiamos el ancho de la línea.
    } else {  // Al dejar de pulsar el ratón.
      strokeWeight(1);  // Recuperamos el ancho de la línea.
    }
  }
  else {  // Si el cursor está fuera de la círculo.
    noStroke();  // Quitamos la línea exterior.
    fill(0, 0, 255);  // Rellenamos con el color de reposo.
  }
  ellipse(Pc2x, Pc2y, 12, 12);  // Dibujamos el punto de control en la nueva posición.

// Punto de control 3  -------------------------------------------
  if (dist(Pc3x,Pc3y,  mouseX,mouseY) < 16){
  //si la distancia entre el ratón y el centro es menor que el radio.
    fill(255,200,0);  // Cambiamos el color del punto.
    if (mousePressed && (mouseButton == LEFT)){  // Si además pulsamos el ratón.
      Pc3x = mouseX;  // El centro del círculo se mueve a la posición del cursor.
      Pc3y = mouseY;
      strokeWeight(3);  // Cambiamos el ancho de la línea.
    } else {  // Al dejar de pulsar el ratón.
      strokeWeight(1);  // Recuperamos el ancho de la línea.
    }
  }
  else {  // Si el cursor está fuera de la círculo.
    noStroke();  // Quitamos la línea exterior.
    fill(0, 0, 255);  // Rellenamos con el color de reposo.
  }
  ellipse(Pc3x, Pc3y, 12, 12);  // Dibujamos el punto de control en la nueva posición.

// Punto de control 4  -------------------------------------------
  if (dist(Pc4x,Pc4y,  mouseX,mouseY) < 16){
  //si la distancia entre el ratón y el centro es menor que el radio.
    fill(255,200,0);  // Cambiamos el color del punto.
    if (mousePressed && (mouseButton == LEFT)){  // Si además pulsamos el ratón.
      Pc4x = mouseX;  // El centro del círculo se mueve a la posición del cursor.
      Pc4y = mouseY;
      strokeWeight(3);  // Cambiamos el ancho de la línea.
    } else {  // Al dejar de pulsar el ratón.
      strokeWeight(1);  // Recuperamos el ancho de la línea.
    }
  }
  else {  // Si el cursor está fuera de la círculo.
    noStroke();  // Quitamos la línea exterior.
    fill(0, 0, 255);  // Rellenamos con el color de reposo.
  }
  ellipse(Pc4x, Pc4y, 12, 12);  // Dibujamos el punto de control en la nueva posición.

// Punto de control 5  -------------------------------------------
  if (dist(Pc5x,Pc5y,  mouseX,mouseY) < 16){
  //si la distancia entre el ratón y el centro es menor que el radio.
    fill(255,200,0);  // Cambiamos el color del punto.
    if (mousePressed && (mouseButton == LEFT)){  // Si además pulsamos el ratón.
      Pc5x = mouseX;  // El centro del círculo se mueve a la posición del cursor.
      Pc5y = mouseY;
      strokeWeight(3);  // Cambiamos el ancho de la línea.
    } else {  // Al dejar de pulsar el ratón.
      strokeWeight(1);  // Recuperamos el ancho de la línea.
    }
  }
  else {  // Si el cursor está fuera de la círculo.
    noStroke();  // Quitamos la línea exterior.
    fill(0, 0, 255);  // Rellenamos con el color de reposo.
  }
  ellipse(Pc5x, Pc5y, 12, 12);  // Dibujamos el punto de control en la nueva posición.

// Punto de control 6  -------------------------------------------
  if (dist(Pc6x,Pc6y,  mouseX,mouseY) < 16){
  //si la distancia entre el ratón y el centro es menor que el radio.
    fill(255,200,0);  // Cambiamos el color del punto.
    if (mousePressed && (mouseButton == LEFT)){  // Si además pulsamos el ratón.
      Pc6x = mouseX;  // El centro del círculo se mueve a la posición del cursor.
      Pc6y = mouseY;
      strokeWeight(3);  // Cambiamos el ancho de la línea.
    } else {  // Al dejar de pulsar el ratón.
      strokeWeight(1);  // Recuperamos el ancho de la línea.
    }
  }
  else {  // Si el cursor está fuera de la círculo.
    noStroke();  // Quitamos la línea exterior.
    fill(0, 0, 255);  // Rellenamos con el color de reposo.
  }
  ellipse(Pc6x, Pc6y, 12, 12);  // Dibujamos el punto de control en la nueva posición.

// Punto 1  ------------------------------------------------------
  if (dist(P1x,P1y,  mouseX,mouseY) < 16){
  //si la distancia entre el ratón y el centro es menor que el radio.
    fill(255,200,0);  // Cambiamos el color del punto.
    if (mousePressed && (mouseButton == LEFT)){  // Si además pulsamos el ratón.
      P1x = 50;  // El centro del círculo se mueve a la posición del cursor,
      P1y = mouseY;  // moviendose solo en y.
      strokeWeight(3);  // Cambiamos el ancho de la línea.
    } else {  // Al dejar de pulsar el ratón.
      strokeWeight(1);  // Recuperamos el ancho de la línea.
    }
  }
  else {  // Si el cursor está fuera de la círculo.
    noStroke();  // Quitamos la línea exterior.
    fill(255, 0, 0);  // Rellenamos con el color de reposo.
  }
  ellipse(P1x, P1y, 16, 16);  // Dibujamos el punto de control en la nueva posición.

// Punto 2  ------------------------------------------------------
  if (dist(P2x,P2y,  mouseX,mouseY) < 16){
  //si la distancia entre el ratón y el centro es menor que el radio.
    fill(255,200,0);  // Cambiamos el color del punto.
    if (mousePressed && (mouseButton == LEFT)){  // Si además pulsamos el ratón.
      P2x = mouseX;  // El centro del círculo se mueve a la posición del cursor.
      P2y = mouseY;
      strokeWeight(3);  // Cambiamos el ancho de la línea.
    } else {  // Al dejar de pulsar el ratón.
      strokeWeight(1);  // Recuperamos el ancho de la línea.
    }
  }
  else {  // Si el cursor está fuera de la círculo.
    noStroke();  // Quitamos la línea exterior.
    fill(255, 0, 0);  // Rellenamos con el color de reposo.
  }
  ellipse(P2x, P2y, 16, 16);  // Dibujamos el punto de control en la nueva posición.

// Punto 3  ------------------------------------------------------
  if (dist(P3x,P3y,  mouseX,mouseY) < 16){
  //si la distancia entre el ratón y el centro es menor que el radio.
    fill(255,200,0);  // Cambiamos el color del punto.
    if (mousePressed && (mouseButton == LEFT)){  // Si además pulsamos el ratón.
      P3x = mouseX;  // El centro del círculo se mueve a la posición del cursor.
      P3y = mouseY;
      strokeWeight(3);  // Cambiamos el ancho de la línea.
    } else {  // Al dejar de pulsar el ratón.
      strokeWeight(1);  // Recuperamos el ancho de la línea.
    }
  }
  else {  // Si el cursor está fuera de la círculo.
    noStroke();  // Quitamos la línea exterior.
    fill(255, 0, 0);  // Rellenamos con el color de reposo.
  }
  ellipse(P3x, P3y, 16, 16);  // Dibujamos el punto de control en la nueva posición.

// Punto 4  ------------------------------------------------------
  if (dist(P4x,P4y,  mouseX,mouseY) < 16){
  //si la distancia entre el ratón y el centro es menor que el radio.
    fill(255,200,0);  // Cambiamos el color del punto.
    if (mousePressed && (mouseButton == LEFT)){  // Si además pulsamos el ratón.
      P4x = 950;  // El centro del círculo se mueve a la posición del cursor,
      P4y = mouseY;  // moviendose solo en y.
      strokeWeight(3);  // Cambiamos el ancho de la línea.
    } else {  // Al dejar de pulsar el ratón.
      strokeWeight(1);  // Recuperamos el ancho de la línea.
    }
  }
  else {  // Si el cursor está fuera de la círculo.
    noStroke();  // Quitamos la línea exterior.
    fill(255, 0, 0);  // Rellenamos con el color de reposo.
  }
  ellipse(P4x, P4y, 16, 16);  // Dibujamos el punto de control en la nueva posición.

fill(240);
stroke(0);

    if (mousePressed && (mouseButton == RIGHT)){
      noFill();
      bezier(P1x,P1y,Pc1x,Pc1y,Pc2x,Pc2y,P2x,P2y);
      int steps1 = 10;
      for (int i1 = 0; i1 <= steps1; i1++) {
        float t1 = i1 / float(steps1);
        float x1 = bezierPoint(P1x,Pc1x,Pc2x,P2x, t1);
        float y1 = bezierPoint(P1y,Pc1y,Pc2y,P2y, t1);
        ellipse(x1, y1, 8, 8);
      }
      bezier(P2x,P2y,Pc3x,Pc3y,Pc4x,Pc4y,P3x,P3y);
      int steps2 = 10;
      for (int i2 = 0; i2 <= steps2; i2++) {
        float t2 = i2 / float(steps2);
        float x2 = bezierPoint(P2x,Pc3x,Pc4x,P3x, t2);
        float y2 = bezierPoint(P2y,Pc3y,Pc4y,P3y, t2);
        ellipse(x2, y2, 8, 8);
      }
      bezier(P3x,P3y,Pc5x,Pc5y,Pc6x,Pc6y,P4x,P4y);
      int steps3 = 10;
      for (int i3 = 0; i3 <= steps3; i3++) {
        float t3 = i3 / float(steps3);
        float x3 = bezierPoint(P3x,Pc5x,Pc6x,P4x, t3);
        float y3 = bezierPoint(P3y,Pc5y,Pc6y,P4y, t3);
        ellipse(x3, y3, 8, 8);
      }
    }
}

Aunque esto ya funciona, es muy mejorable y aun falta la parte de exportar al Arduino.

Si alguien tiene alguna idea, agradeceré cualquier comenteario y si alguien encuentra un trocito de código que le sirva, encantado.

Un saludo.
Volver arriba Ir abajo
 
Movimiento para time-lapse
Ver el tema anterior Ver el tema siguiente Volver arriba 
Página 1 de 1.

Permisos de este foro:No puedes responder a temas en este foro.
Processing :: Processing :: Projectos :: Ayuda en proyectos-
Cambiar a: