swing togeteher or perish
Log in to post a comment.
Canvas.setpenopacity(-0.1); const N = 40; // min=5, max=40, step=1 const M = 50; // min=10, max=100, step=1 const L1 = 50; // min=10, max=90, step=1 const L2 = 50; // min=10, max=90, step=1 const delta = 0.03; // min = 0.01, max=2.0, step = 0.01 const d_max = 5; // min=1, max=15, step=0.1 const dt = 0.03; // min=0.01, max=0.1, step=0.01 const g = 2.5; // min=1, max=20, step=0.1 const turtles = [] const phi1 = [] const phi2 = [] const speed1 = [] const speed2 = [] const done = [] const m1 = 1, m2 = 1 for (let i = 0; i < N; i++) { turtles[i] = new Turtle(); phi1[i] = [] phi2[i] = [] speed1[i] = [] speed2[i] = [] done[i] = [] p1 = Math.random() * 2 * Math.PI p2 = Math.random() * 2 * Math.PI for (let j = 0; j < M; j++) { done[i][j] = false phi1[i][j] = p1 - delta/2 + delta/(M - 1)*j phi2[i][j] = p2 - delta/2 + delta/(M - 1)*j speed1[i][j] = 0 speed2[i][j] = 0 } } function walk(i) { let n_active = 0 for (let i = 0; i < N; i++) { if (! done[i][0]) { n_active++ let not_done = 0 let x0 = 0, y0 = 0 for (let j = 0; j < M; j++) { if (! done[i][j]) { not_done++ let prvx1 = L1 * Math.sin(phi1[i][j]) let prvy1 = L1 * Math.cos(phi1[i][j]) let prvx2 = prvx1 + L2 * Math.sin(phi2[i][j]) let prvy2 = prvy1 + L2 * Math.cos(phi2[i][j]) let p1 = phi1[i][j], p2 = phi2[i][j] let o1 = speed1[i][j], o2 = speed2[i][j] let omega1 = (-g * (2 * m1 + m2) * Math.sin(p1) - m2 * g * Math.sin(p1 - 2 * p2) - 2 * Math.sin(p1 - p2) * m2 * (o2**2 * L2 + o1**2 * L1 * Math.cos(p1 - p2))) / (L1 * (2 * m1 + m2 - m2 * Math.cos(2 * p1 - 2 * p2))) let omega2 = 2 * Math.sin(p1 - p2) * (o1**2 * L1 * (m1 + m2) + g * (m1 + m2) * Math.cos(p1) + o2**2 * L2 * m2 * Math.cos(p1 - p2)) / (L2 * (2 * m1 + m2 - m2 * Math.cos(2 * p1 - 2 * p2))) speed1[i][j] += omega1 * dt speed2[i][j] += omega2 * dt phi1[i][j] += speed1[i][j] * dt phi2[i][j] += speed2[i][j] * dt let newx1 = L1 * Math.sin(phi1[i][j]) let newy1 = L1 * Math.cos(phi1[i][j]) let newx2 = newx1 + L2 * Math.sin(phi2[i][j]) let newy2 = newy1 + L2 * Math.cos(phi2[i][j]) if (j == 0) { x0 = newx2 y0 = newy2 } else if ((newx2 - x0)**2 + (newy2 - y0)**2 > d_max**2) { done[i][j] = true } turtles[i].jump(prvx2, prvy2) turtles[i].goto(newx2, newy2) } } if (not_done == 1) { done[i][0] = true } } } return (n_active > 0) && (i < 10000) }