2012-03-15 50 views
5

这是怎么样的一个后续问题的问题,我问过here关于如何同时使用的SwingWorker使用的SwingWorker

在这种特定情况下画一个小程序/窗口动画递归三角算法,我使用的是由Guibas和stolfi提出的分而治之算法来计算一组点的Delaunay三角剖分,例如P.

该算法如下: 1.如果sizeof(p)== 2,则添加一条边;返回 2.如果sizeof(p)== 3,则添加一个逆时针方向的三角形;返回 3.如果sizeof(p)> 3, 将(p)分成左右两半。 三角测量个体半部 半部一起合并

我有一个三角测量类,其三角测量方法(如代码块示出)将执行分而治之算法(根据由Guibas和斯托尔菲提供的伪代码)

public QuadEdge[] partition(List<PlanarPoint> list) { 
     QuadEdge[] convexHullEdges = new QuadEdge[2]; 
     if (list.size() == 2) { 
      //Add edge 
     } else if (list.size() == 3) { 
      //Add a counter-clockwise oriented triangle 
     } else if (list.size() > 3) { 
      List<PlanarPoint> leftHalf = new ArrayList<PlanarPoint>(); 
      List<PlanarPoint> rightHalf = new ArrayList<PlanarPoint>(); 
      //Divide the list of points into 2 halves 
      QuadEdge[] leftDelaunay = triangulate(leftHalf); 
      QuadEdge ldo = leftDelaunay[0]; 
      QuadEdge ldi = leftDelaunay[1]; 

      QuadEdge[] rightDelaunay = triangulate(rightHalf); 
      QuadEdge rdi = rightDelaunay[0]; 
      QuadEdge rdo = rightDelaunay[1]; 
      // Merge the two halves 
      merge(ldo,ldi,rdi,rdo); 
     } 
     return convexHullEdges; 
    } 

我有一个DrawingPanel,它作为一个Canvas类并绘制三角形,绘制表面上的点。

我在我的主Triangulate类中使用SwingWorker来调用triangulate方法。

下面是对的SwingWorker代码:

private class GuibasStolfiWorker extends 
      SwingWorker<List<QuadEdge>, PlanarPoint> { 

     @Override 
     protected List<QuadEdge> doInBackground() throws Exception { 
      // retrieve the points added by the user on the drawing surface 
      List<PlanarPoint> list = drawingPanel.pointsList(); 
      Trinagulation dt = new Triangulation(list); 
      dt.preprocess(); // removes duplicate points 
      dt.triangulate();// calls the recursive divide and conquer algorithm 
      return dt.edgeList(); //returns the list of edges which form the final triangulation. 
     } 

     protected void process(List<PlanarPoint> chunks) { 
      drawingPanel.repaint(); 
     } 

     public void done() { 
      try { 
       List<QuadEdge> triangles = get(); 
       drawingPanel.setTrianglesList(triangles); 
       drawingPanel.repaint(); 
      } catch (InterruptedException e) { 

      } catch (ExecutionException e) { 

      } 
     } 
    }; 

现在,我想这个动画三角测量,通过显示递归调用三角测量,然后合并功能后出现的三角测量。

有没有人有一些指标,这将有助于我实施解决方案?

我曾考虑过在SwingWorker类中使用发布和处理方法,但后来发现这将是多余的,因为分而治之算法直接与最终的三角测量相提并论。

在此先感谢。

+2

与您的问题无关,只需注意:不要访问doInBackground中的不同步ui属性(可能或不一定是您的情况:-) – kleopatra 2012-03-15 11:36:01

+1

也许是盲目的,但是:看起来您并未调用发布在任何地方在doInBackground - 这意味着过程永远不会被称为... – kleopatra 2012-03-15 11:38:44

+0

@kleopatra我试图调用发布,但它没有帮助。感谢非同步的访问提示。我会改变它。 – chaitanya 2012-03-15 14:59:18

回答

2

评论是正确的。我会尝试让partition()方法将它计算的每个三角形(每次传递3个点)报告给SwingWorker,然后将这个三角形作为publish()。事情是这样的:

public interface TriangleListener { 
    public void reportTriangle(final QuadEdge triangle); 
} 

public QuadEdge[] partition(List<PlanarPoint> list, TriangleListener listener) { 
    QuadEdge[] convexHullEdges = new QuadEdge[2]; 
    if (list.size() == 2) { 
     //Add edge 
    } else if (list.size() == 3) { 
     //Add a counter-clockwise oriented triangle 
     listener.reportTriangle(new QuadEdge(list)); 
    } 
    ... 
} 

private class GuibasStolfiWorker extends 
     SwingWorker<Void, QuadEdge> implements TriangleListener 
{ 
    ... 
    protected void process(List<QuadEdge> chunks) { 
     drawingPanel.addTrianglesToList(chunks); 

     drawingPanel.repaint(); 
    } 

    public void done() { 
     // Nothing to do - panel has all triangles already 
    } 

    @Override 
    public void reportTriangle(final QuadEdge triangle) { 
     publish(triangle); 
    } 
} 

public interface TriangleLsitener { 
    public void reportTriangle(final QuadEdge triangle); 
} 

很抱歉,如果我没有得到正确的细微差别 - 我假设一个QuadEdge是一个三角形,这一切...

绝对拿@克列奥帕特拉的意见考虑在内 - 也许你的SwingWorker的构造函数可以采用​​而不是从doInBackground()的面板中获取。

+0

使用Listener作为接口。非常聪明!我会尝试一下。谢谢你的提示! – chaitanya 2012-03-16 00:28:08

+0

只是一个问题,你会如何定义TriangleListener? – chaitanya 2012-03-16 00:44:04

+0

好的,我编辑了答案来显示TriangleListener是如何定义的......祝你好运! – 2012-03-16 13:46:28