Java 重新绘制swingworker用于计算三角形和外圆的小程序

Java 重新绘制swingworker用于计算三角形和外圆的小程序,java,swing,graphics,computational-geometry,swingworker,Java,Swing,Graphics,Computational Geometry,Swingworker,我正在尝试复制作为练习一部分找到的小程序。小程序使用Fortune的算法生成这两个函数;Voronoi图和Delaunay三角剖分。我只对在平面上生成Delaunay三角剖分感兴趣,因此将使用增量算法,即一次添加1个点。我打算显示添加采样点时在每个阶段生成的三角形 我正在使用SwingWorker类创建包含算法的Triangulate类的实例。我在for循环中调用triangulate方法,当单击GUI上的start按钮时,该循环将遍历样本点集 下面是代码: JButton startButto

我正在尝试复制作为练习一部分找到的小程序。小程序使用Fortune的算法生成这两个函数;Voronoi图和Delaunay三角剖分。我只对在平面上生成Delaunay三角剖分感兴趣,因此将使用增量算法,即一次添加1个点。我打算显示添加采样点时在每个阶段生成的三角形

我正在使用SwingWorker类创建包含算法的Triangulate类的实例。我在for循环中调用triangulate方法,当单击GUI上的start按钮时,该循环将遍历样本点集

下面是代码:

JButton startButton = new JButton("Start");
        startButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                SwingWorker<List<Triangle>, Triangle> worker = new SwingWorker<List<Triangle>, Triangle>() {
                    @Override
                    protected List<Triangle> doInBackground() throws Exception {
                        Triangulate dt = new Triangulate(drawingPanel.pointsList());
                        dt.preTriangulate(); //Set-up a bounding triangle and obtain a random permutation of the points
                        List<PlanarPoint> pointsList = dt.pointsList();
                        for (int i = 0; i < pointsList.size(); i++) {
                            PlanarPoint sample = pointsList.get(i);
                            dt.triangulate(sample); 
                            List<Triangle> list = dt.trianglesList(); //Obtaining the list of triangles at every stage. Good Idea??
                            for (int j = 0; j < list.size(); j++) {
                                publish(list.get(j));
                            }
                            Thread.sleep(500);
                        }
                        dt.removeTriangles(dt.trianglesList()); // Remove all the triangles containing bounding-triangle vertices
                        return dt.trianglesList();
                    }

                    protected void process(List<Triangle> triangles) {
                        for (Triangle triangle : triangles) {
                            g = drawingPanel.getGraphics();
                            PlanarPoint p1 = triangle.getVertex1();
                            PlanarPoint p2 = triangle.getVertex2();
                            PlanarPoint p3 = triangle.getVertex3();
                            g.drawLine((int) Math.ceil(p1.x), (int) Math.ceil(p1.y),
                                    (int) Math.ceil(p2.x), (int) Math.ceil(p2.y));
                            g.drawLine((int) Math.ceil(p2.x),(int) Math.ceil(p2.y),
                                    (int) Math.ceil(p3.x),(int) Math.ceil(p3.y));
                            g.drawLine((int) Math.ceil(p3.x),(int) Math.ceil(p3.y),
                                    (int) Math.ceil(p1.x),(int) Math.ceil(p1.y));
                        }
                    }
                };
                worker.execute();
            }
        });
JButton Start按钮=新的JButton(“开始”);
addActionListener(新ActionListener()){
已执行的公共无效行动(行动事件ae){
SwingWorker worker=新SwingWorker(){
@凌驾
受保护列表doInBackground()引发异常{
Triangulate dt=新的三角形(drawingPanel.pointsList());
dt.preTriangulate();//设置边界三角形并获得点的随机排列
List pointsList=dt.pointsList();
对于(int i=0;i
下面是三角剖分类,它计算一组点的Delanuay三角剖分:

public class Triangulate {

    private List<PlanarPoint> pointsList;
    private List<Triangle> triangleList;
    private Triangle boundingTriangle;
    private List<Edge> edgeList;

    public Triangulate(List<PlanarPoint> pointsList) {
        this.pointsList = pointsList;
        this.triangleList = new ArrayList<Triangle>();
        this.edgeList = new ArrayList<Edge>();
    }

    public List<Triangle> trianglesList() {
        return triangleList;
    }

    public List<PlanarPoint> pointsList() {
        return pointsList;
    }

    public void preTriangulate() {
        boundingTriangle = getBoundingTriangle(pointsList);
        triangleList.add(boundingTriangle);
        randomPermutation(pointsList);
    }

    public void triangulate(PlanarPoint samplePoint) {
        // A procedure implementing the Bowyer - Watson algorithm
        // to calculate the DT of a set of points in a plane.
    }

    public void removeTriangles(List<Triangle> trianglesList) {
        // A procedure to remove all triangles from the list sharing
        // edges with the bounding-triangle
    }

    private Triangle getBoundingTriangle(List<PlanarPoint> pointsList) {
        //Obtains a bounding-triangle for a set of points
    }

    public void randomPermutation(List<PlanarPoint> pointsList) {
        //Obtains a random permutation of a set of points
    }
}
公共类三角剖分{
私有列表点列表;
私人列表三角列表;
私有三角形边界三角形;
私人名单边缘主义者;
公共三角测量(列表点列表){
this.pointsList=pointsList;
this.triangleList=新的ArrayList();
this.edgeList=新的ArrayList();
}
公共列表三角形列表(){
返回三角形列表;
}
公共列表点列表(){
返回点列表;
}
公共无效预三语(){
boundingTriangle=getBoundingTriangle(点列表);
三角形列表。添加(边界三角形);
随机排列(点列表);
}
公共空心三角形化(平面点采样点){
//一个实现Bowyer-Watson算法的程序
//计算平面上一组点的DT。
}
公共空心删除三角形(列表三角形列表){
//从共享列表中删除所有三角形的过程
//具有边界三角形的边
}
私有三角形getBoundingTriangle(列表点列表){
//获取一组点的边界三角形
}
公共无效随机排列(列表点列表){
//获得一组点的随机排列
}
}
我还有3节课

  • PlanarPoint—Point2D.Double的子类,它实现了Compariable以提供基于y坐标的排序
  • 三角形-一个类,用于确定三角形的外接圆和外接圆半径,并确定点是否位于三角形的外接圆内
  • 边-一个类,它将边表示为具有2个平面点作为其端点的边
  • DrawingPanel-一个类,用作在单击事件中添加点并在屏幕上绘制的曲面

    现在,我有几个顾虑

  • 有没有更好的方法来显示三角形和可能的外接圆,方法是迭代一组点,然后调用Triangulate类的函数来获得现有的外接圆和三角形
  • 由于在上面的代码片段中,我是在扩展JApplet/JFrame的类中绘制的,因此每当调整窗口的大小时,绘制的三角形都会丢失,所以所有的绘图是否应该限制为DrawingPanel类?有我可以遵循的设计模式吗
  • 除了计算一组点的DT是一项耗时的任务之外,在这里使用SwingWorker来生成另一个线程是否合理
  • 如果我遗漏了任何细节,请告诉我

    谢谢, 柴坦尼亚建议:

    • 不要使用
      getGraphics()
      获取图形对象,因为图形对象obt