Всем привет. Крутится у меня в голове интересная задачка(во всяком случае мне так кажется), которую пока не решил. Эта нерешенная задача побудила написать пост помощи. =) Итак: У нас есть холст: 100x100, черного цвета На нем хаотично, в центре разбросаны прямоугольники разного размера, прямоугольники не повернуты(каждая сторона прямоугольника параллельна стороне холста). Все они полностью или частично соприкасаются ребрами друг с другом. Задача: к каждому прямоугольнику добавить отступ, 5 например, белого цвета. Но, так как все объекты, соприкасаются, после добавления отступа, этот отступ окажется на них самих, по этому, все перекрывающиеся объекты нужно раздвинуть. Каждый объект должен соприкасаться, но не перекрываться. Вопрос: как раздвинуть объекты, не меняя кардинально их изначальную позицию по отношению к соседнему. Для наглядности прикрепил изображение. P.S. объекты не обязательно могут располагаться в ряд, и их не обязательно будет именно 3 Как я думаю решать задачу: Пробегаемся по объектам, сравнивая их друг с другом, и ищем пересечение точек с другими объектами. При найденом пересечении, узнаем - на какой грани пересечение(что бы знать по какой оси сдвигать объект) - какой объект дальше удален от центра Сдвигаем по нужной оси к краю холста дальний объект. Что мне не нравится: - Много кода, хотя на первый взгляд, простая задача. - Если объектов будет 20 (что маловероятно), то цикл сравнивания и сдвига объектов будет иметь очень много итераций. - Ну и в целом такая идея просчета настораживает. Как бы вы решили эту задачу?
Ок, увеличиваем холст и прямоугольники на 10%(к примеру), уменьшаем прямоугольники, обратно и дифф заполняем цветом. Это приведет к тому, что отступ между блоками будет напрямую зависеть от их размера. Представим 2 прямоугольника у которых координата по оси Х = 50, длина первого = 10, длина второго 40. Добавим отступ 20%: увеличиваем на 20% = длина первого 12, длина второго 48, дальше можно не продолжать. =)
в HTML не приводит, и тебе не нужно если уменьшать размер будешь не на проценты, а тупо отрисуешь на 4 пикселя от границы внутрь - оно так на 4 пикселя у всех и закрасится. чего тебе делать - дело твоё, это само собой. Я твою задачу решил. В моём решении ширина границы у всех одинаковая, пропорции площадей сохраняются, пропорции длин и ширшин - тоже. Победа.
Если было бы все так просто. =) В блоках могут быть изображения, нам нельзя жертвовать ими, подрезая или увеличивая. На выходе мы должны получить блоки с точно таким же содержанием как и на входе, но с добавленными отступами. Если пропорционально увеличивать сами блоки ? При их пропорциональном увеличении, как и писал ранее, разные грани будут по разному увеличиваться, затем - внутрь мы добавляем одинаковый отступ, в результате будет нарушена целостность содержания блока, т.к. блоки изначально увеличены в разных соотношениях. - уменьшить блоки до исходного кода и диф залить, отступы будут неровные. Если увеличивать сами блоки попиксельно, то мы придем к моему решению в первом посте.
задача увеличения блоков эквивалентна задаче уменьшения изображений. Это задача масштабирования. Не надо увеличивать блоки в разных соотношениях. Доктор, когда я вот так вот делаю, то мне вот тут вот больно. - Не делайте так. Ты каждую картинку пропорционально уменьшаешь, оставляя её центр в центре. Всё. Это же просто. Больше ничего делать не надо. Каждый блок нужно уменьшить к его центру, и тогда всё что останется вокруг - это его толстая граница. Я всё. Удачи.
Каким боком при добавлении отступа объекты будут соприкасаться, ведь между ними отступ 1. Получаем координаты прямоугольников 2. Изменяем координаты прямоугольников с применением отступов 3. Затираем старые и рисуем новые