Я вижу, что вы делаете вычисления с постоянным шагом по времени T. При моделировании столкновений, хотя на каждом шаге , вы должны использовать шаг по времени, равный минимальному времени, прежде чем любой из атомов достигнет какого-либо препятствия.
Сделайте шаг по времени переменным, и атомы никогда не будут "туннелировать" препятствия.
P.S. Существует множество оптимизаций в обнаружении столкновений, пожалуйста, прочитайте статьи Gamedev для получения информации о них.
P.S. Ошибка?
force = new Vector2(-(_min.X - atom.Position.X), 0);
Сила создается отдельно для X и Y отражения. Что происходит, когда атом попадает в угол? Будет применена только вторая сила.
P.P.S: использовать эпсилон
Еще одно важное замечание: если вы используете с плавающей запятой, ошибка накапливается, и вы должны использовать eps:
abs(atom.Position.Y + atom.Radium - _max.Y) < eps
где eps - это число, намного меньшее, чем обычные размеры в вашей задаче, например 0,000001.