【问题标题】:Handling selection of shapes on a board处理板上形状的选择
【发布时间】:2009-02-22 00:26:40
【问题描述】:

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

“圆将在一个矩形内”

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

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

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

看起来效率不高但是有没有其他方法?

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

【问题讨论】:

    标签: algorithm events graphics shapes


    【解决方案1】:

    您正在尽可能地处理它 - 窗口系统通常遵循 Z 顺序(层)。

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

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

    Algorithm to detect intersection of two rectangles?

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

    -亚当

    【讨论】:

      【解决方案2】:

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

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

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

      -- 马库斯Q

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        • 2020-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多