Yeah, I suspected that the only way to do it properly is line collision and that would be a bit slow so I'll not bother I think. As for the amount of check you're doing, you might want to put in place an optimisation which I use which uses up a chunk of memory (depending on the size of your gameworld which is active at any time) but which'll HUGELY cut down the number of checks you're doing.
Try creating an array (or bank, like I did) which basically represents the world as a load of X unit by X unit bins. Then every frame you dump the ids of each particle into the appropriate bin and then you go through the particles as usual but you only check for overlaps with particles either in that bin and the neighbouring 8 bins (ie, up-left, up, up-right, left, right, down-left, down and down-right). When you're dealing with large amounts of objects you'll find that you can get a huge performance gain.
Try creating an array (or bank, like I did) which basically represents the world as a load of X unit by X unit bins. Then every frame you dump the ids of each particle into the appropriate bin and then you go through the particles as usual but you only check for overlaps with particles either in that bin and the neighbouring 8 bins (ie, up-left, up, up-right, left, right, down-left, down and down-right). When you're dealing with large amounts of objects you'll find that you can get a huge performance gain.