Учитывая, что в вашем варианте решения синие и жёлтые круги будут составлять не что иное, как сетку - можно попробовать наложить на многоугольник сетку с шагом равным диаметру окружности, затем заполнить все целые квадраты (которые целиком лежат в пределах окружности), а затем нарисовать круги на пересечении линий сетки, которое лежит в зоне многоугольника и не было покрыто. После всего этого может остаться ещё непокрытая зона в виде узких полос, на территории которых нет ни центров ячеек сетки, ни точки пересечений линий. Их, видимо, прийдётся обойти по порядку - сначала покрыть целиком ячейки, часть которых лежит на таких линиях, затем, если остались свободные непокрытые места - на пересечениях вокруг этих самых заполненных ячеек.
По сути, изначально, для пущей эффективности, нужно было наложить две сетки - вторую со смещением x+=50%, y+=50% от ширины ячейки. Тогда заполнять только ячейки не обращая внимания на пересечения (они будут центрами ячеек в другой плоскости).
Я думаю, как-то так. Наверняка можно оптимизировать ещё, чтобы в конце (там где линии) не перебирать круги вокруг ячеек вслепую, а рисовать только там, где часть их точно покроет зону.
Ещё, этот алгоритм удобнее и оптимальнее в плане работы с ним, но для покрытия наименьшим кол-вом станций, возможно нужно будет рисовать сетки так, чтоб одно из направлений линий составляющих её было параллельно самой длинной прямой стороне многоугольника. Но не факт, тут надо экспериментировать.