@Lepidozavr

Как реализовать графические (мб логические) объекты, вложенные друг в друга, (окна в окнах (как матрешки))? Python? C++? ??

Как должно работать.
Функционал представляю таким: на двумерной плоскости можно создавать границы (оградки, пузыри - отделяя/ограждая нужную площадь плоскости). Причём ограждённая площадь уже может содержать в себе другие "секторы" (площади) - как матрешки, только в одной может сидеть сразу несколько.
Каждую площадь можно приближать (колесом мыши, например), и создавать там ещё отдельные структуры/пузыри/площади.
"Пузыри" не могут переходить границы друг друга.

Зачем?
Идея сортировки данных/записей/заметок. Возможно альтернатива рабочего стола/вложенных друг в друга папок.

Умею в базовые навыки Python, получается разбираться в библиотеках, ООП, но даже не понимаю в какую сторону гуглить. Пусть это будет реализовываться на другом языке, но хоть подскажите в какую сторону гуглить. Если подобное уже реализовано и можно поковырять этот код, буду рад подсказкам.

Это у меня в качестве хобби. Спасибо.
  • Вопрос задан
  • 196 просмотров
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
ООП. Объект - рамка. Должен содержать в себе список всех дочерних рамок (но не внуков - только тех, которые прямо в верхней содержатся, но не в чем другом).

При рисовании новой рамки рекурсивно спускайтесь по этому дереву объектов, пока не получите тот элемент, в котором новая рамка целиком содержится.

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

Если видите, что все дети текущего объекта не пересекаются с рамкой, то вы нашли рамку - родителя вашего нового объекта. Добавьте новую рамку к детям этого объекта. Теперь пройдитесь по всем детям и, если они целиком внутри новой рамки - перенесите их в детей этого нового объекта.

Как делать прорисовку? Опять же рекурсивный проход по дереву отсекает все элементы, которые не пересекаются с видимой областью. Те, которые пересекаются - сохраняются в какой-то список на прорисовку.

Это если рамок не слишком много, скажем до 1000. В противном случае придется повозиться и городить всякие BSP-tree, kd-tree для быстрого поиска объектов, но вам это, похоже не надо. Это будет слишком сложно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы