OK, the following program does something
using GLMakie
crank = 3.3
fixed = 6.8
coupler = 2
output = 9.3
θ1 = (61/90)*pi
k1 = fixed/crank
k2 = fixed/output
k3 = ((output^2 - coupler^2 + output^2 + fixed^2)/(2 *crank* output))
P1 = [0;0]
p4x = fixed*-cos(θ1)
p4y = fixed*-sin(θ1)
function mysqrt(x)
if x < 0
0.5
else
sqrt(x)
end
end
θ2 = Array(0:0.05:2*pi)
function xycoordinates(θ2)
A = (1-k2)*cos(θ2) - k1 + k3
B = -2*sin(θ2)
C = k1 - (1 + k2)*cos(θ2 + k3)
b = mysqrt(B^2 - 4A*C)
θ4 = 2*(atan((-B - b)/2A, (-B + b)/2A))
p2x = crank*cos(θ2)
p2y = crank*sin(θ2)
p3x = output*-cos(θ4)
p3y = output*sin(θ4)
return p2x, p2y, p3x, p3y
end
fig = Figure(); display(fig)
ax = Axis(fig[1,1])
ax.title = "crank mechanism"
p2x, p3x, p2y, p3y = xycoordinates(θ2[1])
mechanism = Observable([Point2f(0,0), Point2f(p2x,p2y), Point2f(p3x,p3y), Point2f(p4x,p4y)])
lines!(ax, mechanism; linewidth=4, color = :purple)
for i in 2:length(θ2)
global p2x, p3x, p2y, p3x = xycoordinates(θ2[i])
mechanism[] = [Point2f(0,0), Point2f(p2x,p2y), Point2f(p3x,p3y), Point2f(p4x,p4y)]
sleep(0.001)
end
Edit: fixed some mistakes…