enemyHeading -= absoluteBearing in the test() method breaks things because many waves are evaluated each tick, but even after fixing that I'm seeing very different values for
Point2D.distance(sourceX, sourceY, enemyX, enemyY) and
enemyDistance, which is where I suspect the errors are creeping in. Of course, I can't see anything wrong with what you are doing :-/ Maybe a step-by-step printing/debugging with only one wave in the air would let you see how
enemyDistance is deviating from the old value on a per-tick basis?