%测试代码
close all; %关闭所有打开的图形窗口。
clc; %清除命令窗口中的所有内容。
set(gcf, 'Renderer', 'painters'); %设置当前图形窗口的渲染器为’painters’,这是一种常用的渲染器
set(gcf, 'Position', [500, 50, 700, 700]); %设置当前图形窗口的位置和大小,位置为屏幕的(500, 50)坐标,大小为700x700像素。
% 定义起始点、终点和地图尺寸,2D空间环境地图
xStart = 1.0; %设置起始点的x坐标
yStart = 2.0; %设置起始点的y坐标
xTarget = 8.0; %设置目标点的x坐标
yTarget = 5.0; %设置目标点的y坐标
MAX_X = 100; %设置地图的最大x坐标
MAX_Y = 100; %设置地图的最大y坐标
%定义多个障碍物的位置
obstacle_positions = [
];
tic; %开始计时
% 生成地图
map = obstacle_map(xStart, yStart, xTarget, yTarget, MAX_X, MAX_Y, obstacle_positions);
%调用obstacle_map函数生成障碍物地图。这个函数根据起始点、目标点和地图大小生成一个二维网格地图,并标记出障碍物
% 可视化地图
visualize_map(map, MAX_X, MAX_Y);
%调用visualize_map函数可视化二维网格地图。这个函数将地图上的障碍物、起始点和目标点显示出来
% Waypoint Generator Using the A*
path = A_star_search(map, MAX_X,MAX_Y);
%调用A_star_search函数使用A算法生成路径。这个函数根据生成的地图和地图大小,使用A算法找到从起始点到目标点的最优路径
Time_Cost = toc; % 结束计时并存储耗时
%用于在已经找到的路径上绘制路径点,并将这些点连接起来,以可视化移动机器人的最优路径
for path_cnt = 2:size(path,1)-1 %循环遍历路径中的所有中间点(不包括起始点和目标点)
%path_cnt:循环变量,从2开始到路径数组的行数减1。
%size(path,1):获取路径数组的行数,即路径点的数量。
scatter(path(path_cnt,1),path(path_cnt,2),'b'); %使用scatter函数绘制每个中间点
%path(path_cnt,1):路径点中的x坐标
%path(path_cnt,2):路径点中的y坐标
%'b':蓝色标记
hold on;%保持当前图形,以便在同一个图形上绘制更多的点
end
if (~isempty(path)) %检查路径数组是否为空
plot(path(:,1),path(:,2),'m-','LineWidth',4);
title('A* Algorithm Path Planning'); % 你可以自定义标题内容
hold on; % 保持图形,以便添加更多元素
lgd = legend('show');
set(lgd, 'Location', 'northeast', 'FontSize', 12, 'FontWeight', 'bold');
%计算并显示走了多少步
steps = size(path, 1) - 1; % 步骤数量等于路径点数量减1
disp(['A星算法路径规划走了 ', num2str(steps), ' 步']); % 显示走了多少步
disp(['A星算法耗时:', num2str(Time_Cost * 1000), '毫秒']);
disp(['A星算法耗时:', num2str(Time_Cost), '秒']);
%使用plot函数将路径点连接起来,绘制出完整的路径
%path(:,1):路径点中的所有x坐标。
%path(:,2):路径点中的所有y坐标。
%'m-':洋红色线条。
%'LineWidth',4:线条宽度设置为4。
end
% 显示图形
hold off; % 结束绘图
在A星算法代码中要保留起点,终点以及品红线条的图例,其他图例全部删掉怎么设置
解答:
在 MATLAB 中精确控制 A* 算法图例显示,可通过以下步骤实现**仅保留起点、终点和品红路径线条的图例**,同时删除其他冗余图例项:
---
### **1. 显式指定图例句柄**
在绘制需要保留图例的元素时,需捕获其图形句柄并设置 `DisplayName` 属性:
```matlab
% 绘制起点(蓝色圆形标记)
h_start = plot(xStart, yStart, 'bo', 'MarkerSize', 8, 'MarkerFaceColor', 'b', 'DisplayName', '起点');
% 绘制终点(红色圆形标记)
h_end = plot(xTarget, yTarget, 'ro', 'MarkerSize', 8, 'MarkerFaceColor', 'r', 'DisplayName', '终点');
% 绘制品红路径线条
h_path = plot(path(:,1), path(:,2), 'm-', 'LineWidth', 4, 'DisplayName', 'A*路径');
```
---
### **2. 禁用中间节点的图例显示**
在绘制中间路径点时,通过 `HandleVisibility` 参数禁止其被图例自动捕获:
```matlab
for path_cnt = 2:size(path,1)-1
scatter(path(path_cnt,1), path(path_cnt,2), 'b', 'HandleVisibility', 'off'); % 不显示图例
hold on;
end
```
---
### **3. 手动构建图例列表**
调用 `legend` 时仅包含需要显示的句柄和标签:
```matlab
% 收集需要显示的图例句柄
legend_handles = [h_start, h_end, h_path];
% 创建图例(指定顺序和标签)
lgd = legend(legend_handles, {'起点', '终点', 'A*路径'}, ...
'Location', 'northeast', ...
'FontSize', 12, ...
'FontWeight', 'bold');
```
---
### **4. 强制清除冗余图例项**
若其他元素(如障碍物)被意外加入图例,可通过以下方法清理:
```matlab
% 获取当前坐标轴所有子对象
all_children = get(gca, 'Children');
% 遍历对象并隐藏非目标图例项的标签
for i = 1:length(all_children)
if ~ismember(all_children(i), legend_handles)
set(get(get(all_children(i), 'Annotation'), 'LegendInformation'), 'IconDisplayStyle', 'off');
end
end
```
---
### **参数说明**
| 参数/函数 | 作用 |
|---------------------------|----------------------------------------------------------------------|
| `'DisplayName', '标签'` | 显式设置图例标签,用于后续手动筛选 |
| `'HandleVisibility', 'off'` | 禁止图形对象被自动加入图例(适用于中间点、障碍物等无需图例的元素) |
| `legend(handles, labels)` | 通过句柄和标签列表精确控制图例内容 |
---
### **效果对比**
| 原始代码问题 | 优化后效果 |
|---------------------------|--------------------------------------------------------------------------|
| 使用 `legend('show')` 自动生成 | 所有带 `DisplayName` 的图形对象均会显示在图例中,可能包含冗余项 |
| 中间路径点默认显示图例 | 通过 `HandleVisibility` 参数强制隐藏中间节点的图例 |
| 障碍物可能被误加入图例 | 遍历子对象并关闭非目标图例项的显示属性 |
---
### **完整代码修改示例**
```matlab
% ...(其他代码保持不变)
% 绘制起点和终点(显式捕获句柄)
h_start = plot(xStart, yStart, 'bo', 'MarkerSize',8, 'MarkerFaceColor','b', 'DisplayName', '起点');
h_end = plot(xTarget, yTarget, 'ro', 'MarkerSize',8, 'MarkerFaceColor','r', 'DisplayName', '终点');
% 绘制中间路径点(禁止图例显示)
for path_cnt = 2:size(path,1)-1
scatter(path(path_cnt,1), path(path_cnt,2), 'b', 'HandleVisibility', 'off');
hold on;
end
% 绘制品红路径线条(显式捕获句柄)
h_path = plot(path(:,1), path(:,2), 'm-', 'LineWidth',4, 'DisplayName', 'A*路径');
% 构建图例(仅包含起点、终点、路径)
legend_handles = [h_start, h_end, h_path];
lgd = legend(legend_handles, {'起点', '终点', 'A*路径'}, ...
'Location', 'northeast', ...
'FontSize', 12, ...
'FontWeight', 'bold');
% 强制清理其他图例项
all_children = get(gca, 'Children');
for i = 1:length(all_children)
if ~ismember(all_children(i), legend_handles)
set(get(get(all_children(i), 'Annotation'), 'LegendInformation'), 'IconDisplayStyle', 'off');
end
end
```
---
通过上述方法,可确保图例仅显示起点、终点和品红路径线条,其他元素(如中间节点、障碍物等)的图例项会被彻底隐藏。
正确代码:
%测试代码
close all; %关闭所有打开的图形窗口。
clc; %清除命令窗口中的所有内容。
set(gcf, 'Renderer', 'painters'); %设置当前图形窗口的渲染器为’painters’,这是一种常用的渲染器
set(gcf, 'Position', [500, 50, 700, 700]); %设置当前图形窗口的位置和大小,位置为屏幕的(500, 50)坐标,大小为700x700像素。
% 定义起始点、终点和地图尺寸,2D空间环境地图
xStart = 1.0; %设置起始点的x坐标
yStart = 2.0; %设置起始点的y坐标
xTarget = 8.0; %设置目标点的x坐标
yTarget = 5.0; %设置目标点的y坐标
MAX_X = 100; %设置地图的最大x坐标
MAX_Y = 100; %设置地图的最大y坐标
%定义多个障碍物的位置
obstacle_positions = [
];
tic; %开始计时
% 生成地图
map = obstacle_map(xStart, yStart, xTarget, yTarget, MAX_X, MAX_Y, obstacle_positions);
%调用obstacle_map函数生成障碍物地图。这个函数根据起始点、目标点和地图大小生成一个二维网格地图,并标记出障碍物
% 可视化地图
visualize_map(map, MAX_X, MAX_Y);
%调用visualize_map函数可视化二维网格地图。这个函数将地图上的障碍物、起始点和目标点显示出来
% Waypoint Generator Using the A*
path = A_star_search(map, MAX_X,MAX_Y);
%调用A_star_search函数使用A算法生成路径。这个函数根据生成的地图和地图大小,使用A算法找到从起始点到目标点的最优路径
Time_Cost = toc; % 结束计时并存储耗时
%用于在已经找到的路径上绘制路径点,并将这些点连接起来,以可视化移动机器人的最优路径
for path_cnt = 2:size(path,1)-1 %循环遍历路径中的所有中间点(不包括起始点和目标点)
%path_cnt:循环变量,从2开始到路径数组的行数减1。
%size(path,1):获取路径数组的行数,即路径点的数量。
scatter(path(path_cnt,1),path(path_cnt,2),'b'); %使用scatter函数绘制每个中间点
%path(path_cnt,1):路径点中的x坐标
%path(path_cnt,2):路径点中的y坐标
%'b':蓝色标记
hold on;%保持当前图形,以便在同一个图形上绘制更多的点
end
if (~isempty(path)) %检查路径数组是否为空
plot(path(:,1),path(:,2),'m-','LineWidth',4);
title('A* Algorithm Path Planning'); % 你可以自定义标题内容
hold on; % 保持图形,以便添加更多元素
% 绘制起点(蓝色圆形标记)
h_start = plot(xStart, yStart, 'bo', 'MarkerSize', 8, 'MarkerFaceColor', 'b', 'DisplayName', '起点');
% 绘制终点(红色圆形标记)
h_end = plot(xTarget, yTarget, 'ro', 'MarkerSize', 8, 'MarkerFaceColor', 'r', 'DisplayName', '终点');
for path_cnt = 2:size(path,1)-1
scatter(path(path_cnt,1), path(path_cnt,2), 'b', 'HandleVisibility', 'off'); % 不显示图例
hold on;
end
% 绘制品红路径线条
h_path = plot(path(:,1), path(:,2), 'm-', 'LineWidth', 4, 'DisplayName', 'A*规划路径');
% 构建图例(仅包含起点、终点、路径)
legend_handles = [h_start, h_end, h_path];
lgd = legend(legend_handles, {'起点', '终点', 'A*规划路径'}, 'Location', 'northeast', 'FontSize', 12, 'FontWeight', 'bold');
% 强制清理其他图例项
all_children = get(gca, 'Children');
for i = 1:length(all_children)
if ~ismember(all_children(i), legend_handles)
set(get(get(all_children(i), 'Annotation'), 'LegendInformation'), 'IconDisplayStyle', 'off');
end
end
%计算并显示走了多少步
steps = size(path, 1) - 1; % 步骤数量等于路径点数量减1
disp(['A星算法路径规划走了 ', num2str(steps), ' 步']); % 显示走了多少步
disp(['A星算法耗时:', num2str(Time_Cost * 1000), '毫秒']);
disp(['A星算法耗时:', num2str(Time_Cost), '秒']);
%使用plot函数将路径点连接起来,绘制出完整的路径
%path(:,1):路径点中的所有x坐标。
%path(:,2):路径点中的所有y坐标。
%'m-':洋红色线条。
%'LineWidth',4:线条宽度设置为4。
end
% 显示图形
hold off; % 结束绘图
图片: