处理板上形状的选择

时间:2009-02-22 00:26:40

标签: algorithm events graphics shapes

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

“圆圈将位于矩形内”

我在A超过B并且有一些区域碰撞的板上放了两个圆圈A,B。 如果我点击对应于容器盒的A区域而不是实际的A圆形区域,我不会选择A圈,但是这会阻止我选择B,因为我的A容器重叠并且超过了B。

在事件基础框架中,子事件将发送给父母,而不是兄弟姐妹。

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

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

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

2 个答案:

答案 0 :(得分:1)

你正在处理它以及它可以处理 - 窗口系统通常服从Z顺序(层)。

从长远来看,这样会更好,特别是如果你想通过在它们周围画一个选择框来选择多个项目。

有一些算法可以通过将矩形转换为x轴和y轴上的2d表示来查找矩形是否重叠。您可以执行相同的操作,然后比较您的观点以查看您的点重叠的对象:

Algorithm to detect intersection of two rectangles?

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

- 亚当

答案 1 :(得分:0)

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

  • 如果您正在使用深托盘,则可以使用颜色的低位来标记对象。然后偷看像素会给你一个对象,或者至少可以快速彻底剔除列表。
  • 即使在低位深度,如果对象都是单色,也可以使用整个颜色
  • 如果你的分辨率足够低,你可以保留一个数组,说明哪个对象拥有什么像素。
  • 在更高的分辨率下你可以做同样的事情但是使用RLE来保持尺寸不变(也看四边形树)
  • 等等......

如果只是简单的实现,那么一个快速的技巧就是记录X& Y,重新绘制屏幕,​​并记下哪个对象绘制了该像素。

- MarkusQ