There are other folks probably more experienced with this than me, but I will offer a couple ideas and hope that they aren’t too impractical. (It is either that or go back to doing my last-minute tax returns.)
(1) If, when you get the collision indication you know the velocity, you could try a binary successive approximation: try half the move–collided or not? try 1/4 move or 3/4 move depending upon the first answer, etc. Continue until the fraction is equal to a move of one pixel.
(2) If, when you get a collision indication, you could go back to the previous point and do a successive sweep, 1 pixel velocity at a time, until you hit. (Also possible to do a backwards moving sweep test, I would think.)
(3) Whether there is a geometrical solution, that would depend on the shapes, I would guess. It would be cool if there was a way to return the intersection of the two shapes and calculate the width at the angle of the impact. I don’t know if there is such a thing, though, or if this would be any less computationally intensive than just doing one of the above series of collision tests.
(4) I’m trying to recall what I did for the simple case of bouncing off of a wall…drawing a blank. Maybe it was a matter of taking the destination and placing the object on the symmetric point on the correct side of the wall. Seems like there might be a geometric calculation available from that to find the point of collision, but the odd shapes you have make it trickier.
(5) Ah, found a start of an old game of mine with falling objects of various shapes. I just had the object stop/lose it’s momentum at the position before overlap. It would settle down (using gravity) from there. Looks a little funky though. It will be interesting to see if anyone else has a better solution.
The sweep or “binary search” might not be so bad, though. If the speed is only a few pixels per frame, that’s only a couple extra collision tests on the occasion of an overlap state arising.