2009-02-22 11 views
2

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

«Круг будет находиться внутри прямоугольника»

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

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

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

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

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

ответ

1

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

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

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

Algorithm to detect intersection of two rectangles?

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

-Adam

0

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

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

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

- MarkusQ