Формула для мозаики неправильной формы с заданным количеством квадратов

У меня есть форма, которая определяется как вектор. Затем мне предоставляется число, которое представляет, сколько квадратов одинакового размера мне нужно, чтобы выложить мою фигуру в несколько рядов. Координата X каждого квадрата в строке не должна быть выровнена с координатами других строк. Мне нужно определить требуемый размер квадратов и их размещение по фигуре (X и Y) так, чтобы внутренняя часть фигуры была полностью покрыта, а по периметру большая часть площади каждого квадрата находилась внутри формы .

Кто-нибудь знает какую-нибудь формулу, которую я мог бы использовать для расчета этого? Или я заработаю свою докторскую степень, работая над этим? :-)


person Stephen H    schedule 16.07.2012    source источник
comment
Некоторый код был бы очень хорош здесь. Трудная часть, кажется, заключается в том, что большая часть площади каждого квадрата находится внутри формы. Я буду думать об этом сегодня.   -  person bigbenbt    schedule 16.07.2012
comment
@ www.Flextras.com Было бы сложно дать вам код, это довольно сложная система, но для упрощения давайте исключим мою реализацию рисования формы из уравнения. Другими словами, не имеет значения, как нарисована неправильная форма, важно только то, что ее можно нарисовать, а также предопределенное количество квадратов внутри нее.   -  person Stephen H    schedule 18.07.2012


Ответы (1)


Возможное решение с итеративным процессом:

ПРЕДВАРИТЕЛЬНОЕ ЗАМЕЧАНИЕ: - Я помечаю имена переменных, которые буду использовать позже, символом ‹...>, а в квадратных скобках я отмечаю размерность переменной, если это массив. - В круглых скобках вы найдете проходы итераций с обычно "i" в качестве счетчика итераций.

ДАННЫЙ:

I1) массив [2,n] вершин двумерной фигуры с прямым краем: (1:i:2, 1:j:n), поэтому массив целых чисел размером 2 x n.

I2) максимальное количество используемых элементов сетки для покрытия фигуры: , поэтому скалярное значение

I3) 2D OCS (ортогональная система координат), рассматриваемая в качестве эталона для позиционирования вершин: по умолчанию все вершины предоставляют OCS своими собственными значениями. Назовите это ссылкой, но на самом деле это не переменная.

ВЫХОД:

O1) обеспечил длину стороны квадратной сетки, в лучшем случае покрывающую заданную форму: , поэтому скаляр.

O2) количество сгенерированных строк: , другой скаляр

O3) массив значений X каждой строки (строки) квадратов, представляющий левый нижний угол первого квадратного элемента сетки: с 1:i:R, где R — упомянутый выше результат, поэтому количество сгенерированных строк по алгоритму.

O4) массив целых чисел, содержащий количество элементов сетки в строке: с 1:i:R

ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ:

//рассчитываем коэффициент покрытия

ACF: (средний коэффициент покрытия), вычисление отношения между площадью всей исходной формы и суммой всего массива сгенерированных квадратов (данный список нижних левых углов квадратов добавляет длину стороны).

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

АЛГО:

1) Определите минимальную ограничивающую рамку (первый квадрат, содержащий всю фигуру)

1.1) определяют самую нижнюю точку формы Y в исходной OCS: скаляр, представляющий вертикальное смещение между OCS0 и OCS1.

1.2) определить самую левую точку формы (одну из вершин) в исходной OCS:

1.3) Сдвиг формы с жестким линейным преобразованием T:T(x,y) -> (x-dx, y-dy); теперь ограничительная рамка имеет левый нижний угол в начале новой системы координат (это то, что отображает OCS0 в OCS1)

1.4) сдвинуть всю фигуру в ОСК1;

1.6) рассчитать средний коэффициент покрытия на шаге 0;

ПРИМЕЧАНИЕ: это уже решение, не лучшее, но математически приемлемое решение.

1.7) проверяем, сколько элементов (на данном этапе только один) полностью входят в фигуру, называют ее (на этом первом шаге это ноль), сколько полностью исключено границами фигуры (на этом первом шаге это ноль), и сколько частично перекрываются (на этом первом шаге это 1). Обратите внимание, что во время итераций сумма длин этих трех массивов должна быть равна количеству квадратов, сгенерированных в результате уточнения ограничивающего квадрата.

1.8) удалить из сетки все квадраты, принадлежащие NFULLOUT(0). На нулевом шаге эта процедура не дает никакого результата, так как в массивах решений есть только один частично покрывающий элемент.

