2

我有一块板作为画布,上面绘制了几个形状,其中一些是三角形、圆形、矩形,但都包含在它们自己的边界分隔矩形内。

“圆圈将在一个矩形内”

我将两个圆圈 A、B 放在 A 位于 B 上方并且有一些区域发生碰撞的棋盘上。如果我单击与容器框相对应的 A 区域,但不是实际的 A 圆形区域,我不会选择 A 圆圈,但是这会阻止我选择 B,因为我的 A 容器重叠并且在 B 之上。

在事件基础框架中,我猜子事件将去父而不是兄弟。

所以我的选择是检查所有形状容器,这些容器在点 x 处有一些区域,按 z 索引排序。然后为每个容器检查其内部的形状是否发生碰撞。

它似乎不是超级有效,但还有其他方法吗?

---------
|    --------  
|    |      |
-----|      |
     --------
4

2 回答 2

1

您正在处理它,并且可以处理它 - 窗口系统通常遵循 Z 顺序(层)。

无论如何,从长远来看,这会更好,特别是如果您希望能够通过在它们周围绘制一个选择框来选择多个项目。

有一些算法可以通过将矩形转换为 x 和 y 轴上的 2d 表示来查找矩形是否重叠。您可以做同样的事情,然后比较您的点以查看您的点与哪些对象重叠:

检测两个矩形相交的算法?

只需将您的点选择(或矩形选择,如果您绘制一个边界框以选择多个项目)作为另一个要比较的矩形与其他矩形重叠。

-亚当

于 2009-02-22T00:29:48.940 回答
0

如果您真的需要速度,可以玩一些技巧。例如:

  • 如果您使用的是深托盘,则可以使用颜色的低位来标记对象。然后偷看像素会为您提供对象,或者至少以免您快速大幅剔除列表。
  • 即使在低位深度下,如果对象都是单色的,您也可以使用整个颜色
  • 如果您的分辨率足够低,您可以保留一个数组,说明哪个对象拥有哪个像素。
  • 在更高的分辨率下,您可以做同样的事情,但使用 RLE 来减小尺寸(也可以查看四叉树)
  • 等等……

如果它只是您所追求的简单实现,一个快速技巧是记录 X 和 Y,重新绘制屏幕,​​并注意哪个对象绘制了该像素。

——马库斯

于 2009-02-25T18:09:23.220 回答