DEMO_Jansen_linkage_animation_01

Below is a demonstration for:

Contents

Keywords

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