2) Цикл по уточнению

2.1) рассчитать коэффициент уточнения по RF = M/(сумма QTY(1:R))

ПРИМЕЧАНИЕ: в пункте 2.1 учитываются все элементы полного покрытия с весом 1 в вычислении площади, а также частичные элементы, более точным способом будет использование функции SCF для каждого отдельного квадрата частичного покрытия для расчета эффективного веса элемента, который будет использоваться для расчет площади сетки.

2.2) рассчитать новую длину стороны квадрата по формуле L(1) = L(0)/RF;

2.3) ЕСЛИ (количество квадратов меньше допустимого количества квадратов), уточнить сетку, перегенерировав матрицу квадратов с новой стороной.

2.3.1) проверить, сколько элементов (на данном этапе только один) полностью входят в форму (на этом первом шаге это ноль), сколько полностью исключено границами формы (на этом первом шаге это ноль ), и сколько частично перекрываются (на этом первом шаге это 1), где «i» представляет шаг итерации для уточнения.

2.3.2) удалить из сетки все квадраты, принадлежащие NFULLOUT(i). На нулевом шаге эта процедура не дает никакого результата, так как в массивах решений есть только один частичный элемент.

2.3.4) рассчитать коэффициент уточнения по RF = M /(сумма QTY(1:R))

2.3.5) рассчитать новую длину стороны квадрата по формуле L(1) = L(0)/RF;

2.3.6), если L(i) > 0, то повторите цикл с 2), иначе сломается.

3) после перерыва разделяй и властвуй на улучшение

3.1) для каждого отдельного ряда сетки попробуйте сдвинуть весь ряд примерно на половину длины стороны вправо и влево, посчитайте эффективность и решите, что лучше. затем вы сдвигаете эту линию на количество, проверенное и проверенное как лучшее, продолжайте снова, выбирая влево и вправо с длиной стороны 1/4 и так далее, пока вы не получите более низкую эффективность, чем на предыдущем шаге.

ПРИМЕЧАНИЕ: этот последний раздел «разделяй и властвуй» применяется только в том случае, если вы взвешиваете каждый отдельный частичный элемент весом от 0 до 1. Если вы считаете частичные покрывающие элементы полностью покрывающими элементами, это не дает вам никаких улучшений.

ПОСЛЕДНЕЕ ПРИМЕЧАНИЕ: учтите, что вы можете применить коэффициент масштабирования к RF, например, при первом проходе коэффициент масштабирования даст вам RF = M, что, возможно, немедленно выведет вас из ограничений. Всякий раз, когда вы получаете RF> 2, вы можете применить коэффициент 0,8 к RF, если ваше обычное количество элементов находится в диапазоне 100-1000 элементов или даже больше.

ПОСЛЕДНЕЕ ПРИМЕЧАНИЕ 2: если бы вы могли убрать ограничение, согласно которому все квадраты должны иметь одинаковую длину, это стало бы намного проще и, прежде всего, намного быстрее, поскольку вы уточняете только приближение к границам.

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

person Pinoba    schedule 16.07.2012
comment
Это явно хорошо проработанный и продуманный ответ, но очень сложно понять жаргон и эзотерическую нотацию. Не могли бы вы объяснить (среди прочего), что такое OCS и какие обозначения (1:i:2), T:T(x,y) -> T(x-dx, y-dy), QTY(1:R ) и т.д. имеется в виду? - person Shaul Behr; 17.07.2012
comment
извините, вы совершенно правы .. я знаю, что должен был использовать стандартную нотацию, но я слишком далеко от школы. 1:x:R означает (в какой-то нотации Matlab), что x выполняет итерацию между 1 и R (это константа или известная переменная во время выполнения). OCS означает ортогональную систему координат. T — это стандартная математическая запись функции двух переменных, которая отображает точку (x, y) в новую точку с координатами (x-dx, y-dy). - person Pinoba; 17.07.2012
comment
@Stephen H Я немного подсчитал, чтобы лучше изменить выражение, в котором обычное количество элементов находится в диапазоне от 100 до 1000 элементов или даже больше. На самом деле хорошим улучшением выбора начальной длины и сокращения нескольких первых итераций является вычисление минимального радиуса MINR сплайна, проходящего через вершины формы, и начало с длины стороны MINR/2,5 или MINR/3. - person Pinoba; 17.07.2012