(不废话上完整程序)matlab中处理多个坐标点和多条线段的最短距离。

 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 函数负责具体的绘图操作,包括绘制线段、点以及每个点对应的最短距离线段,并添加了坐标轴标签、标题和图例等。
请注意,这里假设输入的点坐标数据格式是每行代表一个点的坐标,线段数据格式是每行代表一条线段的起点和终点坐标,你可以根据实际需求修改数据格式及相关代码细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值