mikshaw
Group: Members
Posts: 4856
Joined: July 2004 

Posted: Jan. 23 2008,20:03 

Quote  since you're taking the squares of the distance, you don't need to take the absolute values of each component  I didn't know that. Thanks. EDIT: seems like it is needed after a quick test
Quote  Also, it seems that there is always a gravity point at the top left corner (0,0)?  I'd seen that in other tests as well. Since I don't know real math, I just ignored that. I think I've got that fixed, though, as well as the problem with all objects always moving at 45 degree angles.
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.
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_xball[i]:x()) local ydistance=math.abs(my_yball[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() 
EDIT: fixed a typo
 http://www.tldp.org/LDP/introlinux/html/index.html
