DEMO_Jansen_linkage_animation_01
Below is a demonstration for:
- Creating/running an animation for the Jansen linkage.
Contents
Keywords
- Jansen linkage
- Linkage
- anim8
References
clear; close all; clc;
Plot settings
fontSize=25; lineWidth1=5; lineWidth2=2; markerSize=35;
V=[38,7.80000000000000,0;... 38,22.8000000000000,0;... -8.73570000000000,40.5702000000000,0;... -39.6678000000000,-5.87170000000000,0;... 0,0,0;-19.4476000000000,-39.6874000000000,0;... 17.0047000000000,-35.4306000000000,0;... 30.3109000000000,-82.5894000000000,0]; E = [1 2; 2 3;3 4;3 5;4 5;4 6;5 7;6 7;6 8;7 8;2 7]; CE = (1:1:size(E,1))'; L=patchEdgeLengths(E,V); %Determine initial angle of crank a10=90+atand(abs((V(2,1)-V(1,1))/(V(2,2)-V(1,2))));
VE=patchCentre(E,V); hf=cFigure; hold on; he=gedge(E,V,CE,lineWidth1); pointAnnotate(V,[],'FontSize',fontSize); pointAnnotate(VE,[],'FontSize',fontSize); gedge(E,V,'k',1); %Initial plotV(V,'k.','MarkerSize',15); %Initial hp=plotV(V,'k.','MarkerSize',markerSize); axis equal; axis tight; grid on; box on; axis([-80 60 -90 60]); set(gca,'FontSize',fontSize); colormap viridis; icolorbar; %colorbar off; axis off; drawnow;

