За последние 24 часа нас посетили 52522 программиста и 1763 робота. Сейчас ищут 1066 программистов ...

Рассчет отступов изображений при их перекрытии

Тема в разделе "PHP для профи", создана пользователем NitroGenerate, 16 фев 2017.

  1. NitroGenerate

    NitroGenerate Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    9
    Симпатии:
    0
    Всем привет. Крутится у меня в голове интересная задачка(во всяком случае мне так кажется), которую пока не решил. Эта нерешенная задача побудила написать пост помощи. =)
    Итак: У нас есть холст: 100x100, черного цвета
    На нем хаотично, в центре разбросаны прямоугольники разного размера, прямоугольники не повернуты(каждая сторона прямоугольника параллельна стороне холста). Все они полностью или частично соприкасаются ребрами друг с другом.

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

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

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

    Как бы вы решили эту задачу?
     

    Вложения:

    • 351181681a.jpg
      351181681a.jpg
      Размер файла:
      229,8 КБ
      Просмотров:
      10
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    пропорционально увеличить, а отступ добавить внутри :D
     
  3. NitroGenerate

    NitroGenerate Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    9
    Симпатии:
    0
    Ок, увеличиваем холст и прямоугольники на 10%(к примеру), уменьшаем прямоугольники, обратно и дифф заполняем цветом.
    Это приведет к тому, что отступ между блоками будет напрямую зависеть от их размера.
    Представим 2 прямоугольника у которых координата по оси Х = 50, длина первого = 10, длина второго 40.
    Добавим отступ 20%: увеличиваем на 20% = длина первого 12, длина второго 48, дальше можно не продолжать. =)
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в HTML не приводит, и тебе не нужно :D
    если уменьшать размер будешь не на проценты, а тупо отрисуешь на 4 пикселя от границы внутрь - оно так на 4 пикселя у всех и закрасится.
    чего тебе делать - дело твоё, это само собой. Я твою задачу решил. В моём решении ширина границы у всех одинаковая, пропорции площадей сохраняются, пропорции длин и ширшин - тоже. Победа.
     
  5. NitroGenerate

    NitroGenerate Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    9
    Симпатии:
    0
    Если было бы все так просто. =)
    В блоках могут быть изображения, нам нельзя жертвовать ими, подрезая или увеличивая. На выходе мы должны получить блоки с точно таким же содержанием как и на входе, но с добавленными отступами.
    Если пропорционально увеличивать сами блоки ? При их пропорциональном увеличении, как и писал ранее, разные грани будут по разному увеличиваться, затем
    - внутрь мы добавляем одинаковый отступ, в результате будет нарушена целостность содержания блока, т.к. блоки изначально увеличены в разных соотношениях.
    - уменьшить блоки до исходного кода и диф залить, отступы будут неровные.
    Если увеличивать сами блоки попиксельно, то мы придем к моему решению в первом посте.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    задача увеличения блоков эквивалентна задаче уменьшения изображений. Это задача масштабирования.

    Не надо увеличивать блоки в разных соотношениях.


    Доктор, когда я вот так вот делаю, то мне вот тут вот больно. - Не делайте так.

    Ты каждую картинку пропорционально уменьшаешь, оставляя её центр в центре. Всё. Это же просто. Больше ничего делать не надо. Каждый блок нужно уменьшить к его центру, и тогда всё что останется вокруг - это его толстая граница.

    Я всё. Удачи.
     
  7. Poznakomlus

    Poznakomlus Активный пользователь

    С нами с:
    12 сен 2014
    Сообщения:
    96
    Симпатии:
    19
    Адрес:
    Киев
    Каким боком при добавлении отступа объекты будут соприкасаться, ведь между ними отступ
    1. Получаем координаты прямоугольников
    2. Изменяем координаты прямоугольников с применением отступов
    3. Затираем старые и рисуем новые