从用于计算三角形和外接圆的 Swingworker 中重新绘制小程序

2024-03-21

我正在尝试复制找到的小程序here http://www.diku.dk/hjemmesider/studerende/duff/Fortune/作为练习的一部分。该小程序使用《财富》的算法来生成两者; Voronoi 图和 Delaunay 三角剖分。我只是对在平面上生成 Delaunay 三角剖分感兴趣,因此将使用增量算法,即一次添加 1 个点。我打算展示添加样本点时每个阶​​段生成的三角形。

我正在使用 SwingWorker 类创建包含算法的 Triangulate 类的实例。我在 for 循环中调用 triangulate 方法,当单击 GUI 上的开始按钮时,该循环会迭代采样点集。

这是代码:

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();
            }
        });

下面是 Triangulate 类,它计算一组点的 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
    }
}

我还有另外3节课

  1. PlanarPoint - Point2D.Double 的子类,它实现 Comparable 以提供基于 y 坐标的排序
  2. Triangle - 确定三角形的外接圆和外接半径并确定点是否位于三角形的外接圆内的类
  3. Edge - 将 Edge 表示为具有 2 个 PlanarPoints 作为其端点的类。
  4. DrawingPanel - 充当表面的类,在单击事件时在其上添加点并在屏幕上绘制点。

    现在,这是我所关心的一些问题

    1. 有没有更好的方法通过迭代一组点然后调用 Triangulate 类的函数来获取现有的外接圆和三角形来显示三角形和可能的外接圆
    2. 是否所有绘图都仅限于 DrawingPanel 类,因为在上面的代码片段中,我在扩展 JApplet/JFrame 的类中进行绘画,因此每当调整窗口大小时,绘制的三角形都会丢失?有我可以遵循的设计模式吗?
    3. 除了计算一组点的 DT 的时间是一项耗时的任务之外,使用 SwingWorker 来生成另一个线程是否合理?

如果我遗漏了任何细节,请告诉我

谢谢, 柴塔尼亚


