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

Java 在地图/图像导航中绘制访问区域,java,algorithm,graphics,swt,paint,Java,Algorithm,Graphics,Swt,Paint,我正在使用Eclipse RCP和Java中的SWT。 我正在为大型多源医学图像实现一个图像查看器。这些图像与地图相似。它们是多层(分辨率)平铺图像。右下角有一个导航(也称为概览)窗口,显示您正在查看的图像的哪一部分 现在,我需要跟踪用户看到的图像的哪一部分,并使用颜色遮罩在导航窗口中显示。因此,如果用户打开跟踪,导航图像上将显示一个透明(alpha值100)黑色遮罩,当用户在图像中平移时,遮罩将清除该区域。它将如下所示: 为了实现这一点,我在导航窗口类中执行了以下操作: public voi

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

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

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

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?
我的问题是,现在如何绘制访问区域?有两个问题:

  • 如何跟踪用户访问了多少区域。如何维护这个多边形?现有的算法能帮我吗
  • 要得出这一结论,最好的策略是什么
  • 您可以实现一种使用简单像素贴图的算法,而不是为复杂算法(如和)管理多边形

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


    我不会详细介绍如何使用SWT进行渲染,但可以在导航窗口移动时通过更新访问像素的alpha值来管理渲染。通过仅对每个像素应用此更新一次,可以提高此渲染的效率,因为可能的更改是一次性和单向的:未访问到已访问。换言之,访问像素后,就没有回头路了。为了实现这一点,您可以保留另一个矩阵,该矩阵显示不再需要更新的像素

    也许您可以使用
    org.eclipse.swt.graphics.Region
    来维护有关访问区域的信息。每次用户滚动或缩放主视图时,可以将查看区域的坐标(矩形)(根据需要缩放)添加到区域中。然后,您可以使用适当的颜色和alpha填充导航窗口的整个客户端区域,并使用该区域进行剪裁。这似乎是一种相当直截了当的方式

    另一种方法是构造要绘制的多边形,使用该区域确定所访问矩形的交点。e、 g.对于矩形{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}(交叉点的其他两个角)。当然,这只是一个总体想法,需要进一步考虑。

    二进制矩阵似乎是个好主意。但引入SWT是一个问题。每当相机移动时,我必须重新绘制整个导航窗口。我尝试使用二进制矩阵重新绘制每个像素的alpha,但这会导致非常糟糕的性能。每个重画的导航窗口实际上都挂起了我的应用程序。实际上你不必重画整个窗口。正如我所说,这项技术很容易改进。对于每个移动,只需重新绘制矩阵中从0变为1的像素。非常感谢!org.eclipse.swt.graphics.Region类解决了这个问题。我将摄影机边界添加到该区域,并使用它在导航上设置剪裁以绘制可见区域。