En partant du site indiqué dans le message précédent j'ai utilisé la distance entre P1 et M afin de déterminer l'angle Ɵ2.
J'ai repris tout mon sketch, la bielle est moins "élastique", mais uniquement dans la configuration de base. Pour cela j'ai du compenser avec la valeur "1040" ( dont je n'ai pas la correspondance ).
Si je déplace le pivot de l'aile par rapport a l'axe du vilebrequin, cela ne fonctionne plus correctement non plus.
float l1=20; // >> course
float l2 = 20; // 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 =0; //distance du pivot de l'aile depuis l'axe >> AxeAile
float X=75;
float angle=0;
float Theta_2 = 0;
float Theta_2_test = 0;
float Theta_1 = 0;
float Theta_2_2 =0;
float P1_M = 0;
float L = 0;
float flag = 0;
float A = 0;
float C = 0;
float x = 0 ;
float y = 0 ;
float RPM = 360; // vitesse de rotation
int i = 0;
PVector O, P1, M, P2, v5, H;
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
v5 = new PVector(0, -50); //valeur haute de l'axe du vilebrequin
H = new PVector( 0, P1.y);
P1_M = PVector.dist(P1, M);
L = PVector.dist(P1, P2); // longueur de bielle droite
P1.rotate(-PI/RPM);
}
void draw() {
scale(1.5);
background(255);
translate(200, 300);
strokeWeight(.01);
stroke(0);
//axes
ellipse(0, 0, l1*2, l1*2); // course maneton vilebrequin
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
line(P1.x, P1.y, P2.x+Dec_Piv_aile, P2.y); //bielle
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
ellipse(P1.x, P1.y, 5, 5); // articulation maneton bielle droite
angle = PVector.angleBetween(P1, M); // angle entre le manneton et la ligne centre vilo_pivot d'aile
Theta_1= (degrees(angle));
println (degrees(angle));
print("P1_M = ");
println(P1_M);
A = flag*-acos((-sq(l1) + sq(P1_M) + sq(X)) / (2 * P1_M * X)) ;
C = acos((sq(l2) + sq(P1_M) - sq(L)) / (2 * P1_M * l2)) ;
if (P1.x > 0 ) {
flag = 1;
Theta_2 = degrees(PI-((A)-(C)));
Theta_2_2 =degrees((Theta_2-180)/1042/PI);
println("ok1");
} else {
flag = -1;
Theta_2 = degrees(PI-((A)-(C)));
// Theta_2 = degrees(PI+((C)+(A)));
Theta_2_2 =degrees((Theta_2-180)/1042/PI);
println("ok2");
}
y = cos(Theta_2_2)*l2; //coordonnée x du point p2
x = sin(Theta_2_2)*l2; //coordonnée y du point p2
stroke(#6282FA);//bleu
ellipse(x, -X, 5, 5); // point P2
stroke(#FC96FC); //rose
ellipse(0, y-X, 5, 5);
stroke(#FFAF2E); //orange
ellipse(x, y-X, 5, 5);
stroke(#62FA75); //vert
H.y=P1.y;
ellipse(H.x, H.y, 2, 2); // point H
P1.rotate(-PI/RPM); //rotation du vilebrequin
P1_M = PVector.dist(P1, M);
P2.x=x;
P2.y=y-X;
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*degrees(angle));
println("x = "+x+"; y = "+y);
println(P1);
println(P2);
println();
println();
}
Si quelqu'un à une idée pour corriger tout cela...