网站建设培训公司排名濮阳县网

张小明 2026/1/9 6:49:04
网站建设培训公司排名,濮阳县网,公司法治企业建设,如何让我们的网站新闻被百度新闻收录1、演示视频 基于Java Swing的路径寻路算法可视化演示程序2、项目截图 设计说明 3.1 技术架构 本项目采用Java语言开发#xff0c;核心技术栈包括#xff1a; Swing框架#xff1a;用于搭建图形用户界面#xff0c;包括主窗口、控制面板、绘图面板、说明面板等组件…1、演示视频基于Java Swing的路径寻路算法可视化演示程序2、项目截图设计说明3.1 技术架构本项目采用Java语言开发核心技术栈包括Swing框架用于搭建图形用户界面包括主窗口、控制面板、绘图面板、说明面板等组件是JDK 8自带的GUI库无需额外依赖。A*算法作为核心路径寻路算法负责计算从起点到终点的最优路径。多线程技术将A*算法的执行放在独立线程中避免阻塞Swing的事件调度线程EDT保证界面的流畅性。线程安全集合使用ConcurrentLinkedQueue存储算法的开放列表和封闭列表节点坐标解决多线程环境下的数据不一致问题。3.2 界面设计程序界面采用Swing的BorderLayout边界布局进行管理分为三个主要区域顶部控制面板NORTH包含“重置地图”和“开始寻路”两个功能按钮采用流式布局FlowLayout按钮排列整齐。中间绘图面板CENTER核心的网格绘制区域继承JPanel并重写paintComponent方法实现网格和节点状态的自定义绘制。底部说明面板SOUTH采用GridLayout1行2列分为颜色说明和操作说明两部分每部分内部采用BoxLayout垂直布局排列内容保证排版整齐。3.3 数据结构设计二维数组NodeState[][] grid存储整个网格的节点状态维度为[行数][列数]每个元素为NodeState枚举类型包含空、起点、终点、障碍等状态。优先队列PriorityQueue作为A*算法的开放列表按节点的总代价f值升序排列保证每次取出代价最小的节点。哈希集合Set作为A*算法的封闭列表存储已考察的节点避免重复处理。队列Queue用于存储算法搜索过程中的节点坐标实现动画演示的效果。列表List存储算法找到的最终路径节点坐标用于路径的绘制。3.4 类结构设计主类PathFindingVisualizer继承JFrame是程序的入口和核心控制类负责初始化界面、绑定事件监听、调度A*算法执行。内部枚举类NodeState定义网格节点的所有状态包括空、起点、终点、障碍、开放列表、封闭列表、路径。内部绘图面板类DrawingPanel继承JPanel负责网格和节点状态的绘制重写paintComponent方法实现自定义绘制逻辑。内部节点类Node属于A*算法的内部类存储节点的坐标、代价g/h/f和父节点实现Comparable接口用于优先队列排序。四、算法说明4.1 算法概述A*算法A星算法是一种经典的启发式搜索算法结合了Dijkstra算法的全局最优性和贪婪最佳优先搜索算法的启发式特性能够高效地找到从起点到终点的最优路径。该算法的核心是通过评估函数来引导搜索方向减少不必要的搜索节点提升寻路效率。4.2 核心公式A*算法的评估函数为f(n) g(n) h(n)g(n)表示从起点到当前节点n的实际代价本程序中每移动一个网格节点的代价为1因此g(n)等于起点到当前节点的步数。h(n)表示从当前节点n到终点的估计代价启发函数本程序采用曼哈顿距离作为启发函数适用于网格中只能上下左右移动的场景。f(n)表示节点n的总代价算法优先选择f值最小的节点进行扩展搜索。4.3 曼哈顿距离计算曼哈顿距离的计算公式为h(n) |row₁ - row₂| |col₁ - col₂|其中(row₁, col₁)为当前节点的坐标(row₂, col₂)为终点的坐标。曼哈顿距离的特点是只计算水平和垂直方向的距离符合本程序中网格节点只能上下左右移动的规则。4.4 算法执行步骤初始化创建起点节点计算其h值到终点的曼哈顿距离将起点节点加入开放列表优先队列封闭列表初始化为空。主循环只要开放列表不为空取出其中f值最小的节点作为当前节点。终点判断若当前节点是终点则回溯父节点生成路径算法结束。节点扩展将当前节点加入封闭列表遍历当前节点的上下左右四个相邻节点若相邻节点是障碍或已在封闭列表中跳过该节点。计算相邻节点的新g值当前节点g值1若该节点不在开放列表中或新g值更小找到更优路径则更新该节点的g值、h值和父节点并将其加入或更新开放列表。循环结束若开放列表为空且未找到终点则表示无可行路径。路径回溯从终点节点开始依次回溯父节点直到起点节点将路径节点反转后即为从起点到终点的最优路径。五、测试说明5.1 测试环境测试项测试环境操作系统Windows 10/11、macOS、LinuxUbuntuJava版本JDK 8、JDK 11、JDK 17向下兼容运行方式命令行编译运行、IDEEclipse/IntelliJ IDEA运行5.2 功能测试用例测试用例测试步骤预期结果起点终点设置1. 启动程序2. 左键点击网格任意位置3. 左键点击另一位置。第一个位置变为绿色起点第二个位置变为红色终点。障碍绘制1. 设置起点和终点2. 左键点击空网格3. 左键拖拽网格。点击/拖拽的位置变为黑色障碍起点和终点位置不可绘制障碍。节点清除1. 绘制起点、终点、障碍2. 右键点击对应节点。节点恢复为白色空节点起点/终点被清除后可重新设置。地图重置1. 绘制各类节点2. 点击“重置地图”按钮。所有节点恢复为白色起点、终点坐标重置。正常寻路1. 设置起点和终点2. 绘制少量障碍3. 点击“开始寻路”。算法动画展示搜索过程最终生成橙色路径从起点到终点。无路径寻路1. 设置起点和终点2. 绘制障碍完全隔离起点和终点3. 点击“开始寻路”。算法搜索后弹出“未找到可行路径”提示框。重复寻路1. 完成一次寻路2. 点击“开始寻路”按钮。程序忽略重复点击不会重复执行算法。5.3 性能测试在标准网格25行×40列下程序的性能表现如下无障碍场景算法可在1秒内完成寻路并展示路径。中等障碍场景约30%网格为障碍算法在2-3秒内完成寻路。大量障碍场景约60%网格为障碍算法在3-5秒内完成寻路若存在路径。注算法执行时间包含动画延迟50毫秒/节点若关闭延迟算法执行速度会大幅提升。六、关键代码6.1 程序入口与主窗口初始化程序的入口方法在Swing的事件调度线程中创建主窗口保证界面线程安全/** * 程序入口方法 * Swing程序的入口必须在事件调度线程EDT中执行因此使用SwingUtilities.invokeLater * param args 命令行参数未使用 */ public static void main(String[] args) { // 在EDT线程中创建并启动程序主窗口 SwingUtilities.invokeLater(PathFindingVisualizer::new); } /** * 构造方法初始化程序的主窗口和所有组件 * 包括网格数据初始化、窗口布局、组件创建、事件监听绑定 */ public PathFindingVisualizer() { // 1. 初始化网格数据将所有节点设置为默认的空状态 grid new NodeState[GRID_ROWS][GRID_COLS]; for (int i 0; i GRID_ROWS; i) { Arrays.fill(grid[i], NodeState.EMPTY); } // 2. 初始化主窗口的基本属性 setTitle(路径寻路算法演示A*算法); // 窗口标题 // 窗口大小宽度列数*网格尺寸边距高度行数*网格尺寸控制面板说明区域高度 setSize(GRID_COLS * GRID_SIZE 20, GRID_ROWS * GRID_SIZE 150); setDefaultCloseOperation(EXIT_ON_CLOSE); // 关闭窗口时退出程序 setLayout(new BorderLayout()); // 使用边界布局管理组件位置 // 3. 创建控制面板顶部包含功能按钮 createControlPanel(); // 4. 创建绘图面板中间核心的网格绘制区域 drawingPanel new DrawingPanel(); add(drawingPanel, BorderLayout.CENTER); // 5. 创建说明面板底部展示颜色和操作说明 createInfoPanel(); // 6. 绑定鼠标事件监听处理网格的交互操作 addMouseListeners(); // 7. 窗口显示设置居中显示并可见 setLocationRelativeTo(null); // 窗口在屏幕中央显示 setVisible(true); }6.2 A*算法核心实现A*算法的核心逻辑包含节点代价计算、开放列表/封闭列表管理、路径回溯/** * A*算法的核心实现 * A*算法的核心公式f(n) g(n) h(n) * - g(n)起点到当前节点n的实际代价这里每步代价为1 * - h(n)当前节点n到终点的估计代价曼哈顿距离 * - f(n)节点n的总代价算法优先选择f值最小的节点 * return boolean是否找到从起点到终点的路径 */ private boolean aStarAlgorithm() { // 内部节点类存储网格节点的坐标、代价g/h/f和父节点用于回溯路径 class Node implements Comparable { int row; // 节点的行坐标 int col; // 节点的列坐标 int g; // 起点到当前节点的实际代价 int h; // 当前节点到终点的估计代价曼哈顿距离 Node parent; // 父节点用于回溯路径 /** * 节点构造方法 * param row 行坐标 * param col 列坐标 */ Node(int row, int col) { this.row row; this.col col; this.g 0; // 初始代价为0 this.h 0; // 初始估计代价为0 this.parent null; // 初始父节点为null } /** * 计算节点的总代价f g h * return 总代价f值 */ int getF() { return g h; } /** * 实现Comparable接口用于优先队列的排序按f值升序 * param o 另一个节点对象 * return 比较结果负数表示当前节点f值更小正数表示更大0表示相等 */ Override public int compareTo(Node o) { return Integer.compare(this.getF(), o.getF()); } /** * 重写equals方法判断两个节点是否为同一个行、列坐标相同 * param o 另一个对象 * return boolean是否相等 */ Override public boolean equals(Object o) { if (this o) return true; // 引用相同直接返回true if (o null || getClass() ! o.getClass()) return false; // 空对象或类型不同返回false Node node (Node) o; // 强制类型转换 // 行、列坐标都相同则返回true return row node.row col node.col; } /** * 重写hashCode方法与equals方法保持一致行、列坐标的哈希值 * return 节点的哈希值 */ Override public int hashCode() { return Objects.hash(row, col); // 使用Objects工具类计算哈希值 } } // 1. 初始化开放列表和封闭列表 // 开放列表优先队列按f值升序存储待考察的节点 PriorityQueue openList new PriorityQueue(); // 封闭列表HashSet存储已考察的节点避免重复处理 Set closedList new HashSet(); // 2. 创建起点节点计算其h值到终点的曼哈顿距离并加入开放列表 Node startNode new Node(startRow, startCol); startNode.h calculateManhattanDistance(startRow, startCol, endRow, endCol); openList.add(startNode); // 3. 定义移动方向数组上下左右四个方向可扩展为八个方向斜向 int[][] directions {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // 4. A*算法主循环只要开放列表不为空且正在寻路就继续搜索 while (!openList.isEmpty() isSearching) { // 取出开放列表中f值最小的节点优先队列的队首 Node currentNode openList.poll(); // 校验节点是否为空极端情况的防御性编程 if (currentNode null) { continue; } // 5. 判断当前节点是否为终点若是回溯路径并返回true if (currentNode.row endRow currentNode.col endCol) { path new ArrayList(); // 初始化路径列表 Node temp currentNode; // 从终点节点开始回溯 // 一直回溯到起点节点父节点为null while (temp ! null) { // 将节点的坐标加入路径列表Point的x为行y为列 path.add(new Point(temp.row, temp.col)); temp temp.parent; // 移动到父节点 } Collections.reverse(path); // 反转路径列表从起点到终点 drawPath(); // 绘制最终路径 return true; // 找到路径返回true } // 6. 将当前节点加入封闭列表标记为已考察 closedList.add(currentNode); // 将当前节点的坐标加入封闭列表队列用于动画演示 closedListQueue.add(new Point(currentNode.row, currentNode.col)); updateGridUI(); // 更新UI绘制封闭列表节点 // 7. 遍历当前节点的所有相邻节点上下左右 for (int[] dir : directions) { // 计算相邻节点的行列坐标 int newRow currentNode.row dir[0]; int newCol currentNode.col dir[1]; // 8. 校验相邻节点的有效性坐标在网格内且不是障碍节点 if (!isValidGrid(newRow, newCol) || grid[newRow][newCol] NodeState.OBSTACLE) { continue; // 无效节点跳过 } // 9. 创建相邻节点对象 Node neighbor new Node(newRow, newCol); // 10. 若相邻节点已在封闭列表中跳过已考察过 if (closedList.contains(neighbor)) { continue; } // 11. 计算相邻节点的新g值当前节点g值1每步代价为1 int newG currentNode.g 1; // 判断相邻节点是否已在开放列表中 boolean isInOpenList openList.contains(neighbor); // 12. 若节点不在开放列表或新g值更小找到更优路径 if (!isInOpenList || newG neighbor.g) { // 更新相邻节点的代价和父节点 neighbor.g newG; // 更新g值 // 计算h值到终点的曼哈顿距离 neighbor.h calculateManhattanDistance(newRow, newCol, endRow, endCol); neighbor.parent currentNode; // 设置父节点为当前节点 // 13. 若节点不在开放列表加入开放列表并更新UI if (!isInOpenList) { openList.add(neighbor); // 将相邻节点的坐标加入开放列表队列用于动画演示 openListQueue.add(new Point(newRow, newCol)); updateGridUI(); // 更新UI绘制开放列表节点 } else { // 若节点已在开放列表更新其优先级JDK8的PriorityQueue需要先移除再添加 openList.remove(neighbor); openList.add(neighbor); } } } // 14. 延迟50毫秒让动画演示更清晰控制搜索速度 try { Thread.sleep(50); } catch (InterruptedException e) { // 线程被中断时重置寻路状态并返回false Thread.currentThread().interrupt(); isSearching false; return false; } } // 开放列表为空未找到路径返回false return false; }6.3 网格绘制与节点状态渲染自定义绘图面板实现网格和节点状态的绘制/** * 自定义绘图面板继承JPanel负责绘制网格和节点状态 * 重写paintComponent方法实现自定义绘制逻辑 */ private class DrawingPanel extends JPanel { /** * 重写paintComponent方法实现网格和节点的绘制 * param g 绘图上下文对象用于绘制图形、文字等 */ Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 调用父类方法完成面板的基础绘制 // 遍历所有网格节点逐个绘制 for (int i 0; i GRID_ROWS; i) { for (int j 0; j GRID_COLS; j) { // 1. 根据节点状态设置绘制颜色 setNodeColor(g, grid[i][j]); // 2. 填充网格单元格使用GRID_SIZE-1避免网格线重叠 g.fillRect(j * GRID_SIZE, i * GRID_SIZE, GRID_SIZE - 1, GRID_SIZE - 1); // 3. 绘制网格边框灰色增强视觉效果 g.setColor(Color.GRAY); g.drawRect(j * GRID_SIZE, i * GRID_SIZE, GRID_SIZE - 1, GRID_SIZE - 1); } } } /** * 根据节点状态设置绘图的颜色 * param g 绘图上下文对象 * param state 节点状态 */ private void setNodeColor(Graphics g, NodeState state) { switch (state) { case START: g.setColor(Color.GREEN); // 起点绿色 break; case END: g.setColor(Color.RED); // 终点红色 break; case OBSTACLE: g.setColor(Color.BLACK); // 障碍黑色 break; case OPEN: g.setColor(Color.CYAN); // 开放列表青色 break; case CLOSED: g.setColor(Color.LIGHT_GRAY); // 封闭列表浅灰色 break; case PATH: g.setColor(Color.ORANGE); // 路径橙色 break; default: g.setColor(Color.WHITE); // 空节点白色 break; } } }
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

