[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Расчет отступов изображений при их перекрытии
NitroGenerate
Всем привет, решил опубликовать и на этом форуме.
Крутится у меня в голове интересная задачка(во всяком случае мне так кажется), которую пока не решил. Эта нерешенная задача побудила написать пост помощи. =)
Итак: У нас есть холст: 100x100, черного цвета
На нем хаотично, в центре разбросаны прямоугольники разного размера, прямоугольники не повернуты(каждая сторона прямоугольника параллельна стороне холста). Все они полностью или частично соприкасаются ребрами друг с другом.

Задача: к каждому прямоугольнику добавить отступ, 5 например, белого цвета. Но, так как все объекты, соприкасаются, после добавления отступа, этот отступ окажется на них самих, по этому, все перекрывающиеся объекты нужно раздвинуть. Каждый объект должен соприкасаться, но не перекрываться.
Вопрос: как раздвинуть объекты, не меняя кардинально их изначальную позицию по отношению к соседнему.

Для наглядности добавил изображение.
user posted image
P.S. объекты не обязательно могут располагаться в ряд, и их не обязательно будет именно 3

Как я думаю решать задачу:
Пробегаемся по объектам, сравнивая их друг с другом, и ищем пересечение точек с другими объектами.
При найденом пересечении, узнаем
- на какой грани пересечение(что бы знать по какой оси сдвигать объект)
- какой объект дальше удален от центра
Сдвигаем по нужной оси к краю холста дальний объект.
Что мне не нравится:
- Много кода, хотя на первый взгляд, простая задача.
- Если объектов будет 20 (что маловероятно), то цикл сравнивания и сдвига объектов будет иметь очень много итераций.
- Ну и в целом такая идея просчета настораживает.

Как бы вы решили эту задачу?
sergeiss
Для того, чтобы сделать перерасчет, надо точно знать начальные требования. В частности, что от чего зависит. И как эти прямоугольники располагаются. Например, могут ли они быть не справа-слева, а друг под другом. Может ли какой-то прямоугольник перекрывать другой целиком (по ширине) и при этом захватывать другие.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
NitroGenerate
Прямоугольники:
- это всегда будут только прямоугольники
- они всегда располагаются в центре
- их размер произвольный, они могут быть и друг над другом, и 4 в ряд и 6 по вертикали
- они всегда какой-то стороной соприкасаются с соседом(если он есть)
- их кол-во произвольное
- они не могут перекрывать собой друг друга, и находиться друг в друге.
- нельзя изменять их содержимое. (представим, что в каждом блоке находится рисунок, который не должен пострадать(растянуться, сузиться, пожертвовать содержимым во благо внутреннего отступа))
- размер холста всегда больше размера прямоугольников
Kusss
А известны координаты прямоугольников ?

По моему задача не сложная:
1) Сначала все двигаем в право
а) 1 объект остается на месте
б) вычисляем есть ли соприкосновение с права
1. пересечение массива 25-65(А) со всем что имеет отступ 30 (Получается В ( 30-75)
2. Пересечение найдено - двигаем в право (номер объекта*отступ*2)

2) По вертикале. Все тоже самое что в 1 пункте.
NitroGenerate
Хорошая идея. Спасибо! Может быть есть еще варианты ? =)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.