在 map/image 导航中绘制访问区域

Drawing visited area in map/image navigation

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

现在,我需要跟踪用户看到的图像的哪一部分,并使用颜色遮罩在导航 window 中显示该部分。因此,如果用户打开跟踪,一个透明(alpha 值 100)的黑色遮罩将显示在导航图像上,当用户平移图像时,遮罩将清除那么多区域。它看起来像下面这样:

为了实现这一点,我在导航中做了以下操作 window class:

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. 画这个,最好的策略是什么?

您可以实施使用简单像素图的算法,而不是像 scanline and tracing 这样的复杂算法来管理多边形。

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

我不会详细介绍如何使用 SWT 完成此操作,但您可以在导航 window 移动时通过更新访问像素的 alpha 值来管理渲染。您可以通过仅将此更新应用于每个像素一次来提高此渲染的效率,因为可能的更改是一次性和单向的:未访问到已访问。换句话说,访问一个像素后就没有回头路了。为此,也许您可​​以保留另一个矩阵,该矩阵显示不再需要更新的像素。

也许您可以使用 org.eclipse.swt.graphics.Region 来维护有关访问区域的信息。每次用户滚动或缩放主视图时,您都可以将查看区域(根据需要缩放)的坐标(矩形)添加到该区域。然后,您可以使用适当的颜色和 alpha 填充导航 window 的整个客户区域,并使用该区域进行裁剪。这似乎是一种相当直接的方法。
另一种方法是构造一个要绘制的多边形,使用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}(交点的另外两个角)。当然,这只是一个大概的想法,还需要进一步斟酌。