An approach to construct and explain Hoberman linkage​
​by Sándor Kabai
In[]:=
Dynamic[Manipulate[​​(*centrecoordinates*)​​v0={0,0,0};​​(*halftheangleoftwolinesalongwhichthetwoendsofabarhavetorun."polygon"hereisavariable:itisanintegerdetermininghowmanypartsareusedinaring,i.e.thenumberofsidesoftheenvelopingpolygon*)​​Δ=Pi/polygon;​​(*ycoordinateofpointB,whichisoneendofabar.Itismadeequalto"lift",whichrepresentsthemovement*)​​By=lift;​​(*xcoordinateofpointB*)​​Bx=ByTan[Δ];​​(*verticalcoordinateofpointBiszero,sinceweconsiderthatthemovementtakesplaceinahorizontalplane*)​​Bz=0;​​(*CoordinatesofpointB1andB2,whicharesymmetrictotheaxis*)​​vB1={-Bx,By,Bz};​​vB2={Bx,By,Bz};​​(*PointAisthehinge,wheretwobarsareconnected.Itmovesalongtheaxis.ThedistanceofABisassumedtobe1.Thisishalfofabar*)​​Ay=By+Sqrt[1-Bx^2];​​Ax=0;​​Az=0;​​vA={Ax,Ay,Az};​​(*PointPandQaretheendpointsoftwolinesstartedfromtheorigin.*)​​Py=6;Pz=0;​​Px=PyTan[Δ];​​vP={-Px,Py,Pz};​​vQ={Px,Py,Pz};​​(*linestoPandQfromtheorigin*)​​line1=Line[{v0,vP}];​​line2=Line[{v0,vQ}];​​(*centralline,dashed*)​​linec={Dashed,Line[{v0,{0,8,0}}]};​​(*wislinefromPointAtoline1perpendicularly*)​​w=AySin[Δ];​​(*visthethirdsideofatriangleformedbytheBA(whichis1)andw*)​​v=Sqrt[1-w^2];​​(*uistheradialdistanceofPointBfromtheorigin*)​​u=Sqrt[Bx^2+By^2];​​(*PointC1andC2aretheendsofbar,whichhavetorunonline1andline2.SinceACis1,arectangulartirangleappearsherewithsidesAC,vandw,correspondingtotriangleAB,w,v,thereforetheradialdistanceofPointCis2v+u​​*)​​Cx=(2v+u)Sin[Δ];​​Cy=Cx/Tan[Δ];​​Cz=0;​​vC1={Cx,Cy,Cz};​​vC2={-Cx,Cy,Cz};​​(*Thebarsaredepictedwithcylindersestablshedbetweengivenpoints."size"heremeansthediameter*)​​size=0.04;​​barB1={RGBColor[1,.47,0],Cylinder[{vA,vB1},size]};​​barB2=Cylinder[{vA,vB2},size];​​barC1={RGBColor[1,.47,0],Cylinder[{vA,vC1},size]};​​barC2=Cylinder[{vA,vC2},size];​​(*TheHobermanscrissor,whichinrealityconsistsoftwocrossedbars,isassembledherefromfourbars."cross1"isaunit,whichcombinesthefourbarsandthethreelines,The"If"hereisaconditiontoshowornottoshowtheotherbar*)​​cross1={line1,line2,linec,barB1,barC1,If[baro,{barB2,barC2},{}]};​​(*hoberisproducedbyrepeatingtheunitcross1a"number"oftimesafterrotatingaroungaxisz{0,0,1}byi*2Δ*)​​hober=Table[Rotate[cross1,i2Δ,{0,0,1}],{i,number}];​​(*textaddedatgivencoordinates*)​​tA=Text[Style["A",Blue,Bold,24],vA];​​tB1=Text[Style["B1",20],vB1];​​tB2=Text[Style["B2",20],vB2];​​tC1=Text[Style["C1",30],vC1];​​tC2=Text[Style["C2",30],vC2];​​(*allobjectsarecombined*)​​Graphics3D[{tA,tB1,tB2,tC1,tC2,cross1,If[scissors,hober,{}]},​​(*Graphics3Doptionsstarthere*)​​ImageSize{400,400},ViewAnglePi/14,ViewPoint{0,0,3},SphericalRegionTrue,BoxedFalse],​​{{baro,False,"show other bar"},{True,False}},​​{{polygon,15,"polygon"},{6"6",10"10",15"15",30"30"},ImageSizeTiny},​​{{lift,3,"lift"},0,Cos[Pi/polygon]/Tan[Pi/polygon],ImageSizeTiny},​​{{scissors,False,"show scissors"},{True,False}},​​{{number,1,"scissors No"},1,polygon,1,Appearance"Labeled",ImageSizeTiny},​​​​ControlPlacementLeft,TrackedSymbolsManipulate]]
Out[]=
​
show other bar
polygon
6
10
15
30
lift
show scissors
scissors No
1
In[]:=
(*thisshowshowthecoordinatesofPontCarecalcultedwiththehelpofaintermadiatePointV*)​​Vx=-wCos[Δ];​​Vy=By+vCos[Δ];​​Vz=0;​​vV={Vx,Vy,Vz};​​AV=Line[{vA,vV}];​​tV=Text[Style["V",24,Red],vV];​​(*sphereorcylnderplacesatthenodes*)​​sC1=Sphere[{vC1},0.14];​​sC2=Cylinder[{{-(2v+u)Sin[Δ],Cx/Tan[Δ],-0.3},{-(2v+u)Sin[Δ],Cx/Tan[Δ],0.3}},0.14];​​​​Graphics3D[{sC1,sC2,tV,AV,tA,tB1,tB2,tC1,tC2,cross1,barB2,barC2},ViewPoint{0,0,4},SphericalRegionTrue,BoxedFalse]
Out[]=