在A星算法代码中要保留起点,终点以及品红线条的图例,其他图例全部删掉怎么设置

%测试代码
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; % 结束绘图


图片:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值