[Processing3] visualiseur d'embiellage pour ailes battantes.

J'ai eu de l'aide sur le forum de la fondation Processing.

Par contre il subsiste toujours le problème avec le décentrage du pivot de l'aile.

float l1 = 20;  // >> course
float l2 = 40; // distance bielle pivot d'aile >> Maneton_aile
float Bielle=0;  // longueur de la bielle
float Decalage_Maneton = 40;  // angle de décalage entre deux mannetons
float Dec_Piv_aile =20;  //distance du pivot de l'aile depuis l'axe 
float X=75;
float angle=0;
float angle_Pivot = 0 ;
float angle_P1 = 0 ;
float Theta_2 = 0;
float Theta_2_test = 0;
float Theta_1 = 0;
float Theta_2_2 =0;
float P1_M = 0;
float O_M = 0;
float L = 0;
float flag = 1;
float A = 0;
float C = 0;
float x = 0 ;
float y = 0 ;
float RPM = 360; //360; // vitesse de rotation

int i = 0;

PVector  O, P1, M, P2, v5, H;

boolean dbug = false;
float dgx=0.0;

void setup() {
  size(600, 600); //,P2D);
  frameRate(40);
  background(255);
  strokeWeight(.2);
  stroke(0);
  noFill();
  smooth();
  O = new PVector(0, 0); //centre du vilebrequin
  P1 = new PVector( l1, 0);  //maneton
  // M = new PVector( Dec_Piv_aile, -Dist_Pivot_Vilo); //pivot de l'aile
  M = new PVector( 0+Dec_Piv_aile, -X); //pivot de l'aile
  // P2 = new PVector( l2 + Dec_Piv_aile , -Dist_Pivot_Vilo);  // jonction bielle - aile
  P2 = new PVector( l2, -X);  // jonction bielle - aile ///// possibilité de changer la position au départ en changeant "y"
  v5 = new PVector(0, -50); //valeur haute de l'axe du vilebrequin
  H = new PVector( 0, P1.y);
  P1_M = PVector.dist(P1, M);
  O_M = PVector.dist(O, M);
  L = PVector.dist(P1, P2);  // longueur de bielle droite
  //P1.rotate(-PI/RPM);
  
  println(" press key [space] for print ");
}



void do_calc() {
  angle = degrees(PVector.angleBetween(P1, v5)); // angle entre le manneton et le pivot d'aile
  angle_Pivot = degrees(PVector.angleBetween(v5, M)); // angle entre centre du vilebrequi et le pivot d'aile
  angle_P1 = degrees(PVector.angleBetween(v5, P1)); // angle entre le manneton et le centre du vilebrequin
  Theta_1= angle;
  

  if (P1.x < 0 )  angle_P1= -angle_P1;  //_______________________________________ change
 // else            flag = -1;
 
  if ( angle_P1-angle_Pivot > 0) flag =  1;  //_______________________________________ add
  else                           flag = -1;  //_______________________________________ add
 println(angle_Pivot);
println(angle_P1);
println (flag);
println();
println();
  A = flag*-acos((-sq(l1) + sq(P1_M) + sq(O_M)) / (2 * P1_M * O_M)) ;
  C = acos((sq(l2) + sq(P1_M) - sq(L)) / (2 * P1_M * l2)) ;
  Theta_2 =  degrees(PI-((A)-(C)));
  Theta_2_2 =  Theta_2-180;        //degrees((Theta_2-180)/1042/PI);   

  y = cos(radians(Theta_2_2))*l2;  //coordonnée x du point p2          
  x = sin(radians(Theta_2_2))*l2;  //coordonnée y du point p2         
  
  H.y=P1.y;

  P1.rotate(-PI/RPM);  //rotation du vilebrequin
  P1_M = PVector.dist(P1, M);

  P2.x=x;
  P2.y=y-75;
 
}

void draw() {
    //scale(1.5);      
  //  background(255); 
  do_calc();           

  noStroke();
  fill(200, 200, 0);
  rect(0, 0, 600, 30);
  fill(0, 200, 0);
  rect(100, 120, 200, 300);
  fill(0);
 
  if (dbug) text("P1_M: = "+nf(P1_M, 1, 1)+" angle: "+nf(degrees(angle), 3, 1)+" A: "+nf((A), 1, 3)+" C: "+nf((C), 1, 3)+" Theta_2_2: "+nf((Theta_2_2), 3, 1), 20, 20);
  noFill();

  translate(200, 300);
  //  strokeWeight(.01);
  stroke(0);
  //axes
  ellipse(0, 0, l1*2, l1*2); // course maneton vilebrequin
  //ellipse(M.x, -X, l2*2, l2*2); // course maneton d'aile
  line(0, 70, 0, -150);  // axe vertical vilebrequin
  line(70, 0, -70, 0);  //  axe horizontal vilebrequin
  line(70, -X, -70, -X);  //  axe horizontal pivot d'ailes

  strokeWeight(1);
  stroke(200, 20, 20);
  line(O.x, O.y, P1.x, P1.y); //course droite
  line(M.x, M.y, P2.x+Dec_Piv_aile, P2.y); // aile droite  //_______________________________________ change
  line(P1.x, P1.y, P2.x+Dec_Piv_aile, P2.y); //bielle      //_______________________________________ change
  line(O.x, O.y, v5.x, v5.y); //axe vertical vilebrequin
  ellipse(O.x, O.y, 5, 5);   // axe de vilebrequin
  ellipse(M.x, M.y, 5, 5);  // pivot d'aile droite
  ellipse(P2.x+Dec_Piv_aile, P2.y, 5, 5); // connection bielle - aile droite     //_______________________________________ change
  ellipse(P1.x, P1.y, 5, 5);  // articulation maneton bielle droite


  stroke(#6282FA);//bleu
  ellipse(x, -X, 5, 5); // point P2
  stroke(#FC96FC); //rose
  ellipse(0, y-X, 5, 5);  
  //_______________________________________add as graph
  stroke(255);
  line(100+dgx+1, -150, 100+dgx+1, 150);  // clean up
  stroke(#FC96FC); //rose
  ellipse(100+dgx, y-X, 1, 1);  // KLL as graph

  stroke(#FFAF2E); //orange
  ellipse(x, y-X, 5, 5);
  stroke(#62FA75); //vert
  ellipse(H.x, H.y, 5, 5); // point H
  // KLL as graph
  ellipse(100+dgx, H.y, 1, 1);  // KLL as graph
  dgx+=0.3; 
  if ( dgx > width/2 ) dgx = 0;  // next pix

  if (dbug) {  //_______________________________________add
    println("calc P1_M: P1_M "+nf(P1_M, 1, 1)+" P1 "+P1+" M "+M);
    println(degrees(A)+", "+degrees(C));
    print("Theta_2 : ");
    println((Theta_2));
    print("Theta_1      : ");
    println((Theta_1));  
    print("Theta_2_test : ");
    println(Theta_2_test);
    print(" P1_M  = ");
    println(P1_M);
    print("bielle           : ");
    println(L);
    println("bielle Effective : "+PVector.dist(P1, P2));
    println(flag*(angle));
    println("x = "+x+"; y = "+y);
    println(P1);
    println(P2);
    println();
    println();
  }
}

void keyReleased(){ //_______________________________________add
 if (key == ' ') dbug=!dbug;  
}

Selon la formule usuelle.... si quelqu'un a une idée :smiley: