matlab中处理多个坐标点和多条线段的情况,计算每个点到每条线段的最短距离,找出每个点对应的最短距离线段,并绘制出所有点、线段以及每个点对应的最短距离线段的图形。(不废话上完整程序)
% 定义多个坐标点,每行代表一个点的坐标
point_coords = [1, 8;
3, 7;
9.5, 9];
% 定义多条线段,每行代表一条线段的起点和终点坐标
segment_coords = [1, 1, 4, 5;
2, 2, 5, 6;
3, 3, 10, 7];
[min_dists, min_line_indices, closest_points] = calculate_and_plot(point_coords, segment_coords);
% 输出每个点到线段的最短距离、对应的线段索引以及最短距离点的坐标
disp('每个点到线段的最短距离:');
disp(min_dists);
disp('每个点对应的最短距离线段索引:');
disp(min_line_indices);
disp('每个点到最短距离线段的最短距离点坐标:');
disp(closest_points);
function [min_dists, min_line_indices, closest_points] = calculate_and_plot(point_coords, segment_coords)
num_points = size(point_coords, 1);
num_segments = size(segment_coords, 1);
% 初始化输出数组
min_dists = zeros(num_points, 1);
min_line_indices = zeros(num_points, 1);
closest_points = zeros(num_points, 2);
% 用于绘图的线段颜色数组
segment_colors = lines(num_segments);
% 用于绘图的点颜色数组
point_colors = jet(num_points);
for i = 1:num_points
point = point_coords(i, :);
min_dist = Inf;
min_line_index = 0;
closest_point = [];
for j = 1:num_segments
segment_start = segment_coords(j, 1:2);
segment_end = segment_coords(j, 3:4);
% 计算点到单条线段的最短距离
dist = point_to_segment_distance(point, segment_start, segment_end);
if dist < min_dist
min_dist = dist;
min_line_index = j;
closest_point = get_closest_point(point, segment_start, segment_end);
end
end
% 记录每个点的最短距离、对应的线段索引以及最短距离点的坐标
min_dists(i) = min_dist;
min_line_indices(i) = min_line_index;
closest_points(i, :) = closest_point;
end
% 绘制图形
plot_results(point_coords, segment_coords, min_line_indices, segment_colors, point_colors, closest_points);
end
function dist = point_to_segment_distance(point, segment_start, segment_end)
vec_seg = segment_end - segment_start;
vec_point = point - segment_start;
t = dot(vec_point, vec_seg) / dot(vec_seg, vec_seg);
t = max(0, min(1, t));
proj_point = segment_start + t * vec_seg;
dist = norm(point - proj_point);
end
function closest_point = get_closest_point(point, segment_start, segment_end)
vec_seg = segment_end - segment_start;
vec_point = point - segment_start;
t = dot(vec_point, vec_seg) / dot(vec_seg, vec_seg);
t = max(0, min(1, t));
closest_point = segment_start + t * vec_seg;
end
function plot_results(point_coords, segment_coords, min_line_indices, segment_colors, point_colors, closest_points)
num_points = size(point_coords, 1);
num_segments = size(segment_coords, 1);
hold on;
% 绘制线段
for i = 1:num_segments
segment_start = segment_coords(i, 1:2);
segment_end = segment_coords(i, 3:4);
plot([segment_start(1), segment_end(1)], [segment_start(2), segment_end(2)], 'Color', segment_colors(i, :), 'LineWidth', 1.5);
end
% 绘制点
for i = 1:num_points
point = point_coords(i, :);
plot(point(1), point(2), 'Marker', 'o', 'Color', point_colors(i, :), 'MarkerSize', 8);
end
% 绘制每个点对应的最短距离线段
for i = 1:num_points
min_line_index = min_line_indices(i);
segment_start = segment_coords(min_line_index, 1:2);
segment_end = segment_coords(min_line_index, 3:4);
plot([segment_start(1), segment_end(1)], [segment_start(2), segment_end(2)], 'Color', segment_colors(min_line_index, :), 'LineWidth', 2);
% 绘制最短距离点
closest_point = closest_points(i, :);
plot(closest_point(1), closest_point(2), 'Marker', 'x', 'Color', segment_colors(min_line_index, :), 'MarkerSize', 10);
end
% 绘制线段
array1=point_coords;
array2=closest_points;
% 创建一个空数组,用于存储合并后的结果
newArray = zeros(size(array1, 1), 4);
% 将第一个数组的点先放入新数组
newArray(:, 1:2) = array1;
% 将第二个数组的点对应放入新数组后面
for i = 1:size(array1, 1)
newArray(i, 3:4) = array2(i, :);
end
num_segments1 = size(point_coords, 1);
for i = 1:num_segments
segment_start = newArray(i, 1:2);
segment_end = newArray(i, 3:4);
plot([segment_start(1), segment_end(1)], [segment_start(2), segment_end(2)], 'Color', segment_colors(i, :), 'LineWidth', 1.5);
end
hold off;
axis([0,10,0,10]);
xlabel('X轴');
ylabel('Y轴');
title('点、线段及最短距离线段示意图');
legend('线段', '点', '最短距离线段', '最短距离点');
end
在上述程序中:
1. points_to_segments_distances 函数用于遍历每个点和每条线段,通过调用 point_to_segment_distance 函数来计算每个点到每条线段的最短距离,然后找出每个点对应的最短距离以及该距离对应的线段索引。
2. point_to_segment_distance 函数实现了计算单个点到单条线段的最短距离的功能,其原理是先求出点在线段上的投影,再根据投影计算出点到线段的最短距离。
3. plot_points_and_segments 函数负责具体的绘图操作,包括绘制线段、点以及每个点对应的最短距离线段,并添加了坐标轴标签、标题和图例等。
请注意,这里假设输入的点坐标数据格式是每行代表一个点的坐标,线段数据格式是每行代表一条线段的起点和终点坐标,你可以根据实际需求修改数据格式及相关代码细节。