Вот примерное описание подхода, который я выбрал. Извините, время ограничено, поэтому это может быть неточно.
Первоначально я подошел к проблеме, аналогично ответу @ BigMac66. Я выложил сетку, соответствующую количеству окружностей, которую я имел, нарисовал окружность в каждой, а затем случайным образом сдвинул окружности от центральной точки каждой ячейки сетки.
Я встроил множество «факторов выдумки» - границы радиуса круга, смещение от центра, максимальное перекрытие с соседними ячейками и т. Д. - но, как бы я ни настраивал свои настройки, вы все равно всегда могли сказать, что сетка была за макетом; круги выровнены настолько, что выглядят скорее как шаткий узор в горошек, а не как действительно случайная коллекция кругов.
Итак, я перешел на более грубый подход.
Сначала я установил настраиваемые границы для радиуса круга, изменяя верхнюю границу, пока не нашел максимальный размер, который не заставлял холст выглядеть переполненным, исходя из общего количества кругов, которое у меня было.
Затем я применил свою математику для определения размера кругов по мере необходимости (короче говоря, самые большие круги представляли значение 100%, а самые маленькие представляли значение 0%; остальные размеры были соответственно изменены в зависимости от того, где они попали в спектр. ).
Затем я отсортировал круги по убыванию. Я выложил их случайным образом на холсте, используя алгоритм примерно так:
- Поместите круг в случайные координаты.
- Поместите следующий круг в случайные координаты.
- Если последний круг перекрывает первый более чем на X пикселей (настраиваемый параметр), поместите его в новый набор случайных координат.
- Продолжайте шаг # 3 до Y раз (еще один настраиваемый параметр), пока вы не поместите еще один круг.
- Если вы не можете поместить круг в Y раз, очистите холст, уменьшите максимальный радиус круга на Z пикселей (еще один настраиваемый параметр) и начните сначала.
Это сработало на удивление хорошо, и я настраивал параметры до тех пор, пока я не смог нарисовать весь холст очень быстро, при этом потребовалось несколько максимальных сокращений радиуса круга.
Вы можете увидеть готовый продукт здесь:
http://www.eonline.com/news/2012_sag_awards/heatgauge
Вне сезона, поэтому перейдите на вкладку «Общий вид» в верхней части основного окна, чтобы увидеть совокупную статистику (и, следовательно, полный холст кругов).