#include<stdio.h>
#include<math.h>
double RRR(double x1,double x1d,double x1dd,double y1,double y1d,double y1dd,double x2,double x2d,double x2dd,double y2,double y2d,double y2dd,double r1,double r2,double M,double *theta1,double *theta1d,double *theta1dd,double *theta2,double *theta2d,double *theta2dd,double *x3,double *x3d,double *x3dd,double *y3,double *y3d,double *y3dd,double *v,double *gamma,double *a,double *beta)
{
double d1,d,phi,alpha,s1,v1,a1,A,B,C,D;
d1 = pow(x2-x1,2)+pow(y2-y1,2);
d = sqrt(d1);
phi = atan((y2-y1)/(x2-x1));
s1 = (pow(r1,2)+d-pow(r2,2))/(2*r1*d);
alpha = acos(s1);
*theta1 = phi+M*alpha;
*x3 = x1+r1*cos(*theta1);
*y3 = y1+r1*sin(*theta1);
*theta2 = atan((*y3-y2)/(*x3-x2));
A = (*y3-y2)*(*x3-x1)-(*y3-y1)*(*x3-x2);
*theta1d = ((x2d-x1d)*(*x3-x2)+(y2d-y1d)*(*y3-y2))/(A);
*theta2d = ((x2d-x1d)*(*x3-x1)+(y2d-y1d)*(*y3-y1))/(A);
*x3d = x1d - *theta1d*(*y3-y1);
*y3d = y1d + *theta1d*(*x3-x1);
v1 = pow(*x3d,2)+(*y3d,2);
*v = sqrt(v1);
*gamma = atan((*y3d)/(*x3d));
B = x2dd-x1dd+pow(*theta1d,2)*(*x3-x1)-pow(*theta2d,2)*(*x3-x2);
C = y2dd-y1dd+pow(*theta1d,2)*(*y3-y1)-pow(*theta2d,2)*(*y3-y2);
D = (*x3-x1)*(*y3-y2)-(*x3-x2)*(*y3-y1);
*theta1dd = ((B)*(*x3-x2)+(C)*(*y3-y2))/(D);
*theta2dd = ((B)*(*x3-x1)+(C)*(*y3-y1))/(D);
*x3dd = x1dd-pow(*theta1d,2)*(*x3-x1)-*theta1dd*(*y3-y1);
*y3dd = y1dd-pow(*theta1d,2)*(*y3-y1)+*theta1dd*(*x3-x1);
a1 = pow(*x3dd,2)+(*y3dd,2);
*a = sqrt(a1);
*beta = atan((*y3dd)/(*x3dd));
}
double RRP(double x1,double x1d,double x1dd,double y1,double y1d,double y1dd,double x2,double x2d,double x2dd,double y2,double y2d,double y2dd,double phi,double phid,double phidd,double r,double M,double *x3,double *x3d,double *x3dd,double *y3,double *y3d,double *y3dd,double *v,double *gamma,double *a,double *beta,double *theta,double *thetad,double *thetadd,double *s,double *sd,double *sdd)
{
double d,d1,v1,E,F,K,L,O,N,A,B;
d1 = pow(x2-x1,2)+pow(y2-y1,2);
d = sqrt(d1);
E = 2*((x2-x1)*cos(phi)+(y2-y1)*sin(phi));
F = d*d-r*r;
*s = abs(-E+M*sqrt(E*E-4*F))/2;
*x3 = x2+*s*cos(phi);
*y3 = y2+*s*sin(phi);
*theta = atan((*y3-y1)/(*x3-x1));
K = x2d-x1d-*s*phid*sin(phi);
L = y2d-y1d-*s*phid*cos(phi);
A = (*y3-y1)*sin(phi)+(*x3-x1)*cos(phi);
*thetad = (L*cos(phi)-K*sin(phi))/(A);
*sd = (-L*(*y3-y1)-K*(*x3-x1))/(A);
*x3d = x1d-*thetad*r*sin(*theta);
*y3d = y1d-*thetad*r*cos(*theta);
v1 = pow(*x3d,2)+pow(*y3d,2);
*v = sqrt(v1);
*gamma = atan((*y3d)/(*x3d));
O = (x2dd-x1dd+pow(*thetad,2)*(*x3-x1)-pow(phid,2)*(*s)*cos(phi)-2*phid*(*s)*sin(phi)-phidd*(*y3-y2));
N = (y2dd-y1dd+pow(*thetad,2)*(*y3-y1)-pow(phid,2)*(*s)*sin(phi)-2*phid*(*s)*cos(phi)-phidd*(*x3-x2));
B = (*y3-y1)*sin(phi)+(*x3-x1)*cos(phi);
*thetadd = (-O*sin(phi)+N*cos(phi))/(B);
*sdd = (-O*(*x3-x1)-N*(*y3-y1))/(B);
*x3dd = x1dd-pow(*thetad,2)*r*cos(*theta)-*thetadd*r*sin(*theta);
*y3dd = y1dd-pow(*thetad,2)*r*sin(*theta)+*thetadd*r*cos(*theta);
*a = sqrt((*x3dd)*(*x3dd)+(*y3dd)*(*y3dd));
*beta = atan((*y3d)/(*x3dd));
}
double QB(double x1,double x1d,double x1dd,double y1,double y1d,double y1dd,double phi,double phid,double phidd,double *x2,double *x2d,double *x2dd,double *y2,double *y2d,double *y2dd,double *v,double *gamma,double *a,double *beta)
{
*x2 = x1+cos(phi);
*y2 = y1+sin(phi);
*x2d = x1d-sin(phi)*phid;
*y2d = y1d+cos(phi)*phid;
*v = sqrt((*x2d)*(*x2d)+(*y2d)*(*y2d));
*gamma = atan((*y2d)/(*x2d));
*x2dd = x1dd-cos(phi)*phid*phid-sin(phi)*phidd;
*y2dd = y1dd-sin(phi)*phid*phid+cos(phi)*phidd;
*a = sqrt((*x2dd)*(*x2dd)+(*y2dd)*(*y2dd));
*beta = atan((*y2dd)/(*x2dd));
}
int main()
{
double s,sd,sdd,O,M,theta1,theta1d,theta1dd,theta2,theta2d,theta2dd,theta3,theta3d,theta3dd,theta4,theta4d,theta4dd,xa,xad,xadd,ya,yad,yadd,xc,xcd,xcdd,yc,ycd,ycdd,xb,xbd,xbdd,yb,ybd,ybdd,xd,xdd,xddd,yd,ydd,yddd,xe,xed,xedd,ye,yed,yedd,xf,xfd,xfdd,yf,yfd,yfdd,l1,l2,l3,l31,l32,l4,vb,gammab,ab,betab,vc,gammac,ac,betac,vd,gammad,ad,betad,ve,gammae,ae,betae,vf,gammaf,af,betaf,d23;
int i;
printf("请输入模式系数M:\n");
scanf("%lf",&M);
printf("请输入原动件的初始角(rad)和角速度(rad/s),并用逗号分隔:\n");
scanf("%lf,%lf",&theta1,&theta1d);
printf("请输入固定铰链A的坐标,并用逗号分隔:\n");
scanf("%lf,%lf",&xa,&ya);
printf("请输入固定铰链D的坐标,并用逗号分隔:\n");
scanf("%lf,%lf",&xd,&yd);
xdd = 0,xddd = 0;
ydd = 0,yddd = 0;
printf("请输入AB,BC,CD,EC,EF的长度(mm),并用逗号分隔:\n");
scanf("%lf,%lf,%lf,%lf,%lf",&l1,&l2,&l31,&l32,&l4);
l3=l31+l32;
xad = 0,xadd = 0;
yad = 0,yadd = 0;
theta1dd = 0;
QB(xa,xad,xadd,ya,yad,yadd,theta1,theta1d,theta1dd,&xb,&xbd,&xbdd,&yb,&ybd,&ybdd,&vb,&gammab,&ab,&betab);
RRR(xb,xbd,xbdd,yb,ybd,ybdd,xd,xdd,xddd,yd,ydd,yddd,l2,l31,M,&theta2,&theta2d,&theta2dd,&theta3,&theta3d,&theta3dd,&xc,&xcd,&xcdd,&yc,&ycd,&ycdd,&vc,&gammac,&ac,&betac);
QB(xd,xdd,xdd,yd,ydd,yddd,theta3,theta3d,theta3dd,&xe,&xed,&xedd,&ye,&yed,&yedd,&ve,&gammae,&ae,&betae);
RRP(xe,xed,xedd,ye,yed,yedd,xd,xdd,xddd,yd,ydd,yddd,O,O,O,l4,M,&xf,&xfd,&xfdd,&yf,&yfd,&yfdd,&vf,&gammaf,&af,&betaf,&theta4,&theta4d,&theta4dd,&s,&sd,&sdd);
printf("B点的坐标为(%lf,%lf),速度为%lf mm/s,速度方位角为%lf rad,加速度为%lf rad/(s^2),加速度方位角为%lf rad。\n",xb,yb,vb,gammab,ab,betab);
printf("C点的坐标为(%lf,%lf),速度为%lf mm/s,速度方位角为%lf rad,加速度为%lf mm/s,加速度方位角为%lf rad。\n",xc,yc,vc,gammac,ac,betac);
printf("E点的坐标为(%lf,%lf),速度为%lf mm/s,速度方位角为%lf rad,加速度为%lf mm/s,加速度方位角为%lf rad。\n",xe,ye,ve,gammae,ae,betae);
printf("F点的坐标为(%lf,%lf),速度为%lf mm/s,速度方位角为%lf rad,加速度为%lf mm/s,加速度方位角为%lf rad。\n",xf,yf,vf,gammaf,af,betaf);
printf("构件2的方位角为%lf rad,方位角速度为%lf rad/s,方位角加速度为%lf rad/(s^2)\n",theta2,theta2d,theta2dd);
printf("构件3的方位角为%lf rad,方位角速度为%lf rad/s,方位角加速度为%lf rad/(s^2)\n",theta3,theta3d,theta3dd);
printf("构件4的方位角为%lf rad,方位角速度为%lf rad/s,方位角加速度为%lf rad/(s^2)\n",theta4,theta4d,theta4dd);
return 0;
}