有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用swingworker制作递归三角剖分算法的java动画

这是我在here上提出的关于如何在使用SwingWorker时绘制小程序/窗口的问题的后续问题

在这个特殊的例子中,我使用了Guibas和stolfi提出的分治算法来计算一组点(比如p)的Delaunay三角剖分

算法如下: 1.如果sizeof(p)==2,则添加一条边;回来 2.如果sizeof(p)==3,则添加一个逆时针方向的三角形;回来 3.如果尺寸(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,它充当画布类,在绘图表面上绘制三角形和点

我在主三角剖分类中使用SwingWorker调用三角剖分方法

以下是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) {

            }
        }
    };

现在,我想通过显示递归调用triangulate和merge函数之后出现的三角剖分来设置这个三角剖分的动画

有没有人有一些可以帮助我实现解决方案的指针

我曾考虑在SwingWorker类中使用publish and process方法,但后来发现这是多余的,因为分治算法直接生成最终的三角剖分

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    评论是正确的。我会尝试让partition()方法将它计算的每个三角形(每次经过3个点)报告给SwingWorker,然后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);
    }
    

    抱歉,如果我没有正确理解细微差别-我假设aQuadEdge是一个三角形,所有这些

    而且一定要考虑@kleopatra的建议——也许你的SwingWorker的构造器可以考虑List<PlanarPoint>,而不是从doInBackground()的面板中获取