Как сгенерировать окружности на сфере, что бы они оптимально перекрывали друг-друга?
Детерминированный алгоритм построения оптимального разбиения, скорее всего, существует лишь когда центры окружностей лежат в вершинах правильных многогранников, то есть тетраэдра, куба, октаэдра и т.д. Но это условие соблюдается только при определённом соотношении между радиусами сферы и окружностей. 
Можно попробовать разбивать на сфере правильные многогранники и подбирать оптимальный многогранник / уровень разбиения под каждый вариант радиуса. Код для построения подобного можно глянуть хоть в том же Three.js.
Ещё можно погуглить "Periodic Centroidal Voronoi Tessellation", этот метод часто используется для схожих задач. В частности, для построения сетки для численного моделирования физических процессов на произвольных поверхностях или в объёме.
Детерминированный алгоритм построения оптимального разбиения, скорее всего, существует лишь когда центры окружностей лежат в вершинах правильных многогранников, то есть тетраэдра, куба, октаэдра и т.д. Но это условие соблюдается только при определённом соотношении между радиусами сферы и окружностей. 
Можно попробовать разбивать на сфере правильные многогранники и подбирать оптимальный многогранник / уровень разбиения под каждый вариант радиуса. Код для построения подобного можно глянуть хоть в том же Three.js.
Ещё можно погуглить "Periodic Centroidal Voronoi Tessellation", этот метод часто используется для схожих задач. В частности, для построения сетки для численного моделирования физических процессов на произвольных поверхностях или в объёме.