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