建议:

  • 不要使用getGraphics()获取 Graphics 对象,因为如果执行任何重绘(超出您的控制范围),获得的 Graphics 对象将不会持久。相反,绘制到 BufferedImage 并让 JPanel 或 JComponent 在其 PaintComponent 重写中绘制 BufferedImage,或者将图像数据添加到某种集合中,并让 PaintComponent 重写方法使用信息迭代集合来绘制图像。
  • 不要直接在顶级窗口(例如 JFrame 或 JApplet)中绘制,而是在派生自 JComponent 的组件(通常是 JComponent 本身或 JPanel)中绘制。
  • 阅读 Swing 图形教程,因为他们将解释所有这些以及更多内容。
  • SwingWorker 是完全合理的,因为您想要创建一个作为 Swing 应用程序后台的线程,但又与 Swing 应用程序交互——这正是 SwingWorkers 的创建目的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从用于计算三角形和外接圆的 Swingworker 中重新绘制小程序 的相关文章

  • Java - 从配置文件加密/解密用户名和密码

    我们正忙于为客户开发 Java Web 服务 有两种可能的选择 将加密的用户名 密码存储在Web服务客户端上 从配置中读取 文件在客户端 解密并发送 将加密的用户名 密码存储在 Web 服务器上 从配置中读取 Web 服务器上的文件 解密并
  • 重构——套接字中的良好实践——简单的服务器-客户端 Swing 应用程序

    我使用单例和观察者模式编写了一个带有 Swing 接口的简单服务器 客户端程序 每个客户端都连接到服务器并可以发送消息 服务器将其收到的消息转发给其余的客户端 客户端使用 GUI 允许它们随时连接和断开与服务器的连接 该程序运行得很好 因为
  • 如何使用 Java 创建多个模式连接?

    我必须使用两个数据库 DB2 Oracle 我在 DB2 数据库中有一个名为NAVID 我想使用 Java 为 Oracle 中的所有表创建相同的架构 public class automateExport static String va
  • 在哈希图中存储字符和二进制数

    我正在尝试存储字母到二进制数的映射 这是我的映射 h 001 i 010 k 011 l 100 r 101 s 110 t 111 为此 我创建了一个哈希映射并存储了键值对 我现在想显示给定句子的相应二进制值 这是我的代码 package
  • JBoss AS 5 中的共享库应该放在哪里?

    我是 Jboss 新手 但我有多个 Web 应用程序 每个应用程序都使用 spring hibernate 和其他开源库和 portlet 所以基本上现在每个 war 文件都包含这些 jar 文件 如何将这些 jar 移动到一个公共位置 以
  • 从剪贴板获取图像 Awt 与 FX

    最近 我们的 Java FX 应用程序无法再从剪贴板读取图像 例如 用户在 Microsofts Paint 中选择图像的一部分并按复制 我不是在谈论复制的图像文件 它们工作得很好 我很确定它过去已经有效 但我仍然需要验证这一点 尽管如此
  • org.postgresql.util.PSQLException:协议错误。会话设置失败

    我知道这些类型的问题已经存在 但提供的解决方案对我不起作用 在我的应用程序中 没有版本不匹配的黑白驱动程序和 PostgreSQL 服务器 我还没有找到任何其他解决方案 我正在使用 PostgreSQL 服务器 9 4 和 postgres
  • 无法在 Mac OS X 上启动应用程序 我收到错误 LSOpenURLsWithRole() 应用程序失败,错误为 -10810

    问题 我正在尝试启动一个应用程序 遗传网络分析仪 http www genostar com category products gna 但它默默地失败了 使用时open gna app产生以下错误消息 LSOpenURLsWithRole
  • Scala(或 Java)中泛型函数的特化

    是否可以在 Scala 中专门化泛型函数 或类 例如 我想编写一个将数据写入 ByteBuffer 的通用函数 def writeData T buffer ByteBuffer data T buffer put data 但由于 put
  • Java 类:匿名类、嵌套类、私有类

    有人能解释一下Java中匿名类 嵌套类和私有类之间的区别吗 我想知道与每个相关的运行时成本以及每个编译器的方法 这样我就可以掌握哪个最适合用于例如性能 编译器优化的潜力 内存使用以及其他 Java 编码人员的普遍可接受性 我所说的匿名类是指
  • 在多模块项目中访问绑定适配器

    我有一个多模块项目 其中应用程序模块包含我的绑定适配器 而我的功能模块取决于我的应用程序模块 因为它是动态功能模块 应用程序 包含绑定适配器 gt 动态功能模块 存在布局的地方 我在所有模块中启用了数据绑定和 kapt 我无法成功构建应用程
  • Netty中连接关闭后重新连接的最佳方法是什么

    简单场景 扩展 SimpleChannelUpstreamHandler 的较低级别的类 A 此类是发送消息和接收响应的主力 系统其他部分可以使用顶级类 B 来发送和接收消息 可以模拟同步和异步 此类创建 ClientBootstrap 设
  • 删除 ArrayList 对象问题

    我在处理作业时遇到从 ArrayList 中删除对象的问题 如果我使用 正常 for 循环 它的工作原理如下 public void returnBook String isbn for int i 0 i lt booksBorrowed
  • 膨胀类片段 InflateException 二进制 XML 文件时出错

    我正在使用 Material Design 和 NavigationDrawer 布局等设计我的第一个应用程序 但我遇到了一个问题 该应用程序非常简单 它只显示文本 并且基于 Android Studio 中提供的模板 尝试启动我的应用程序
  • 无法仅在控制台中启动 androidstudio

    你好 我的问题是下一个 我下载了Android Studio如果我去 路径 android studio bin 我执行studio sh 我收到以下错误 No JDK found Please validate either STUDIO
  • Java 8根据Map属性过滤Map对象列表以删除一些重复项

    Have a List
  • SWT - 与操作系统无关的获取等宽字体的方法

    SWT 有没有一种方法可以简单地获得跨各种操作系统的等宽字体 例如 这适用于 Linux 但不适用于 Windows Font mono new Font parent getDisplay Mono 10 SWT NONE 或者我是否需要
  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN
  • Java:基于 Web 的应用程序中的单例类实例

    我在 Web Application 中有这个 Singleton 类 public class MyDAO private static MyDAO instance private MyDAO public static MyDAO g

