Results 1 to 10 of 35

Thread: Some gravity particles

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    I realized today that while 3D is great, is not necessary to simulate the gravity particle effect, or should you call it "anti-gravity". This can be done in 2D, with big gain in performance, and better results to look at.

    Now after testing it a little, it didn't seem to work somehow, or maybe i'm missing something. I also think that i'm able to rid of Sqrt() completely.
    Code:
        for i:=FFirst to FLast do
          with star[i] do
            for j:=i+1 to count-1 do begin
              xx:=v.x-star[j].v.x;
              yy:=v.y-star[j].v.y;
              d:=xx*xx+yy*yy;
              if d>0 then begin
                d:=(G_FORCE*G_FORCE)/(d*d*d); // Compiler should optimize the constant multiplication to 1 value
                // If not, just remove multiplication and change G_FORCE value
                if star[j].positive<>positive then d:=-d;
                vec.x:=(star[j].v.x-v.x)*d;
                vec.y:=(star[j].v.y-v.y)*d;
                movement.x:=movement.x+vec.x;
                movement.y:=movement.y+vec.y;
                star[j].movement.x:=star[j].movement.x-vec.x;
                star[j].movement.y:=star[j].movement.y-vec.y;
              end;
            end;
    The particles scatter endlessly, with no clear groupings done as was in 3D. I have tried with many different parameters. I wouldn't want to make boundaries to the "universe", where particles would bounce backwards, but i might have to. I also tried with every particle being same polarity, and they still did not group. It's not because of removal of sqrt(), that was almost last step in my tests, improvement to calculation time i'd say.

  2. #2
    Based on the code it seems you are only applying force to [j] particle and not to [i] particle at the same time.
    Haven't you been calculating force between two particle once and then applying that force to both of your particles at once?

  3. #3
    Quote Originally Posted by SilverWarior View Post
    Based on the code it seems you are only applying force to [j] particle and not to [i] particle at the same time.
    Haven't you been calculating force between two particle once and then applying that force to both of your particles at once?
    If i set NUM_TOTAL = 2; and 2 opposite particles, they start pushing eachother away in opposite direction, as should. Same code as before, i just commented Z-related lines. "with star[i] do" on second quoted line refers to "i" particle.

    I didn't do the math before, i was thinking it might still be relatively same effect.

    sqrt(4)*sqrt(4)*sqrt(4)
    = 2*2*2 = 8

    = sqrt(4*4*4)
    = sqrt(64) = 8

    X/Sqrt(Y)
    = (X*X)/Y , if Y>=0

  4. #4
    Quote Originally Posted by User137 View Post
    X/Sqrt(Y)
    = (X*X)/Y , if Y>=0
    Um, no. Trivially proven by X=1, Y=2.

  5. #5
    Oh crap... this is how it actually goes:
    X / Sqrt(Y)
    = (X*Sqrt(Y)) / Y
    which puts us back to square 1... on why doesn't it work, or works like that even when using sqrt? I have tried decreasing, but also increasing the G_FORCE to compensate lack of particle density in depth direction. But at the same time there is a more uniform force pulling every direction, from the overall system.

  6. #6
    If you scratch one dimension, you have to reduce the divisor - scratch one multiplication. Then it could be reduced further, this should work nicely:
    Code:
    d = G_FORCE / d
    Last edited by imcold; 21-06-2013 at 05:57 AM.

  7. #7
    Remember there were originally 2 multiplications in optimized version, so now it becomes 1 and that looks like working well
    Code:
    d:=G_FORCE/(d*d);
    I still want to give boundaries to the world though, and see what it'd be like. Kind of like how subsection would settle, and i expect a little plasma-like effect. Some days later perhaps.

    edit: Decided to code them straight away. (No plasma, but something more boring )
    Code:
                // Rectangular collision
                {if v.x<-10 then movement.x:=abs(movement.x)
                else if v.x>10 then movement.x:=-abs(movement.x);
                if v.y<-10 then movement.y:=abs(movement.y)
                else if v.y>10 then movement.y:=-abs(movement.y); }
                // Circular collision
                if v.x*v.x+v.y*v.y>100 then
                  movement:=reflect(movement, vector2f(-v.x*0.1,-v.y*0.1));
    Attached Images Attached Images
    Last edited by User137; 21-06-2013 at 07:25 AM.

  8. #8
    The modified "d" calculation doesn't produce the same values as the previous equation if you take out the sqrt, so the effect has to be different.
    Code:
    dist = sqrt(v)
    d = G_FORCE / (dist*dist*dist) = G_FORCE  / (sqrt(v) * sqrt(v) * sqrt(v))
    power:
    Code:
    d^2 = G_FORCE*G_FORCE / (v * v * v)
    d = sqrt(d^2)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •