1. #include<iostream>
2. #include<math.h>
3. #include<conio.h>
4. #include<Windows.h>
5. #include<graphics.h>
6. #define PI 3.14159265358
7. using namespace std;
8. double radianch(double theta)
9. {
10. return PI * theta/180;
11. }
12. double anglech(double theta)
13. {
14. return 180 * theta/PI;
15. }
16. double sins(double theta)
17. {
18. return sin(radianch(theta));
19. }
20. double coss(double theta)
21. {
22. return cos(radianch(theta));
23. }
24. //平方
25. double ecf(double L)
26. {
27. return L * L;
28. }
29. double chg(double L)
30. {
31. return L * 1000;
32. }
33.
34. void codinates(double a, double b, double c, double d, double e, double f, double alpha2, double alpha3, double alpha4)
35. {
36. double fai1;
37. double xAD, xBD, yAD, yBD, Jdbx, LBD, Jdbc, Jbdc, Jbdy;
38. double xE, yE, xF, yF;
39. //int graphdriver = DETECT;
40. //int graphmode, x;
41. initgraph(640, 480);
42. for (fai1 = 0; fai1 <= 360; fai1+=0.1)
43. {
44. yAD = d * sins(alpha4);
45. xAD = d * coss(alpha4);
46. xBD = xAD - a * coss(fai1);
47. yBD = yAD - a * sins(fai1);
48. Jdbx = anglech(atan(yBD / xBD));
49. LBD = yBD / sins(Jdbx);
50. Jdbc = anglech(acos((ecf(LBD) + ecf(b) - ecf(c)) / (2 * LBD * b)));
51. Jbdc = anglech(acos((ecf(LBD) + ecf(c) - ecf(b)) / (2 * LBD * c)));
52. Jbdy = anglech(atan(xBD / yBD));
53. //真实坐标值
54. //xE = a * coss(fai1) + e * coss(alpha2 - Jdbc + Jdbx);
55. //yE = a * sins(fai1) + e * sins(alpha2 - Jdbc + Jdbx);
56. //xF = d * coss(alpha4) + f * coss(270 - alpha3 - Jbdy + Jbdc);
57. //yF = d * sins(alpha4) + f * sins(270 - alpha3 - Jbdy + Jbdc);
58. //除以5是为了缩小轨迹,不然所需要的图框范围过大
59. //因为画图坐标是以窗口为原点,无负坐标,加200是为了是坐标都在第一象限
60. xE = 200 + (a * coss(fai1) + e * coss(alpha2 - Jdbc + Jdbx)) / 5;
61. yE = 200 + (a * sins(fai1) + e * sins(alpha2 - Jdbc + Jdbx)) / 5;
62. xF = 200 + (d * coss(alpha4) + f * coss(270 - alpha3 - Jbdy + Jbdc)) / 5;
63. yF = 200 + (d * sins(alpha4) + f * sins(270 - alpha3 - Jbdy + Jbdc)) / 5;
64. //cout << xF;
65. //横向x轴,纵向y轴
66. putpixel(xE, yE, RED);
67. putpixel(xF, yF, YELLOW);
68. }
69. circle(200, 200, 2);
70. circle(311.4738, 421.8746, 2);
71. circle(264.3488, 111.1246, 2);
72. circle(238.691, 200, 2);
73. line(200, 200, 238.691, 200);
74. line(311.4738, 421.8746, 253.7075, 294.64961);
75. line(238.691, 200, 244.953, 293.9333);
76. line(311.4738, 421.8746, 264.3488, 111.1246);
77. line(238.691, 200, 264.3488, 111.1246);
78. getchar();
79. closegraph(); // 关闭绘图窗口
80. }
81.
82. void calculate(double k, double gamma2, double fai, double alpha4)
83. {
84. //四杆机构相对尺寸计算
85. double theta, theta0, gamma1, A, B, N, a0, b0, c0;
86. theta = 180 * (k - 1) / (k + 1);
87. gamma1 = fai + gamma2 - theta;
88. theta0 = anglech( atan((sins(gamma2) * sins(theta))/ (sins(gamma1) - sins(gamma2) * coss(theta))));
89. A = coss(theta + theta0) * sins(gamma2 + theta0);
90. B = sins(gamma2) + sins(theta0) * coss(gamma1 + theta + theta0);
91. N = 2 * sins(gamma2) * coss(theta + theta0);
92. a0 = (A - B) / N;
93. b0 = (A + B) / N;
94. c0 = sins(theta0) / sins(gamma2);
95. //检查调试
96. //cout << a0 <<" "<< b0 <<" "<< c0 << endl;
97. //计算四杆机构的绝对尺寸
98. int L = 1,t;
99. double Vt = 2, delta = 1.02, k1 = 1.1,n1,omega1,a,b,c,d,mu_L;
100. t = L / Vt;
101. n1 = 60 * Vt / L;
102. omega1 = 2 * PI * Vt / L;
103. a = k1 * delta * L / (2 * PI);
104. mu_L = a / a0;
105. b = mu_L * b0;
106. c = mu_L * c0;
107. d = mu_L;
108. //cout << a <<" "<< b <<" "<< c << endl;
109. //刀刃位置确定
110. int h = 250, deta_h = 5, deta_b = 1;
111. double f, e, deta_alpha, alpha3, Lce, Lcf, alpha2, Lcef, alpha2_x, alpha3_x;
112. f = 1000*d * coss(alpha4) - h;//乘1000是为了单位转换
113. e = sqrt(ecf(f - deta_h) + ecf(chg(d)- chg(a)) - 2 * (f - deta_h) * (chg(d) - chg(a))*coss(alpha4));
114. deta_alpha = anglech(acos((ecf(c) + ecf(d - a) - ecf(b)) / (2 * c * (d - a))));
115. alpha3 = deta_alpha + alpha4;
116. Lce = sqrt(ecf(chg(c)) + ecf(f - deta_h) - 2 * chg(c) * (f - deta_h) * coss(alpha3));
117. Lcf = sqrt(ecf(chg(c)) + ecf(f) - 2 * chg(c) * (f) * coss(alpha3));
118. Lcef = (Lce + Lcf) / 2;
119. alpha2_x = anglech(acos((ecf(chg(b)) + ecf(e) - ecf(Lcef)) / (2 * chg(b) * e)));
120. alpha3_x = anglech(acos((ecf(chg(c)) + ecf(f) - ecf(Lcef)) / (2 * chg(c) * f)));
121. //cout << alpha2_x << " " << alpha3_x << endl;
122. //剪切角φ1(0)的确定
123. double Jbec, Jdec, Jbed, Jdab, Lbd, fai10;
124. Jbec = anglech(acos((ecf(e) + ecf(Lcef) - ecf(chg(b))) / (2 * e * Lcef)));
125. Jdec = anglech(acos((ecf(f) + ecf(Lcef) - ecf(chg(c))) / (2 * f * Lcef)));
126. Jbed = Jbec + Jdec;
127. Lbd = sqrt(ecf(e) + ecf(f) - 2 * e * f * coss(Jbed));
128. Jdab = anglech(acos((ecf(chg(a)) + ecf(chg(d)) - ecf(Lbd)) / (2 * chg(a) * chg(d))));
129. fai10 = alpha4 - Jdab;
130. //cout << fai10;
131. //调整上下刀刃水平速度误差
132. double faii, fai3, fai2, faiE, deta_faiE, alpha4_x, fai10_x, fai2_x, fai3_x;
133. faii = anglech(atan((d * sins(alpha4) - a * sins(fai10)) / (d * coss(alpha4) - a * coss(fai10))));
134. fai3 = faii + (360-anglech(acos((ecf(chg(b)) - ecf(Lbd) - ecf(chg(c))) / (2 * Lbd * chg(c)))));
135. fai2 = anglech(atan((Lbd * sins(faii) + chg(c) * sins(fai3)) / (Lbd * coss(faii) + chg(c) * coss(fai3))));
136. faiE = anglech(atan((e * sins(fai2 + alpha2_x) - chg(b) * sins(fai2)) / (e * coss(fai2 + alpha2_x) - chg(b) * coss(fai2))));
137. deta_faiE = faiE - 90;
138. alpha4_x = alpha4 - deta_faiE;
139. fai10_x = fai10 - deta_faiE;
140. fai2_x = fai2 - deta_faiE;
141. fai3_x = fai3 - deta_faiE;
142. //cout << fai3_x;
143. //调整刀刃与钢材运动速度同步
144. double omega2, omega3, VEt, VFt, Vdao, detlai, k1_x, a_x, mu_x, b_x, c_x, d_x, e_x, f_x;
145. omega2 = (-chg(a) * omega1 * sins(fai10_x - fai3_x)) / (chg(b) * sins(fai2_x - fai3_x));
146. omega3 = (chg(a) * omega1 * sins(fai10_x - fai2_x)) / (chg(c) * sins(fai3_x - fai2_x));
147. VEt = chg(a) * omega1 * coss(fai10_x) + e * omega2 * coss(fai2_x + alpha2_x);
148. VFt = f * omega3 * coss(fai3_x - alpha3_x);
149. Vdao = (VEt + VFt) / 2;
150. detlai = Vdao / Vt;
151. k1_x = chg(a) * omega1 / Vdao;
152. a_x = chg(k1_x * delta * Vt / omega1);
153. mu_x = a_x / chg(a);
154. b_x = chg(mu_x * b);
155. c_x = chg(mu_x * c);
156. d_x = chg(mu_x * d);
157. f_x = mu_x * f;
158. e_x = mu_x * e;
159. //cout << alpha2_x;
160. //计算坐标
161. codinates(a_x, b_x, c_x, d_x, e_x, f_x, alpha2_x, alpha3_x, alpha4_x);
162. }
163.
164. int main()
165. {
166. double k, gamma2, fai, alpha4;
167. //cin >> k >> gamma2 >> fai >> alpha4;
168. k = 1.16; gamma2 = 72; fai = 18; alpha4 = 26;
169. calculate(k, gamma2, fai, alpha4);
170. system("pause");
171. return 0;
172. }
其他点的坐标,我直接上的数据,直接算出来了