View Single Post
Old 13-08-2010, 05:46 PM   #2
Kippesoep
Forum hobbit
 
Kippesoep's Avatar


 
Join Date: Nov 2007
Location: Etten, Netherlands
Posts: 42
Default

Well, eliminating the square root is a good idea, but you're doing it rather inefficiently. This would be a lot easier. Note that there's no need for floating point math (if your coordinates remain under 32768).
Code:
bool check_collision (int x1, int y1, int x2, int y2, int r1, int r2)
{
    int dx = x2 - x1;
    int dy = y2 - y1;
    int sr = r1 + r2;
    return (dx * dx + dy * dy) < (sr * sr);
}
BUT! You're optimising the wrong thing here...

Sure, there are some small gains to be made this way, but the more important thing is to reduce the amount of checks done in the first place. You said to assume that the collision check always runs, but that's a bad premise, especially if that means you're checking every single object against every other object. That has a big-O of nē, which is bad. For 1000 objects, the amount of checks would be over half a million, which is ridiculous

Here's some a tip for an method to get that number down, assuming a 2D map (though extendable to 3D):
  1. create a collision grid the same size of your map, just coarser, so that each cell in the collision grid is larger than the largest object
  2. keep a reference to each object in the cell on the collision grid
  3. keep track of which objects have moved
  4. do a collision check only on other objects in the same cell on the collision grid and in directly neighbouring cells
Kippesoep is offline                         Send a private message to Kippesoep
Reply With Quote