Обработка выбора фигур на доске - PullRequest
2 голосов
/ 22 февраля 2009

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

"Круг будет внутри прямоугольника"

Я положил два круга A, B на доску, где A находится над B и имеет некоторую площадь столкновения. Если я нажму на область A, соответствующую области контейнера, но не на фактическую область формы A, я не выберу круг A, однако это помешает мне выбрать B, поскольку мой контейнер A перекрывается и превышает B один.

В базовом фреймворке событий дочернее событие будет отправлено родителю, а не братьям и сестрам.

Поэтому я выбрал проверку всех контейнеров фигур, имеющих некоторую площадь в точке x, упорядоченную по z-индексу. Затем для каждого контейнера проверьте, не сталкивается ли фигура внутри него.

Это не кажется супер эффективным, но есть ли другие способы?

---------
|    --------  
|    |      |
-----|      |
     --------

Ответы [ 2 ]

1 голос
/ 22 февраля 2009

Вы справляетесь с этим так же хорошо, как и с ним - оконные системы обычно подчиняются Z-порядку (слоям).

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

Существуют алгоритмы для определения того, перекрываются ли прямоугольники, путем преобразования их в 2d представления на осях x и y. Вы можете сделать то же самое, а затем сравнить свою точку, чтобы увидеть, какие объекты перекрываются вашей точкой:

Алгоритм обнаружения пересечения двух прямоугольников?

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

-Adam

0 голосов
/ 25 февраля 2009

Есть трюки, которые вы можете сыграть, если вам действительно нужна скорость. Например:

  • Если вы работаете с глубоким поддоном, вы можете использовать младшие биты цвета, чтобы пометить объекты. Затем, посмотрев на пиксель, вы получите объект или, по крайней мере, быстро решите отбросить список.
  • Даже на небольшой битовой глубине, если объекты все монохромные, вы можете использовать весь цвет
  • Если у вас достаточно низкое разрешение, вы можете сохранить массив, в котором указано, какому объекту принадлежит какой пиксель.
  • При более высоком разрешении вы можете сделать то же самое, но используйте RLE, чтобы уменьшить размер (также посмотрите на четырехугольные деревья)
  • И так далее ...

Если вам нужна простая реализация, один быстрый трюк - записать X & Y, перекрасить экран и заметить, какой объект закрашивает этот пиксель.

- MarkusQ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...