在地图/图像导航中绘制访问区域

时间:2015-12-04 11:05:12

标签: java algorithm graphics swt paint

我在Java中使用Eclipse RCP和SWT。 我正在为大型多重医疗图像实施图像查看器。这些图像与地图类似。它们是多层(分辨率)平铺图像。右下角有一个导航(也称为概览)窗口,显示您正在查看的图像部分。

现在,我需要跟踪用户看到的图像部分,并使用颜色掩码在导航窗口中显示该部分。因此,如果用户打开跟踪,将在导航图像上显示透明(alpha值100)黑色遮罩,并且当用户将平移图像时,遮罩将清除该区域。它看起来如下所示: enter image description here

为了实现这一点,我在导航窗口类中完成了以下操作:

public void paintControl( PaintEvent e )
{
     e.gc.drawImage( overviewImage );  //draw the overview image in the background
     e.gc.drawRectangle( cameraBounds ); //draw rectangle showing current camera location

     //draw the tracking mask
     e.gc.setAlpha( 100 );
     e.gc.setBackground( blackColor );
     e.gc.fillRect( getClientArea() ); // draws the black mask on the navigation image

     //now how to draw the visited area?

我的问题是,我现在如何绘制访问区域?有两个问题:

  1. 如何跟踪用户访问了多少区域。如何保持这个多边形?任何可以帮助我的现有算法?
  2. 为了得出这个,最好的策略是什么?

2 个答案:

答案 0 :(得分:0)

Drawing visited area in map/image navigation

您可以实现一种利用简单像素图的算法,而不是为scanlinetracing等复杂算法管理多边形。

为了跟踪访问区域,您可以保留binary matrix,表示显示图像的像素图。最初,矩阵的所有元素都应该是0,这意味着还没有访问过像素。当用户移动导航窗口时,考虑到访问的像素,您应该将矩阵中的相应值更新为1(已访问)。

我不会详细介绍如何使用SWT进行此操作,但您可以通过在导航窗口移动时更新访问像素的Alpha值来管理渲染。您可以通过仅将此更新应用于每个像素一次来提高此渲染的效率,因为可能的更改是一次性和单向的:未访问访问者。换句话说,在访问像素之后,无法回头。要实现这一点,也许你可以保留另一个矩阵,显示不再需要更新的像素。

答案 1 :(得分:0)

也许您可以使用org.eclipse.swt.graphics.Region来维护有关访问区域的信息。每次用户滚动或缩放主视图时,您都可以将查看区域的坐标(矩形)(根据需要缩放)添加到该区域。然后,您可以使用适当的颜色和alpha填充导航窗口的整个客户区域,使用剪切区域。这似乎是一种直截了当的方式。
另一种方法是构造一个要绘制的多边形,使用Region来确定被访问矩形的交点。例如对于矩形{x = 1,y = 1,w = 2,h = 2}和{x = 2,y = 2,w = 2,h = 2},您会发现交点{x = 2,y = 2, w = 1,h = 1},并且除了点{2,2}(第一个矩形的右下角= =交叉点的右下角)和{3,3}之外,还包括原始矩形的角的多边形。 (第二个矩形和交叉点的左上角)另外包括{3,2}和{2,3}(交叉点的另外两个角)。当然,这只是一个普遍的想法,需要进一步审议。