# Functional Objects

Function
Mechanism in which an arm C carrying a pen rotates around a pivot which joins two links, one attached to rotating arm A, the other to rotating arm B. Care needed to ensure mechanism is viable 2*AR + AB + 2*BR < Al + Bl and that the linkage remains valid.
Snake by Kit :
Randomly set the parameter values

Path Step size Scale Max Cycles Line Width Line Color Padding

## Function code

```
function fn(t,p,scale) {
if (!positive( (Al+Bl) - (2*AR+AB+2*BR)))
{alert("mechanism impossible: "+ "links: "+ (Al+Bl)+ " less than base: "+(2*AR+AB+2*BR)); throw("mechanism impossible")}
d=AB+AR+BR;
Ax=AR*cos(t*Ar+Ap);Ay=AR*sin(t*Ar+Ap);
Bx=BR*cos(t*Br+Bp);By=BR*sin(t*Br+Bp);
dx=d-(Bx+Ax); dy=By-Ay;
Cl=Math.sqrt(dx*dx+dy*dy);
AB=Math.atan2(dy,dx)*180/Math.PI;
if (!triangle(Cl,Al,Bl)) {alert("not a triangle: " + Cl +" "+Al+" "+Bl); throw("not a triangle");}
Aa=Math.acos((Al*Al + Cl*Cl -Bl*Bl) /(2*Cl*Al)) *180/Math.PI;
AC=(Aa+AB);
Px=Al*cos(AC);Py=Al*sin(AC);
Cx=CR*cos(t*Cr+Cp); Cy=CR*sin(t*Cr+Cp);
X= Px+Ax+Cx;Y= Py+Ay+Cy;
//            console.log(d,Cl,Al,Bl,triangle(Cl,Al,Bl),)
return [scale*X,scale*Y]
}
```