在位图中定义区域(java)

时间:2013-07-15 15:37:49

标签: java bitmap

我在JAVA中有一个图形应用程序,它由许多不同的形状(线条,圆形,弧形等组成,通过Graphics.drawLine(),drawArc()...方法绘制)。我想在许多(如果不是全部)绘制的对象上创建鼠标悬停事件。

我的想法是在其中存储某种带有元数据的位图,并使用它来确定鼠标所在的对象。有没有办法在Java中这样做? (循环遍历每个鼠标移动的所有对象似乎不可行)。

谢谢,

约翰

2 个答案:

答案 0 :(得分:1)

这取决于您的规格。你没有提到这些形状是否允许重叠,移动,有多少可以存在等等。

解决方案a)最简单的方法是将每个形状实现为JComponent描述(例如JPanel)。所以你会有一个CirclePanel,一个扩展JPanel的ArcPanel等,每一个都以与现在相同的方式进行自我绘制。

将形状作为JComponent,您可以向每个面板添加MouseListener,然后处理mouseEntered()mouseExited()事件。

解决方案b)另一方面,如果您需要在单个组件的区域上绘制所有形状(我现在理解的情况),那么您仍然不需要迭代所有形状形状。您只需要引入一种算法,根据它们的位置对形状进行分类,以便能够在“isMouseOver(Shape s)”测试程序中快速排除它们。

例如,假设您将区域划分为左右两个相等的子区域(让我们称之为区块)。创建每个形状时,您可以测试它们与哪个图块相交,并将此信息存储在形状和相应图块中。

现在,当您需要测试鼠标是否在形状上时,您可以决定鼠标在哪个图块上。这样,您只需检查与左侧或右侧平铺相交的形状。假设你的形状在屏幕上均匀分布,你只需要通过一次测试就拒绝了50%的形状。

根据您拥有的形状数量,您可以使用4或8个图块,或者您甚至可以动态创建/删除图块(例如,根据屏幕的一个区域中是否有多少对象聚集在一起)。

我建议尝试第一种解决方案,因为它更简单,更清洁。如果您认为它不符合您的需求,那么您可以采用与第二种类似的方法。

答案 1 :(得分:1)

键颜色解决方案

(从评论中移出)

  • 创建一个离屏图形缓冲区(如BufferedImage),大小与主题图像相同。
  • 将所有对象绘制到此缓冲区中。每个对象都有一个自己的颜色。根据对象数量,您可以优化图像缓冲区:例如,使用8位图形。
  • 逐个像素地读取结果图像(例如Java - get pixel array from image)。确定当前鼠标位置的像素颜色,并将颜色索引(或RGB值)映射到源对象。

优点:

  • 解决方案是“像素精确”:对象边界是精确的 - 像素到像素。
  • 轻松解决重叠对象问题。只需按照所需的顺序绘制它们。
  • 对象复杂性不受限制。理论上也可以使用位图。

缺点:

  • 要移动一个对象,必须重新绘制完整的屏幕外缓冲区
  • 使用低位图像缓冲区时可以限制对象数