繁体   English   中英

使用swingworker动画化递归三角剖分算法

[英]animating a recursive triangulation algorithm using swingworker

对于我在这里询问的关于如何在使用SwingWorker时绘制applet /窗口的问题,这是一个后续问题

在这个特殊的例子中,我使用由Guibas和stolfi提出的分而治之算法来计算一组点的Delaunay三角剖分,比如P.

算法如下:1。如果sizeof(p)== 2,则添加边; 如果sizeof(p)== 3,则添加一个逆时针方向的三角形; 如果sizeof(p)> 3,则将(p)分成左半部分和右半部分。 对各个半部进行三角测量将两半合并在一起

我有一个三角测量类,其三角测量方法(如代码块所示)将实现分而治之算法(根据Guibas和Stolfi提供的伪代码)

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类中使用发布和处理方法,但后来发现这将是多余的,因为分而治之的算法直接得出最终的三角测量。

提前致谢。

评论在正确的轨道上。 我会尝试让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是一个三角形,所有这些......

并且肯定会考虑@ kleopatra的建议 - 也许你的SwingWorker的构造函数可以使用List<PlanarPoint>而不是从doInBackground()的面板获取。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM