#include <tclcad.h>
#include <geofnc.h>
/*
Example TCL to show the four-bar linkeage movetion

-- by Johnson Chou --
July 27, 1993
*/

fourbar(){
POINT cen1,pb1,pb2,cen2,temp1,temp11,temp2,temp22;
LINE bar1,bar2,bar3;
double ang00,ang0,ang1,ang2,seg,len1,len2,len3,len0,templ;
double La,Lb,sr;
int i,div;
setplot(0x8e,0,0,0);
cen1=getp("\nCenter 1:");
bar1=getln("\nBar 1:",cen1);
plotent(bar1);
bar2=getln("\nBar 2:",bar1.pe);
plotent(bar2);
bar3=getln("\nCen2 :",bar2.pe);
plotent(bar3);
cen2=bar3.pe;
len1=V(bar1);
len2=V(bar2);
len3=V(bar3);
len0=V(cen1,cen2);
sr=len1/20.;
setplot(0x8a,0,0,0);
plotent(C(cen1,sr),C(cen2,sr));
setplot(0x8e,0,0,0);
plotent(bar1,bar2,bar3);
ang0=ppangle(cen1,cen2);
if( len0+len1 > len2+len3 ){
La=tcos(len2+len3,len1,len0);
div=La/1+1;
seg=La/div;
temp1=ppolar(cen1,len1,ang0+La);
temp2=ppolar(cen2,len3,ppangle(cen2,temp1));
for(;;){
for(i=1;i<div*2;i++){
setplot(0x8e,0,0,0);
plotent(l(cen1,temp1),l(temp1,temp2),l(temp2,cen2));
setplot(0x8d,0,0,0);
plotent(C(temp1,sr),C(temp2,sr));
ang1=La-seg*i;
temp11=ppolar(cen1,len1,ang1+ang0);
templ=V(cen2,temp11);
ang00=ppangle(cen2,temp11);
ang2=tcos(len2,templ,len3);
temp22=ppolar(cen2,len3,ang00+ang2);
plotent(C(temp1,sr),C(temp2,sr),P((temp1+temp2)/2));
setplot(0x8e,0,0,0);
plotent(l(cen1,temp1),l(temp1,temp2),l(temp2,cen2));
temp1=temp11;
temp2=temp22;
}
temp1=ppolar(cen1,len1,ang0-La);
temp2=ppolar(cen2,len3,ppangle(cen2,temp1));
for(i=div*2-1;i>0;i--){
setplot(0x8e,0,0,0);
plotent(l(cen1,temp1),l(temp1,temp2),l(temp2,cen2));
setplot(0x8d,0,0,0);
plotent(C(temp1,sr),C(temp2,sr));
ang1=La-seg*i;
temp11=ppolar(cen1,len1,ang1+ang0);
templ=V(cen2,temp11);
ang00=ppangle(cen2,temp11);
ang2=tcos(len2,templ,len3);
temp22=ppolar(cen2,len3,ang00-ang2);
plotent(C(temp1,sr),C(temp2,sr),P((temp1+temp2)/2));
setplot(0x8e,0,0,0);
plotent(l(cen1,temp1),l(temp1,temp2),l(temp2,cen2));
temp1=temp11;
temp2=temp22;
}
temp1=ppolar(cen1,len1,ang0+La);
setplot(0x8e,0,0,0);
plotent(l(cen1,temp1),l(temp1,cen2));
setplot(0x8d,0,0,0);
plotent(C(temp1,sr),C(temp2,sr));
setplot(0x8e,0,0,0);
plotent(l(cen1,temp1),l(temp1,cen2));
setplot(0x8d,0,0,0);
plotent(C(temp1,sr),C(temp2,sr));
}
}
else{
ang0=lnangle(bar1);
temp1=bar1.pe;
temp2=bar2.pe;
for(;;){
for(i=0;i<360;i++){
setplot(0x8e,0,0,0);
plotent(l(cen1,temp1),l(temp1,temp2),l(temp2,cen2));
setplot(0x8d,0,0,0);
plotent(C(temp1,sr),C(temp2,sr));
ang1=ang0+i;
temp11=ppolar(cen1,len1,ang1);
templ=V(cen2,temp11);
ang00=ppangle(cen2,temp11);
ang2=tcos(len2,templ,len3);
temp22=ppolar(cen2,len3,ang00-ang2);
plotent(C(temp1,sr),C(temp2,sr),P((temp1+temp2)/2));
setplot(0x8e,0,0,0);
plotent(l(cen1,temp1),l(temp1,temp2),l(temp2,cen2));
temp1=temp11;
temp2=temp22;
}
}
}
}
tcos(a,b,c){
double temp;
temp=(b*b+c*c-a*a)/(2*b*c);
if(temp>1){
temp=1;
}
else if(temp<-1){
temp=-1;
}
return acos(temp);
}
lcos(a,b,c){
return sqrt(b*b+c*c-2*b*c*cos(a));
}
¡@