ÎÌÌÌ̈ˆˆ¬ªªª¬ˆˆˆ¬ÌÌ̬ÌÀ̬ÌÀ̬ÌÀÌÌÌìÌÀÀî̬ÀÌÀ¬ÀÀÀ¬ÀÀÀ¬ÀÀÎÌÌÌ̈ˆˆ¬ªªª¬ˆˆˆ¬ÌÌ̬ÌÌ̬ÌÀ̬ÌÀÌÌÌìÌÀÀî̬ÀÌ̬ÀÀÀ¬ÀÀÀ¬ÀÀ¬ÌÌ̬ªªª¬ª¬ª¬ªÊ̬ªªªŒˆˆˆÌÀÌÎÌÌÎ̬̪ªÀ쬪ÀÀÀÌîÀìîÌÌîî¬ÌÌ̬ªªª¬ª¬ª¬ªÊ̬ªªªŒˆˆˆÌÀÌÎÌÌÎ̬̪ªÀ쬪ÀÀÀÌîÀìîÌÌîî >}?PUUUUUUUUUPUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUPUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUPUUUUUUPUUUUUUPUUUUUUUUUUUUUUUUUUPUUUUUPUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUPUUUUUUPUUUUUUUUUUUPUUUUUPUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUPUUUUUPUUUUUPUUUUUPUUUUUPUUUUUPUUUUUPUUUUUPUUUUUPUUUUUPUUUUUUUUUUPUUUUUUUUUUPUUUUUUUUUUPUUUUUUUUUUPUUUUUUUUUUPUUUUUUUUUUPUUUUUUUUUUPUUUUUPUUUUUPUUUUUPUUUUUPUUUUUUUUUUUPUUUUUUUUUUUPUUUUUUPUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUU= -- title: blob -- author: Sava -- desc: Cool lil' blob. -- version: 0.1 -- script: lua w=240 h=136 part = {} rad = 5 targetDist1 = 50 targetDist2 = 2 stiffness1 = 0.1 stiffness2 = 0.3 function BOOT() for i=0, 60 do local x = math.cos(math.rad(i*6))*50+w/2 local y = math.sin(math.rad(i*6))*50+h/2 part[#part+1] = {x=x, y=y, prevx=x, prevy=y} end trace("start") end function TIC() cls(0) local mx, my, left, middle, right = mouse() local nleft, nright = 0, 0 if left then nleft = 1 end if right then nright = 1 end update(mx, my, (-nleft+nright)) draw() end function update(mx, my, mf) for i=1, #part do local curPx, curPy = part[i].prevx, part[i].prevy part[i].prevx, part[i].prevy = part[i].x, part[i].y-0.1 part[i].x = part[i].x + (part[i].x-curPx) part[i].y = part[i].y + (part[i].y-curPy) if part[i].x < rad then part[i].x = rad end if part[i].x > w-rad then part[i].x = w-rad end if part[i].y < rad then part[i].y = rad end if part[i].y > h-rad then part[i].y = h-rad end local j = math.floor((i+#part/2)%#part)+1 local spdX1, spdY1, spdX2, spdY2 = spring(part[i].x, part[i].y, part[j].x, part[j].y, targetDist1, stiffness1) part[i].x, part[i].y = part[i].x-spdX1, part[i].y-spdY1 part[j].x, part[j].y = part[j].x-spdX2, part[j].y-spdY2 j = math.floor((i+1)%#part)+1 spdX1, spdY1, spdX2, spdY2 = spring(part[i].x, part[i].y, part[j].x, part[j].y, targetDist2, stiffness2) part[i].x, part[i].y = part[i].x-spdX1, part[i].y-spdY1 part[j].x, part[j].y = part[j].x-spdX2, part[j].y-spdY2 j = math.floor((i-1)%#part)+1 spdX1, spdY1, spdX2, spdY2 = spring(part[i].x, part[i].y, part[j].x, part[j].y, targetDist2, stiffness2) part[i].x, part[i].y = part[i].x-spdX1, part[i].y-spdY1 part[j].x, part[j].y = part[j].x-spdX2, part[j].y-spdY2 local mdist = math.max(dist(part[i].x, part[i].y, mx, my), 0.001) local afX, afY = mf/mdist*(mx-part[i].x), mf/mdist*(my-part[i].y) part[i].x, part[i].y = part[i].x-afX, part[i].y-afY end end function spring(x1, y1, x2, y2, targetDist, stiffness) local dx, dy = x2 - x1, y2 - y1 local currentDist = math.max(math.sqrt(dx*dx + dy*dy), 0.001) local directionX, directionY = dx/currentDist, dy/currentDist local displacement = currentDist - targetDist local forceX = -stiffness * displacement * directionX local forceY = -stiffness * displacement * directionY return forceX, forceY, -forceX, -forceY end function dist(x1, y1, x2, y2) return math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)) end function draw() for i=1, #part do circ(part[i].x, part[i].y, rad, 5) end end