Сколько квадратов можно упаковать в круг? - PullRequest
6 голосов
/ 02 марта 2012

Сколько квадратов размером a × a может быть упаковано в круг радиусом R ?

Мне не нужно решение.Мне просто нужна какая-то стартовая идея.

Ответы [ 4 ]

5 голосов
/ 04 марта 2012

Прошу прощения за написание такого длинного ответа. Мой подход заключается в том, чтобы начать с теоретического максимума и гарантированного минимума. Когда вы подходите к проблеме, вы можете использовать эти значения, чтобы определить, насколько хорош любой алгоритм, который вы используете. Если вы можете придумать лучший минимум, вы можете использовать его вместо этого.

Мы можем определить верхний предел для задачи, просто используя площадь круга

Upper Limit = floor( (PI * (r pow 2)) / (L * L) )

Где L - ширина или высота квадратов, которые вы упаковываете, а r - радиус круга, в который вы упаковываете квадраты. Мы уверены, что это верхний предел, потому что а) у нас должно быть дискретное количество блоков и б) мы не можем занимать больше места, чем площадь круга. (Формальное доказательство сработало бы где-нибудь по линии предположения, что у нас было еще одно поле, чем это, тогда сумма площади полей была бы больше, чем площадь круга).

Итак, имея верхний предел, мы можем теперь взять любое решение, которое существует для всех окружностей, и назвать его минимальным решением.

Итак, давайте рассмотрим решение, которое существует для всех кругов, посмотрев на самый большой квадрат, который мы можем вписать в круг.

Наибольший квадрат, который вы можете разместить внутри круга, имеет 4 точки по периметру, имеет ширину и длину sqrt(2) * radius (используя теорему Пифагора и используя радиус для длины более коротких ребер)

Итак, первое, что мы отмечаем, это то, что если sqrt(2) * radius меньше размера ваших квадратов, то вы не можете поместить ни один квадрат в круг, потому что, в конце концов, это самый большой квадрат, который вы можете разместить.

Теперь мы можем сделать простое вычисление, чтобы разделить этот большой квадрат на правильную сетку квадратов, используя указанную вами букву L, что даст нам по крайней мере одно решение проблемы. Таким образом, у вас есть сетка квадратов внутри этого максимального квадрата. Число квадратов, которые вы можете поместить в один ряд этой сетки, равно

floor((sqrt(2) * radius)/ L)

И поэтому это минимальное решение утверждает, что вы можете иметь по крайней мере

Lower Limit = floor((sqrt(2) * radius)/ L) pow 2

количество квадратов внутри круга.

Так что в случае, если вы заблудились, все, что я сделал, это взял самый большой квадрат, который я мог вписать в круг, а затем упаковал как можно больше квадратов в обычную сетку внутри, чтобы дать мне хотя бы одно решение.

Если для этого этапа вы получите ответ 0, то вы не сможете поместить квадраты внутри круга.

Теперь, вооружившись теоретическим максимумом и абсолютным минимумом, вы можете начать использовать любой эвристический алгоритм для упаковки квадратов. Простой алгоритм состоит в том, чтобы просто разбить круг на строки и разместить в каждой строке столько квадратов, сколько вы можете. Затем вы можете принять этот минимум в качестве ориентира, чтобы убедиться, что вы нашли лучшее решение. Если вы хотите потратить больше вычислительной мощности в поисках лучшего решения, используйте теоретическое руководство в качестве ориентира для определения того, насколько вы близки к теоретическому наилучшему.

И если вы заботитесь об этом, вы можете решить, какой максимальный и минимальный теоретический процент покрытия минимальный алгоритм, который я определил, дает вам. Самый большой квадрат всегда покрывает фиксированное соотношение (я думаю, что это число равно pi / 4 или около 78,5% от внутренней площади круга). Таким образом, максимальный теоретический минимум составляет 78,5% покрытия. А минимальный нетривиальный (т. Е. Ненулевой) теоретический минимум - это когда вы можете разместить только 1 квадрат внутри самого большого квадрата, что происходит, когда вы упаковываете квадраты, которые на 1 больше половины ширины и высоты самого большого квадрата, который вы можете вписаться в круг. В основном вы занимаете чуть более 25% внутреннего квадрата с 1 упакованным квадратом, что означает, что вы получаете приблизительное покрытие около 20%

0 голосов
/ 02 марта 2012

Просто выстрел в темноте после нескольких минут размышлений ...

Что делать, если вы работали с половиной круга и удвоили его в конце.Я бы начал с сетки квадратов длины диаметра и ширины радиуса, по существу охватывающих полукруг.Затем проверьте все 4 угла каждого квадрата и убедитесь, что их координаты находятся в радиусе круга.Это, конечно, потребовало бы, чтобы вы нарисовали окружность и квадраты в какой-то системе координат или сетке.

Надеюсь, это имеет смысл ... Это у меня в голове и кажется немного сложным сформулировать:)

РЕДАКТИРОВАТЬ: После рисования, я думаю, этот метод будет работать с небольшой настройкой.Я бы выстроил квадраты по диаметру, но сдвинул первый вниз, чтобы он подходил.Установите его на место и начинайте выравнивать квадраты рядом с ним, пока они больше не будут соответствовать.Перейдите к краю этой линии квадратов и повторяйте те же шаги, пока ряды квадратов не достигнут радиуса.

0 голосов
/ 02 марта 2012

Растрируйте окружность, используя что-то вроде алгоритма окружности средней точки . Количество заполненных пикселей - это количество квадратов, которые вы можете поместить в круг. Конечно, поскольку вы фактически не заполняете пиксели, а просто подсчитываете их, это должно занять время, пропорциональное окружности круга, а не его площади.

Вам нужно будет тщательно выбирать радиус для растеризации, чтобы считать только пиксели, которые находятся строго внутри круга.

Редактировать: Это может быть не совсем правильно, так как возможно, что применение смещения на субпиксель к сетке может изменить результат. Я оставлю здесь ответ, поскольку он может послужить полезной отправной точкой для точного решения.

0 голосов
/ 02 марта 2012

Вы можете упаковать в круг столько квадратов, сколько захотите. Если вы сомневаетесь в этом утверждении, нарисуйте большой круг на листе бумаги, затем нарисуйте квадрат с длиной стороны 10 ^ (- 18) м внутри, повторите. Когда вы приблизитесь к границе круга, начните рисовать квадраты с длиной стороны 10 ^ (- 21) м.

Итак, ваш первый шаг должен состоять в уточнении вашего вопроса и более точном изложении вашей проблемы.

...