随机推荐

  • 如何使用Beautifulsoup4等待网站返回数据

    我使用 beautifulsoup4 编写了一个脚本 该脚本基本上从网页上的表格中获取密码列表 问题是我的 python 脚本不会等待网页返回的内容 并且会中断或显示 列表索引超出范围 代码如下 ssl lab url https www
  • 谷歌 reCaptcha V3 中的“浏览器错误”(不可见)

    我正在使用 google reCaptcha v3 不可见 但我收到了一些响应负载 success false error codes browser error 我用谷歌搜索但没有找到任何有关 浏览器错误 的信息 从 7900 个 reC
  • npm、pip、pipenv 和 Poetry 包管理器之间的功能比较 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 主要特点是怎样的npm与之比较pip pipenv and Poetry https python poetry org 包管理器 我
  • 记录 ServiceStack Web 服务 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 用于记录基于 ServiceStack 的 Web 服务的选项有哪些 我不是在谈论单行字符串 我希望能够详细记录 可能很长 返回类型
  • 定义 CreateProjection 和 CreateMap

    在我的项目中 我使用实体框架进行 ORM 使用 Dto 类进行 api 响应 我使用 Automapper 在两者之间进行映射 当我需要直接从 EF 可查询中获取 Dtos 时 我会执行最后的操作ProjectTo lt gt 根据我的查询
  • 将 ggplot 标题放置在绘图的右上角

    我正在使用优秀的theme minimal 在 ggplot0 9 3 中找到 它具有白色背景 我想将绘图的标题放置在绘图右上角的自定义位置 在下面的例子中我知道x and y值 但我想知道是否有办法通过xmax and ymax值以确保文
  • 迭代Go地图获取索引

    为了使用revel s even https revel github io manual templates html even模板中的关键字我想在迭代时获取地图条目的索引range 有什么办法可以做到吗 我的地图具有以下结构 map s
  • dequeueReusableCellWithReuseIdentifier: 和 cellForItemAtIndexPath: 之间的区别

    我一直想知道为什么我的代码可以很好地工作cellForItemAtIndexPath 不与dequeueReusableCellWithReuseIdentifier 在获取集合视图单元格时 这是我的代码 这个效果很好 NSInteger
  • 为连续序列和分割向量创建分组变量

    我有一个向量 例如c 1 3 4 5 9 10 17 29 30 我想将形成规则 连续序列的 相邻 元素分组在一起 即在参差不齐的向量中增加 1 结果是 L1 1L2 3 4 5L3 9 10 L4 17L5 29 30 天真的代码 前 C
  • 如何确定 Qt 5 中的 QtWebEngine 在运行时使用的是哪个 chromium 版本?

    我在 Qt 5 中找不到任何函数来确定使用哪个 chromium 版本QtWebEngine 我不想在代码中硬编码 chromium 版本 因为我经常更新我的应用程序 并且每个版本中的 chromium 版本通常都会更改 而且 Qt 是向后
  • 目录相对 ZwCreateFile

    我必须为我的大学项目实施交叉视图文件完整性检查器 为此 我如何在内核模式下列出目录的文件 你的起点是ZwCreateFile http msdn microsoft com en us library windows hardware ff
  • 如何使用 ComPtr 中包装的 Direct3D 11 指针来获取 11.1 接口?

    我正在遵循教程 并将通常的初始化转换为使用 ComPtrs 直到这一行 ID3D11Device g pd3dDevice nullptr ID3D11Device1 g pd3dDevice1 nullptr Obtain the Dir
  • TriangleMesh JavaFX 中 getNormals() 方法的用途是什么

    我目前正在开发 JavaFX 3D 应用程序 并在 TriangleMesh 类中遇到 getNormals 方法 正如 Triangle Mesh 类用于创建用户定义的 Java FX 3D 对象一样 其中getPoints 用于添加Po
  • Python:subprocess.Popen() 的第一个实例非常慢

    我确信我错过了一些简单的东西 但是当使用子进程模块时 启动第一个子进程需要等待一段非常长的时间 gt 10 秒 第二个在第一个之后不久开始 有没有什么办法解决这一问题 代码如下 编辑 要添加 HWAccess 在 proc py 中 链接一
  • 如何将音频文件录制为 .m4a 格式?

    如何将音频文件录制为 m4a 格式 我正在使用下面的代码 public void startRecording throws IOException recorder new MediaRecorder path sdcard pithys
  • PyCharm:Scapy 未解决的参考

    我正在开发一个使用 scapy 用 python 编写的网络工具 我使用 Pycharm 作为 IDE 我的代码有效 因此 如果我运行它 一切都会按预期进行 我的问题是 PyCharm 给了我一些错误 它标志着每次使用IP TCP Ethe
  • 将 scanf 与 x86-64 GAS 组件结合使用

    我在尝试调用系统函数 scanf 以在我的 x86 汇编程序中工作时遇到了很多问题 目前我已经让它从标准中读取 但是它只会读取没有段错误的字符 我不知道为什么 指定字符串是 d 我在网上看到的 x86 中的 scanf 示例使用 quark
  • Git 忽略文件,而不删除它

    我有一个使用 GIT 进行版本控制的网站 我设置了一个系统 基本上可以自动部署我的更改master分支到我的生产服务器 也就是说 我的存储库中有一个 Web 挂钩 它会触发一个 PHP 脚本 该脚本本质上会启动一个git pull在服务器上
  • WatiN 搜索 google 后找不到文字

    我正在尝试运行一个简单的等待示例 搜索谷歌然后验证搜索结果 在 IE9 上 var browser new IE http www google com ncr browser TextField Find ByName q TypeTex
  • 从用于计算三角形和外接圆的 Swingworker 中重新绘制小程序

    我正在尝试复制找到的小程序here http www diku dk hjemmesider studerende duff Fortune 作为练习的一部分 该小程序使用 财富 的算法来生成两者 Voronoi 图和 Delaunay 三