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_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() |
EDIT: fixed a typo
-------------- http://www.tldp.org/LDP/intro-linux/html/index.html
|