Vt=V;
nSteps=100; %Number of animation steps %Create angles to set view aRange=linspace(a10,a10+360,nSteps); %Create the time vector animStruct.Time=aRange; V8t=zeros(nSteps,3); for q=1:1:nSteps a1=aRange(q); %The current angle [Vt]=getxyval(a1,E,V); V8t(q,:)=Vt(8,:); Vt=real(Vt); [~,Vtt]=patchDetach(E,Vt); %Set entries in animation structure animStruct.Handles{q}=[he hp hp hp]; %Handles of objects to animate animStruct.Props{q}={'Vertices','XData','YData','ZData'}; %Properties of objects to animate animStruct.Set{q}={Vtt,Vt(:,1),Vt(:,2),Vt(:,3)}; %Property values for to set in order to animate end plotV(V8t,'r--','LineWidth',lineWidth2); anim8(hf,animStruct);
function [V]=getxyval(a1,E,V)
g5_34=vecAngle(V(3,:)-V(5,:),V(4,:)-V(5,:)); g7_68=vecAngle(V(6,:)-V(7,:),V(8,:)-V(7,:)); %Compute all lengths L=patchEdgeLengths(E,V); %Update coordinate for P2 V(2,1)=cosd(a1)*L(1)+V(1,1); V(2,2)=sind(a1)*L(1)+V(1,2); %Distance between P2 and P5 d25=sqrt(sum((V(2,:)-V(5,:)).^2,2)); a25=vecAngle(V(2,:)-V(5,:),[1 0 0]); g5_23=acosd((L(2)^2-d25^2-L(4)^2)./(-2*d25*L(4))); %Flip sign of angle when needed % a4=atand(R41(2)/R41(1)); if dot(V(2,:)-V(5,:),[0 1 0])<0 %&& (a1-a4)<360 a25=-a25; end a3=a25+g5_23; V(3,1)=cosd(a3)*L(4)+V(5,1); V(3,2)=sind(a3)*L(4)+V(5,2);
a4=a3+g5_34 V(4,1)=cosd(a4)*L(5)+V(5,1); V(4,2)=sind(a4)*L(5)+V(5,2);
a4 = 188.4199
a4 = 189.8770
a4 = 191.3163
a4 = 192.7325
a4 = 194.1201
a4 = 195.4730
a4 = 196.7845
a4 = 198.0474
a4 = 199.2539
a4 = 200.3954
a4 = 201.4626
a4 = 202.4454
a4 = 203.3327
a4 = 204.1123
a4 = 204.7714
a4 = 205.2961
a4 = 205.6714
a4 = 205.8821
a4 = 205.9121
a4 = 205.7458
a4 = 205.3679
a4 = 204.7647
a4 = 203.9249
a4 = 202.8408
a4 = 201.5095
a4 = 199.9343
a4 = 198.1252
a4 = 196.0999
a4 = 193.8833
a4 = 191.5068
a4 = 189.0068
a4 = 186.4225
a4 = 183.7939
a4 = 181.1595
a4 = 178.5544
a4 = 176.0090
a4 = 173.5487
a4 = 171.1930
a4 = 168.9566
a4 = 166.8491
a4 = 164.8764
a4 = 163.0409
a4 = 161.3425
a4 = 159.7792
a4 = 158.3476
a4 = 157.0434
a4 = 155.8615
a4 = 154.7969
a4 = 153.8441
a4 = 152.9980
a4 = 152.2534
a4 = 151.6055
a4 = 151.0498
a4 = 150.5820
a4 = 150.1982
a4 = 149.8947
a4 = 149.6683
a4 = 149.5160
a4 = 149.4349
a4 = 149.4227
a4 = 149.4771
a4 = 149.5960
a4 = 149.7777
a4 = 150.0205
a4 = 150.3228
a4 = 150.6833
a4 = 151.1007
a4 = 151.5738
a4 = 152.1015
a4 = 152.6828
a4 = 153.3166
a4 = 154.0019
a4 = 154.7377
a4 = 155.5230
a4 = 156.3569
a4 = 157.2381
a4 = 158.1656
a4 = 159.1382
a4 = 160.1548
a4 = 161.2139
a4 = 162.3143
a4 = 163.4543
a4 = 164.6325
a4 = 165.8472
a4 = 167.0966
a4 = 168.3789
a4 = 169.6919
a4 = 171.0337
a4 = 172.4019
a4 = 173.7943
a4 = 175.2083
a4 = 176.6413
a4 = 178.0906
a4 = 179.5531
a4 = 181.0259
a4 = 182.5055
a4 = 183.9885
a4 = 185.4713
a4 = 186.9498
a4 = 188.4199
g5_27=acosd((L(11)^2-d25^2-L(7)^2)./(-2*d25*L(7)))
a7=-(g5_27-a25);
V(7,1)=cosd(a7)*L(7)+V(5,1);
V(7,2)=sind(a7)*L(7)+V(5,2);
%Distance between P4 and P7
d47=sqrt(sum((V(4,:)-V(7,:)).^2,2));
g7_47_1=acosd((L(5)^2-d47^2-L(7)^2)./(-2*d47*L(7)));
g7_47_2=acosd((L(6)^2-d47^2-L(8)^2)./(-2*d47*L(8)));
g7_47=g7_47_1+g7_47_2;
a57=vecAngle(V(5,:)-V(7,:),[1 0 0]);
a6=g7_47+a57;
V(6,1)=cosd(a6)*L(8)+V(7,1);
V(6,2)=sind(a6)*L(8)+V(7,2);
g5_27 = 95.3254
g5_27 = 96.6539
g5_27 = 98.0536
g5_27 = 99.5269
g5_27 = 101.0763
g5_27 = 102.7047
g5_27 = 104.4155
g5_27 = 106.2121
g5_27 = 108.0982
g5_27 = 110.0778
g5_27 = 112.1549
g5_27 = 114.3338
g5_27 = 116.6184
g5_27 = 119.0122
g5_27 = 121.5181
g5_27 = 124.1376
g5_27 = 126.8703
g5_27 = 129.7128
g5_27 = 132.6575
g5_27 = 135.6906
g5_27 = 138.7896
g5_27 = 141.9199
g5_27 = 145.0302
g5_27 = 148.0463
g5_27 = 150.8639
g5_27 = 153.3425
g5_27 = 155.3069
g5_27 = 156.5673
g5_27 = 156.9699
g5_27 = 156.4588
g5_27 = 155.1043
g5_27 = 153.0680
g5_27 = 150.5400
g5_27 = 147.6918
g5_27 = 144.6596
g5_27 = 141.5434
g5_27 = 138.4145
g5_27 = 135.3219
g5_27 = 132.2985
g5_27 = 129.3655
g5_27 = 126.5358
g5_27 = 123.8166
g5_27 = 121.2108
g5_27 = 118.7185
g5_27 = 116.3380
g5_27 = 114.0664
g5_27 = 111.8999
g5_27 = 109.8347
g5_27 = 107.8666
g5_27 = 105.9914
g5_27 = 104.2054
g5_27 = 102.5047
g5_27 = 100.8859
g5_27 = 99.3458
g5_27 = 97.8815
g5_27 = 96.4905
g5_27 = 95.1703
g5_27 = 93.9190
g5_27 = 92.7348
g5_27 = 91.6159
g5_27 = 90.5611
g5_27 = 89.5691
g5_27 = 88.6389
g5_27 = 87.7697
g5_27 = 86.9607
g5_27 = 86.2113
g5_27 = 85.5210
g5_27 = 84.8895
g5_27 = 84.3163
g5_27 = 83.8013
g5_27 = 83.3442
g5_27 = 82.9449
g5_27 = 82.6033
g5_27 = 82.3193
g5_27 = 82.0928
g5_27 = 81.9239
g5_27 = 81.8124
g5_27 = 81.7584
g5_27 = 81.7618
g5_27 = 81.8228
g5_27 = 81.9411
g5_27 = 82.1170
g5_27 = 82.3504
g5_27 = 82.6413
g5_27 = 82.9899
g5_27 = 83.3961
g5_27 = 83.8601
g5_27 = 84.3821
g5_27 = 84.9623
g5_27 = 85.6009
g5_27 = 86.2982
g5_27 = 87.0548
g5_27 = 87.8710
g5_27 = 88.7475
g5_27 = 89.6850
g5_27 = 90.6845
g5_27 = 91.7470
g5_27 = 92.8736
g5_27 = 94.0659
g5_27 = 95.3254
a10=a6+g7_68; V(8,1)=cosd(a10)*L(10)+V(7,1); V(8,2)=sind(a10)*L(10)+V(7,2); % % %Create point coordinate array P % P=[x y]; % % %Use vector dot product to compute angle between links % R12=P(2,:)-P(1,:); % R41=P(1,:)-P(4,:); % t1=acosd(dot(R12,-R41)./(L1*L4)); % % %Use law of cosines to compute length of diagonal from P2-P4 % d=sqrt(L1^2+L4^2-2*L1*L4*cosd(t1)); % % %Use law of cosines to compute angles beta and gamma % b=acosd((L2^2-L3^2-d^2)/(-2*L3*d)); % g=acosd((L1^2-L4^2-d^2)/(-2*L4*d)); % % %Flip sign of angle when needed % a4=atand(R41(2)/R41(1)); % if (a1-a4)>180 && (a1-a4)<360 % g=-g; % end % a3=a4+180-(b+g); % % %Update coordinate of P3 % x(3)=cosd(a3)*L3+x(4); % y(3)=sind(a3)*L3+y(4);
end function [a]=vecAngle(r1,r2) a=acosd(dot(r1,r2)./(sqrt(sum(r1.^2))*sqrt(sum(r2.^2)))); end