杭州网络营销网站正能量网站入口地址

一、AIGC——当“内容”开始自己生长在过去的十年,AIGC (AI Generated Content) 从学术论文里的冷僻缩写,华丽转身为市场的宠儿。 如今,AI 不仅能写(比如我👋),还能画、能唱、能推理、能陪你聊人…

张小明 2026/1/7 5:28:21 网站建设

公司电商网站开发合同重庆网站优化

在视觉场景中识别并分割任意物体的能力,是多模态人工智能的重要基础,可广泛应用于机器人、内容创作、增强现实、数据标注等领域。SAM(Segment Anything Model)是 Meta 于 2023 年 4 月发布的人工智能通用模型,提出了针…

张小明 2026/1/7 5:32:31 网站建设

网站代码怎么看建设银行银行号查询网站

CANopenNode终极指南:免费开源嵌入式CAN总线协议栈快速上手 【免费下载链接】CANopenNode CANopen protocol stack 项目地址: https://gitcode.com/gh_mirrors/ca/CANopenNode CANopenNode作为一款功能完整的开源CANopen协议栈实现,为嵌入式开发者…

张小明 2026/1/7 5:28:22 网站建设

网站建设论文 网站建设论文济南建站培训

comsol MXene超材料吸收器。打开COMSOL的时候,总感觉这软件像是个三维乐高乐园——尤其是当你想用MXene这种二维材料搭个超材料吸收器的时候。先别急着点开电磁波模块,咱们先搞明白MXene这货在微波段的奇葩表现:介电常数实部负数,…

张小明 2026/1/7 5:28:23 网站建设

易居cms北京seo

去噪自动编码器实战:使用TensorFlow恢复模糊图片 在数字图像无处不在的今天,我们常常面临一个尴尬的问题:一张本应清晰的照片,却因为拍摄条件差、设备老旧或传输过程受损而变得模糊不清。无论是翻拍的老照片、低光照下的监控画面&…

张小明 2026/1/7 5:28:27 网站建设

淮安做网站的有多少钱百度搜索seo优化技巧

Linly-Talker在智能家居控制中的视觉反馈机制 在智能音箱和语音助手早已进入千家万户的今天,我们是否还满足于“听得到回应却看不见表情”的交互方式?当用户说“我有点冷”,设备能自动调高暖气固然聪明,但如果那个声音来自一个面带…

张小明 2026/1/7 5:28:27 网站建设