Quote |
since you're taking the squares of the distance, you don't need to take the absolute values of each component |
Quote |
Also, it seems that there is always a gravity point at the top left corner (0,0)? |
Code Sample |
balls=1500 bsize=2 min_grav=0 max_grav=6 function grav_loop() local my_x,bx=Fl:event_x(),0 local my_y,by=Fl:event_y(),0 local c=math.random(1,255) -- random color for i=1,balls do local xdistance=math.abs(my_x-ball[i]:x()) local ydistance=math.abs(my_y-ball[i]:y()) local distance=math.sqrt(xdistance*xdistance+ydistance*ydistance) local xspeed=(min_grav+max_grav)/distance*xdistance local yspeed=(min_grav+max_grav)/distance*ydistance if distance <= 25 then -- warp it offscreen ball[i]:color(c) xspeed=xspeed*max_x/distance*math.random(2,3) yspeed=yspeed*max_y/distance*math.random(2,3) end if my_x > ball[i]:x() then bx=ball[i]:x()+xspeed else bx=ball[i]:x()-xspeed end if my_y > ball[i]:y() then by=ball[i]:y()+yspeed else by=ball[i]:y()-yspeed end ball[i]:position(bx,by) end w:redraw() grav_timer:doWait(.05) end w=fltk:Fl_Double_Window(Fl:w(),Fl:h(),"gravity test") w:color(0) math.randomseed(os.time()) max_x=w:w()-bsize max_y=w:h()-bsize ball={} for i=1,balls do ball[i]=fltk:Fl_Box(math.random(1,max_x),math.random(1,max_y),bsize,bsize) ball[i]:box(fltk.FL_FLAT_BOX) end grav_timer = murgaLua.createFltkTimer() grav_timer:callback(grav_loop) grav_timer:do_callback() w:fullscreen() w:show() Fl:run() |
Quote |
I messed around with the numbers for a while and came up with something else I like. So far I see one problem with it, that the objects gravitate toward a single x,y intersection over time if you don't move the mouse. |
Quote (mikshaw @ Jan. 23 2008,15:03) | ||
EDIT: seems like it is needed after a quick test |
Code Sample |
-- snip local yspeed=(min_grav+max_grav)/distance*ydistance -- cut out if statement if my_x > ball[i]:x() then bx=ball[i]:x()+xspeed else bx=ball[i]:x()-xspeed end if my_y > ball[i]:y() then by=ball[i]:y()+yspeed else by=ball[i]:y()-yspeed end -- add back warp if distance <= 25 then -- warp it ball[i]:color(b) bx = math.random(1,max_x) by = math.random(1,max_y) end -- /snip |
Quote |
This doesn't make the new dots offscreen though... did you want to specifically do that? |