精华内容
下载资源
问答
  • 记录下 java jts 求两个空间几何图形间最短距离,及最短距离间的两个坐标. 如:求一个点到一条直线的垂直坐标
  • [SD角度]=最短距离(O,V,Q); 求三个维度中两个向量 O 和 V 之间的最短(垂直)距离。 Q 是连接 O 和 V 的向量。还需要知道每个向量上的一个点来计算 Q (Q=Point1-Point2) SD 是函数返回的最短距离。 角度是两个向量...
  • 计算点到直线的最短距离,适用于地图坐标
  • 利用最短距离分类器进行分类,效果很好,首先进行裁剪样本,利用对比度信息进行裁剪
  • NULL 博文链接:https://xiangjinqi.iteye.com/blog/1637843
  • 计算给定起点和终点的两条线段之间的最短距离。 改编在 Dan Sunday 网站上找到的算法 ( http://softsurfer.com/Archive/algorithm_0106/algorithm_0106.htm#dist3D_Segment_to_Segment )。 用法:输入两条线段的...
  • 点与线段_线段与线段的最短距离,matlab代码。自编的function,便于嵌入使用
  • 该示例通过iiobjects .NET实现查询显示距点最近线对象的功能。
  • 用java写的查询地铁的最短路径,有界面,采用递归算法,可以查询指定起点到终点的距离以及线路,以及所有的线路之间的距离
  • 最短距离

    2015-07-04 14:11:09
    目前网络上电子地图的使用很普遍。利用电子地图可以很方便地确定从一个地点到另一个地点的路径。特别地,可确定在城市中的公交...你的任务:对给定的一个(无向)图G,及G中的两点s、t,计算从起点s到顶点t的最短距离
  • 实验四Floyd 算法 一实验目的 利用MATLAB 实现Floyd 算法可对输入的邻接距离矩阵计算图中任 意两点间的最短距离矩阵和路由矩阵且能查询任意两点间的最短距离 和路由 二实验原理 Floyd 算法适用于求解网络中的任意两...
  • 空间中2条线段的最短距离

    热门讨论 2013-02-07 15:06:54
    有讲解 有代码 根据数学公式直接改为代码!线段到线段的最短距离,点到线段的最短距离
  • 本文利用解析方法,求出了空间两线段的最短距离,文末附上了matlab程序。方法简单,可靠,程序复制粘贴后即可使用。良心之作! 求空间两线段的最短距离和求空间两直线的最短距离不同,直线可以无限延伸,而线段不能...

    在这里插入图片描述

    1 思路

      求空间两线段的最短距离和求空间两直线的最短距离不同,直线可以无限延伸,而线段不能。
      设空间中有两条线段 AB和 CD,设A点的坐标为 ( x 1 , y 1 , z 1 ) (x_1,y_1,z_1) (x1,y1,z1),B点的坐标为 ( x 2 , y 2 , z 2 ) (x_2,y_2,z_2) (x2,y2,z2), C点的坐标为 ( x 3 , y 3 , z 3 ) (x_3,y_3,z_3) (x3,y3,z3),D点的坐标为 ( x 4 , y 4 , z 4 ) (x_4,y_4,z_4) (x4,y4,z4)

      设P是直线AB上的一点,想象P点可以在直线AB上滑动,采用参数方程描述P点坐标。设P点坐标为 ( X , Y , Z ) (X,Y,Z) (X,Y,Z),则:
    { X = x 1 + s ( x 2 − x 1 ) Y = y 1 + s ( y 2 − y 1 ) Z = z 1 + s ( z 2 − z 1 ) \left\{\begin{array}{l} X=x_{1}+s\left(x_{2}-x_{1}\right) \\ Y=y_{1}+s\left(y_{2}-y_{1}\right) \\ Z=z_{1}+s\left(z_{2}-z_{1}\right) \end{array}\right. X=x1+s(x2x1)Y=y1+s(y2y1)Z=z1+s(z2z1)
      当 0 ≤ s ≤ 1 0 \leq s \leq 1 0s1时,P是线段AB上的点;当 s < 0 s<0 s<0时,P是BA延迟线上的点;当 s > 0 s>0 s>0时,P是AB延迟线上的点;

      同理可以设Q是直线CD上的点,设Q点坐标为 ( U , V , W ) (U,V,W) (U,V,W),则
    { U = x 3 + t ( x 4 − x 3 ) V = y 3 + t ( y 4 − y 3 ) W = z 3 + t ( z 4 − z 3 ) \left\{\begin{array}{l} U=x_{3}+t\left(x_{4}-x_{3}\right) \\ V=y_{3}+t\left(y_{4}-y_{3}\right) \\ W=z_{3}+t\left(z_{4}-z_{3}\right) \end{array}\right. U=x3+t(x4x3)V=y3+t(y4y3)W=z3+t(z4z3)
      当 0 ≤ t ≤ 1 0 \leq t \leq 1 0t1时,Q是线段CD上的点;当 t < 0 t<0 t<0时,Q是DC延迟线上的点;当 t > 0 t>0 t>0时,Q是CD延迟线上的点;

      那么P,Q之间的距离可以表示为:
    P Q = ( X − U ) 2 + ( Y − V ) 2 + ( Z − W ) 2 P Q=\sqrt{(X-U)^{2}+(Y-V)^{2}+(Z-W)^{2}} PQ=(XU)2+(YV)2+(ZW)2

    求两直线的最短距离,就是求PQ的最短距离。我们可以令:
    f ( s , t ) = P Q 2 = ( X − U ) 2 + ( Y − V ) 2 + ( Z − W ) 2 f(s, t)=P Q^{2}=(X-U)^{2}+(Y-V)^{2}+(Z-W)^{2} f(s,t)=PQ2=(XU)2+(YV)2+(ZW)2
      这样就把问题转为成了求 f ( s , t ) f(s, t) f(s,t)最小值的问题,我们知道函数极值问题可以通过求导,令导数为0的方法解决,对多元函数也是一样。
      对函数 f ( s , t ) f(s, t) f(s,t)求关于 s , t s,t s,t的偏导数,令偏导数为0,可以得到一个二元一次方程组。
    { ∂ f ( s , t ) ∂ s = 0 ∂ f ( s , t ) ∂ t = 0 \left\{\begin{array}{l} \frac{\partial f(s, t)}{\partial s}=0 \\ \frac{\partial f(s, t)}{\partial t}=0 \end{array}\right. {sf(s,t)=0tf(s,t)=0
      求解这个方程得到 s , t s,t s,t的值,若 s , t s,t s,t满足, 0 ≤ s ≤ 1 0 \leq s \leq 1 0s1 0 ≤ t ≤ 1 0 \leq t \leq 1 0t1,则P在线段AB上,Q在线段CD上。

      若 s , t s,t s,t不满足, 0 ≤ s ≤ 1 0 \leq s \leq 1 0s1 0 ≤ t ≤ 1 0 \leq t \leq 1 0t1时,举例说明。比如 s > 1 s>1 s>1,可以将问题转为求 s = 1 s=1 s=1时的P点到线段CD最短距离(这里大家想一想就明白了)。
      求点到线段的最短距离原理和上文类似。还是设Q为直线CD上的点,Q点坐标为 ( U , V , W ) (U,V,W) (U,V,W),则
    { U = x 3 + t ( x 4 − x 3 ) V = y 3 + t ( y 4 − y 3 ) W = z 3 + t ( z 4 − z 3 ) \left\{\begin{array}{l} U=x_{3}+t\left(x_{4}-x_{3}\right) \\ V=y_{3}+t\left(y_{4}-y_{3}\right) \\ W=z_{3}+t\left(z_{4}-z_{3}\right) \end{array}\right. U=x3+t(x4x3)V=y3+t(y4y3)W=z3+t(z4z3)
      求点到线段的最短距离,还是求PQ的最短距离,但此时只有一个变量 t t t,我们可以令:
    f ( t ) = P Q 2 = ( X − U ) 2 + ( Y − V ) 2 + ( Z − W ) 2 f(t)=P Q^{2}=(X-U)^{2}+(Y-V)^{2}+(Z-W)^{2} f(t)=PQ2=(XU)2+(YV)2+(ZW)2
      对 f ( t ) f(t) f(t)关于 t t t求导,并令导数等于0,求出 t t t。然后对 t t t进行判断就可以了。若 t > 1 t>1 t>1,令 t = 1 t=1 t=1;若 t < 0 t<0 t<0,令 t = 0 t=0 t=0。最后我们将 s , t s,t s,t的值代入
    P Q = ( X − U ) 2 + ( Y − V ) 2 + ( Z − W ) 2 P Q=\sqrt{(X-U)^{2}+(Y-V)^{2}+(Z-W)^{2}} PQ=(XU)2+(YV)2+(ZW)2
    就完事了!

    2 matlab代码

    对大家有帮助的话记得点个赞,收藏一下!!

    主函数

    %main.m
    A=[0 3 0];
    B=[3 3 0];
    C=[2 5 2];
    D=[5 5 4];
    %dis为线段AB、CD最短距离 
    [dis,P1,Q1,P2,Q2]=segmentDistance(A,B,C,D);
    %画线段AB
    plot3([A(1),B(1)],[A(2),B(2)],[A(3),B(3)],'r','LineWidth',2)
    hold on
    %画线段CD
    plot3([C(1),D(1)],[C(2),D(2)],[C(3),D(3)],'b','LineWidth',2)
    hold on
    %画直线AB、CD最短距离 
    plot3([P1(1),Q1(1)],[P1(2),Q1(2)],[P1(3),Q1(3)],'k--','LineWidth',1.5)
    hold on
    %画线段AB、CD最短距离 
    plot3([P2(1),Q2(1)],[P2(2),Q2(2)],[P2(3),Q2(3)],'c','LineWidth',1)
    xlabel('X')
    ylabel('Y')
    zlabel('Z')
    grid on
    

    两线段最短距离函数

    function [dis,P1,Q1,P2,Q2]=segmentDistance(A,B,C,D)
    %求两线段之间的最短距离
    %[dis,P1,Q1,P2,Q2]=segmentDistance(A,B,C,D)
    %A,B为第一条线段的首末端点 C,D为第二条线段的首末短线
    %dis为最短距离 P2 Q2为最短距离的首末端点
    %P1,Q1为直线AB、CD的最短距离首末端点
    %P2,Q2为线段AB、CD的最短距离首末端点
    
    syms s t
    %s取0~1时P点在线段AB上滑动,s>1 P点在B端点外,s<1 P点在A端点外
    P=A+s.*(B-A);
    %t取0~1时Q点在线段CD上滑动,t>1 Q点在D端点外,s<1 P点在C端点外
    Q=C+t.*(D-C);
    %求P点到Q点的距离的平方
    Fst=sum((P-Q).^2);
    %求偏导
    eqns(1)=(diff(Fst,s)==0);
    eqns(2)=(diff(Fst,t)==0);
    %解二元一次方程
    [s,t]=solve(eqns,s,t);
    P1=subs(P);
    Q1=subs(Q);
    %如果两线段最短距离不在线段上 进行判断
    if s>1
        s=1;
        [dis,P2,Q2]=pointSegmentDistance(C,D,subs(P));
    elseif s<0
        s=0;
        [dis,P2,Q2]=pointSegmentDistance(C,D,subs(P));
    elseif t>1
        t=1;
        [dis,P2,Q2]=pointSegmentDistance(A,B,subs(Q));
    elseif t<0
        t=0;
        [dis,P2,Q2]=pointSegmentDistance(A,B,subs(Q));
    else
        dis=norm(subs(P)-subs(Q));
        P2=P1;
        Q2=Q1;
    end
    end
    

    点到线段最短距离函数

    function [dis,P2,Q2]=pointSegmentDistance(A,B,C)
    %求空间一点到一线段的最短距离 
    %[dis,P2,Q2]=pointSegmentDistance(A,B,C)
    %A B为线段首末端点,C为空间一点
    %dis为最短距离 P2 Q2为最短距离的首末端点
    
    syms s
    %s取0~1时P点在线段AB上滑动,s>1 P点在B端点外,s<1 P点在A端点外
    P=A+s.*(B-A);
    Fs=sum((P-C).^2);
    eqns=(diff(Fs,s)==0);
    s=solve(eqns,s);
    if s>1
        s=1;
        dis=norm(subs(P)-C);
    elseif s<0
        s=0;
        dis=norm(subs(P)-C);
    else
        dis=norm(subs(P)-C);
    end
    P2=subs(P);
    Q2=C;
    end
    
    展开全文
  • 能够自动生成迷宫并且显示,可以计算最短步数,以及其他一些走法,牵扯大部分基本的C++知识和一些数据结构问题范例
  • arcgis中求点与点、点与线之间的最短距离,路径分析,
  • 点到指定Bezier曲线的最短距离

    千次阅读 2020-07-17 19:20:08
    点到指定Bezier曲线的最短距离   Bezier曲线本质上是一个多项式。   三次曲线Q: Q(u)=(1−u)3P0+3(1−u)2uP1+3(1−u)u2P2+u3P3=nu3+ru2+su+v \begin{aligned} Q(u) &= (1-u)^3P_0+3(1-u)^2uP_1+3(1-u...

    点到指定Bezier曲线的最短距离

     
    Bezier曲线本质上是一个多项式。
     
    三次曲线Q:
    Q ( u ) = ( 1 − u ) 3 P 0 + 3 ( 1 − u ) 2 u P 1 + 3 ( 1 − u ) u 2 P 2 + u 3 P 3 = n u 3 + r u 2 + s u + v \begin{aligned} Q(u) &= (1-u)^3P_0+3(1-u)^2uP_1+3(1-u)u^2P_2+u^3P_3\\ &=nu^3+ru^2+su+v \end{aligned} Q(u)=(1u)3P0+3(1u)2uP1+3(1u)u2P2+u3P3=nu3+ru2+su+v

     
    点P到曲线Q的距离D(u):
    D ( u ) = ∣ Q ( u ) − P ∣ 2 = ( Q x − P x ) 2 + ( Q y − P y ) 2 + ( Q z − P z ) 2 ( 1 ) D(u)=|Q(u)-P|^2=(Q_x-P_x)^2+(Q_y-P_y)^2+(Q_z-P_z)^2 \quad (1) D(u)=Q(u)P2=(QxPx)2+(QyPy)2+(QzPz)2(1)
     
    求最短距离,即最小值优化问题:
    D 2 ( u ) m i n = m i n D 2 ( u ) 0 ≤ u ≤ 1 ( 2 ) D^2(u)_{min}=min{\quad D^2(u)} \quad 0\le u\le 1\quad(2) D2(u)min=minD2(u)0u1(2)

     

    二分区间法求解

     

    算法流程:

     

    1.分别计算点P到数据点Pi (i=0,1,2,3)的距离,取最小距离对应点位Pj
    
    2.取Pj对应的节点ui为初始节点
    
    3.选取合适的区间值 interval
    
    4.根据式(1),计算节点 ui+interval,ui-interval,ui处的距离 d1,d2,d0
    
    5.如果d1或者d2小于d0,将ui的值更改为ui+interval或ui-interval
    
    6.如果d1、d2都大于d0,将区间interval减半为interval/2
    
    7.重复以上步骤,直到d1 d2 d0之间的差值满足设置的精度
    

     

    Python仿真结果

    在这里插入图片描述

    图中,

    黑色点位为给定的点位P;

    红色点位为曲线Q(u)上距离P最近的点Pmin;

    黑色线为P到曲线Q的距离D(u);

    红色线为拟合的Bezier曲线Q(u);

    黑色点的y坐标不变,横坐标不断向右移动。由动图可见,计算得到的Pmin始终跟随D(u)的最小距离位置,

    最短距离点计算成功!

     

    牛顿迭代法求解

     
    由数学知识可知,为求解式(2),即求解式(1)在区间[0,1]的极小值,此问题即转化为求极值问题。
     
    式(1)的极值即出现在其导数值为0的点,其导数为:
    D ′ ( u ) = 2 ( Q x − P x ) Q x ′ + 2 ( Q y − P y ) Q y ′ + 2 ( Q z − P z ) Q z ′ = 0 ( 3 ) f ( u ) = ( Q x − P x ) Q x ′ + ( Q y − P y ) Q y ′ + ( Q z − P z ) Q z ′ f ′ ( u ) = Q x ′ 2 + ( Q x − P x ) Q x ′ ′ + Q y ′ 2 + ( Q y − P y ) Q y ′ ′ + Q z ′ 2 + ( Q z − P z ) Q z ′ ′ D^{'}(u)=2(Q_x-P_x)Q^{'}_x+2(Q_y-P_y)Q^{'}_y+2(Q_z-P_z)Q^{'}_z=0 \quad (3)\\ f(u) = (Q_x-P_x)Q^{'}_x+(Q_y-P_y)Q^{'}_y+(Q_z-P_z)Q^{'}_z\\ f^{'}(u)=Q_x^{'2}+(Q_x-P_x)Q^{''}_x+Q_y^{'2}+(Q_y-P_y)Q^{''}_y+Q_z^{'2}+(Q_z-P_z)Q^{''}_z D(u)=2(QxPx)Qx+2(QyPy)Qy+2(QzPz)Qz=0(3)f(u)=(QxPx)Qx+(QyPy)Qy+(QzPz)Qzf(u)=Qx2+(QxPx)Qx+Qy2+(QyPy)Qy+Qz2+(QzPz)Qz
     
    求解式子(3),可以使用牛顿迭代公式求解:
    u k + 1 = u k − f ( u ) f ′ ( u ) ( 4 ) u_{k+1}=u_k-\frac{f(u)}{f^{'}(u)} \quad (4) uk+1=ukf(u)f(u)(4)

     
    牛顿迭代公式求解速度很快,但是对初值的选取比较敏感,如果初值选取的不好,有可能出现无解的情况。

     
    二分区间法求解求解比较稳定,但是其速度比较慢。有一种思路是将二分区间法和牛顿迭代法结合,先计算一个粗略的初始值,再用二分区间法求解求解比较稳定,但是其速度比较慢。有一种思路是将二分区间法和牛顿迭代法结合,先计算一个粗略的初始值,再用牛顿迭代法求解,以加快算法速度。

    展开全文
  • 最短路径-任意两点间最短距离-Floyd算法的matlab实现(详细教程) 目录 简介 核心思路 优缺点分析 算法过程 简介 Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的...

    目录

    简介

    核心思路

    优缺点分析

    算法过程

             示例


    简介

    Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。

    核心思路

    路径矩阵

    通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 [3] 

    从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。

    采用松弛技术(松弛操作),对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n^3);

    状态转移方程

    状态转移方程如下: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]};

    map[i,j]表示i到j的最短距离,K是穷举i,j的断点,map[n,n]初值应该为0,或者按照题目意思来做。

    当然,如果这条路没有通的话,还必须特殊处理,比如没有map[i,k]这条路。

    优缺点分析

    编辑 语音

    Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路径),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法,也要高于执行|V|次SPFA算法

    优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。

    缺点:时间复杂度比较高,不适合计算大量数据

    算法过程

     在Floyd算中一般会用到有两个矩阵,一个距离矩阵D一个路由矩阵R,顾名思义距离矩阵D是用来储存任意两点之间的距离的,而路由矩阵则是用来记录任意两点之间的路径关系。  

    Floyd算法的原理是:对于每一对顶点 i 和 j,看看是否存在一个顶点 w 使得从 i 到 w 再到 j 比已知的路径更短。如果是更新它。

    把图用邻接矩阵r表示出来,如果从Vi到Vj有路可达,则D[i,j]=d(在矩阵D中为具体的数字),d表示该路的长度;否则D[i,j]=无穷大(在矩阵D中用“inf“表示)。定义一个矩阵D用来记录所插入点的信息,R[I,j]表示从Vi到Vj需要经过的点,初始化R[i,j]=j(即先默认i到j是通的)。把各个顶点插入图中,比较插点后的距离与原来的距离,假设插入的中间点为k,D[i,j] > D[i,k]+D[k,j] ),此时证明从i点经过k点再到j点比原来的要短,所以此时要更新D[i,j],则D[i,j]=D[I,k]+[k,j],同时此时R[i,j]=k。在R中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。

    可能有些人对路由矩阵R不是很明白,其实路由矩阵R很好理解,我来举个例子,

    比如,要寻找从V5到V1的路径。根据R,假如 R(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果R(5,3)=3,说明V5与V3直接相连,如果R(3,1)=1,说明V3与V1直接相连。

    因此,我们在定义路由矩阵R时,先要初始化矩阵(即先默认任意两点是相互相通的),即每列上的数等于该列的列序数。

    例:

    V1V2V3V4  ****Vn
    V11234****n
    V21234****n
    V31234****n
    V41234****n
    ****1234****n
    Vn1234****n


    示例

    下面我将用一个简单的例子来说明,下面是一个简单的例子:

    问题:求出任意两点间的最短距离及其路径?

    我们此时可以写出距离矩阵D和路由矩阵R如下:

     

    这样我们就定义好了距离矩阵路由矩阵,现在我们再来假设图中任意两点之间都要经V5这个点中转。算出经过中转后的两点之间的距离,然后我们再来判断任意两点之间的最短距离。
    (1)先从V5开始,先让V5成为中转点。

    V5由V5中转,那么V5到到各个点的距离还是不变。

    V4可以经由V5中转,那么这个时候判断一下中转前和中转后的距离大小,将最小距离留存下来如:

    V4>V3 经V5中转,原来V4->V3 = inf,经由V5中转之后V4->V5->V3 = 17, 于是V4到V3的最短距离变化为17,更新距离矩阵D(4,3)=17,更新路由矩阵R(4,3) = R(4,5) = 5

    V1、V2、V3没有到达V5的路径,所以也就不存在从V5中转的情况,所以V1、V2、V3到各个点的距离还是不变。

    这时两个矩阵变化为

     

    (2)再让V4成为中转点。

    V5  V1 都没有到达V4的路径,所以也就不存在从V5中转的情况,所以V5 V1 到各个点的距离还是不变。

    V2>V5 经V4中转,原来V2->V5 = inf,经由V4中转之后V2->V4->V5 = 15, 于是V2到V5的最短距离变化为15,更新距离矩阵D(2,5)=15,更新路由矩阵R(2,5) = R(2,4) = 4

    V3>V2经V4中转,原来V3->V2= inf,经由V4中转之后V3->V4->V2 = 5, 于是V3到V2的最短距离变化为5,更新距离矩阵D(3,2)=5,更新路由矩阵R(3,2) = R(3,4) = 4

    V3>V5 经V4中转,原来V3->V5 = 6,经由V4中转之后V3>V4->V5 = 11, 因此V3到V5的最短距离仍为6,不更新。

    这时两个矩阵变化为

     (3)同理,让所有的点都成为一次中转点

    用Matlab来表示上面的过程,其代码为:

    (1)先建立一个.m文件


    function [d,r]=floyd(a)
    n=size(a,1);%测出a矩阵的行数
    d=a;% 初始化距离矩阵
    for i=1:n % 初始化路由矩阵
        for j=1:n
            r(i,j)=j;%使路由矩阵r形成初始矩阵(每一列上的数为该列的列序数,例:第3列上的数全为3)(上面有提到)
        end 
    end 
    r;
    
    for k=1:n % 开始Floyd算法(用if语句来比较中转前后的大小)
        for i=1:n
            for j=1:n
                if d(i,k)+d(k,j)<d(i,j)%需要更新的条件(也就是中转后比原来要小)
                    d(i,j)=d(i,k)+d(k,j);
                    r(i,j)=r(i,k);
                end 
            end 
        end
        k;
        d;
        r;

     (2)在命令行输入矩阵a,也就是距离矩阵

    > a=[0 inf 5 inf inf;
          4 0 inf 6 inf ;
          inf inf 0 2 6;
         inf 3 inf 0 9;
         inf inf 8 inf 0];
    >> [d,r]=floyd(a)

    (3)得出距离矩阵D和路由矩阵R 

    (4)怎么通过得出的这两个矩阵看任意一点到任意一点的最短距离及其路径。

    从任意一点到任意一点从矩阵d中就很容易看出来了,比如D(2,3)=9,就表示V2到V3的最短距离是9,因此两点的距离从矩阵中很容易看出,我就不过多解释了。

    现在我重点来说一下怎么看路由矩阵:

    举个例子:v4->V3

    从距离矩阵中可以看出V4->V3的最短距离是D(4,3) = 12;根据其路由矩阵我们可以看出:

    R(4,3) = 2,表示V4->V3,先经过V2,于是再看R(2,3) = 1,表示还需要再经过V1,于是我们看R(1,3) = 3,这个时候我们发现终于到了V3,所以我们梳理一下,V4->V3的最短路径是:V4->V2->V1->V3。简言之就是固定列,根据路由矩阵在行中跳转,直到跳转到对应的点。

    再来个例子:v5->V2

    从距离矩阵中可以看出V5->V2的最短距离是D(5,2) = 13;根据其路由矩阵我们可以看出:

    R(5,2) = 3,表示V5->V2,先经过V3,于是再看R(3,2) = 4,表示还需要再经过V4,于是我们看R(4,2) = 2,这个时候我们发现终于到了V2,所以V5->V2的最短路径是:V4->V2->V1->V3。

    此时我们已经拿到了我们最开始想要的结果了!!!

    展开全文
  • 点到多边形的最短距离(定义+原理+MATALB代码)

    0.引言

    \qquad 点与多边形的关系无非三种——内部、上、外部。本文定义点在多边形内部距离为负,点在多边形边上距离为0,到多边形外部距离为正。

    1.原理

    计算点到多边形的距离分为3个步骤:

    1. 判断点与多边形的关系
    2. 计算点到多边形每条边的最短距离
    3. 得到最终的距离标量(含符号)

    关于原理方面,由于以下链接已经讲解地非常完美,本文不再摘录:
    求点到多边形的距离
    需要提醒读者的是,该文中存在部分笔误的情况(但原理部分比较通俗易懂),例如
    笔误
    蓝线处应为d[0]-a[0],d[1]-a[0]

    2.代码及实用教程

    function minD = dis2poly(p,poly)
    % 计算点p到多边形poly的最短距离
    % poly的每一行都是一条边
        if inpolygon(p(1),p(2),poly(:,1),poly(:,2))
            k = -1; % 内部为负
        else
            k = 1;  % 外部为正
        end
        minD = Inf;
        for i = 1:size(poly,1)-1  % 边序号
            D = dis2edge(p,poly(i,:)',poly(i+1,:)');
            if D < minD
                minD = D;
            end
        end
        minD = k*minD;
        function d = dis2edge(P,A,B)
           % P为计算点,A、B为边的两个顶点 
           % 三者均为列向量
           AB = B-A;
           AP = P-A;
           BP = P-B;
           t = (AB'*AP)/(AB'*AB);
           if t<0
               d = norm(AP); 
           elseif 0<=t && t<=1
               d = norm(P-t*AB);
           else
               d = norm(BP);
           end
        end
    end
    

    \qquad 输入多边形时,需要多边形是封闭的(即第一个点与最后一个点相同),否则MATLAB的判定点是否在多边形内部的函数inpolygon会返回意料之外的结果。以下是2个计算示例:

    >> clear
    >> poly = [0,0;0,1;1,1;1,0];
    >> P = [2;2];
    >> dis2poly(P,poly)
    
    ans =
    
         1.4142
    

    点到多边形距离
    从上图也可以看出显然最短距离是 2 \sqrt2 2

    >> clear
    >> poly = [0,0;0,1;1,1;1,0];
    >> P = [0.5;0.5];
    >> dis2poly(P,poly)
    
    ans =
    
         -0.5000
    

    d
    点在多边形内部,很显然最短距离为0.5,符号为负。

    展开全文
  • * 使用带权无向邻接矩阵求两个城市之间的最短距离,城市的代码从1开始到N * 输入:邻接矩阵的大小(城市个数N),空格隔开。 * 换行,输入邻接矩阵,对于不相邻的城市,用 ∞(无穷大)表示 * 换行 输入城市代号 ...
  • d - 两条线之间的最短距离Pc,Qc - 存在最短距离 d 的点 例子: L1=rand(2,3); L2=rand(2,3); [d Pc Qc]=distBW2lines(L1,L2) 线 L1、L2 和最短距离线的功能可以在 3d 中绘制或在 2D 中进行微小的更改从文件末尾的...
  • 目录0. 最短路径1. 准备工作数据准备(以湖北...打开属性表2.1.4 导出湖北省的边界2.1.5 导出地级市边界2.2 创建网络数据集2.2.1 创建文件数据库2.2.2 导入要素类2.2.3 创建网络数据集2.3 计算城市间网络距离2.3.1 打开
  • C++ 两点之间最短距离

    千次阅读 2020-10-05 14:27:39
    两点之间最短距离 这是我的一个测试,也是我学习html的起点,他们说一个合格的程序员必须学会html,我比他们起步晚了一些,可是我认为还来的及,以后我就用html来记录我的学习记录了。 问题的提出...
  • 两个数组最短距离

    2019-11-28 15:59:47
    有两个已排序整形数组A,B,求A中元素到B中元素最短距离。 class ArrayMinimumDistance { // 数组长度都不为空 public int minDistance(int[] a, int b[]) { int min = a[0] - b[0]; for (int i = 0, j = 0; i...
  • 计算点到线段的最短距离

    热门讨论 2013-04-09 17:42:49
    这个计算点到线段最短距离算法是先计算线段上距离点最近的点,然后求出 2...在计算用户到当前位置到某条公路的最短距离等实际情况中,可以先用这个算法,然后根据结果坐标使用 CLLocation 类的函数计算实际距离 VC6工程
  • 给定平面上的至少n个点(n〉=20),找出其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小。
  • 蜂窝最短距离

    2014-03-04 23:26:47
    最短距离
  • (1)与弗洛伊德(Floyd)算法一样,迪杰斯特拉(Dijkstra)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,主要 特点是以出发点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止 2. 迪杰...
  • 代码实现 求点到线段的最短距离

    千次阅读 2019-05-30 16:22:07
    点到线段最短距离的运算与点到直线的最短距离的运算二者之间存在一定的差别,即求点到线段最短距离时需要考虑参考点在沿线段方向的投影点是否在线段上,若在线段上才可采用点到直线距离公式,如图1所示。 1、方法...
  • 点到线段最短距离的运算与点到直线的最短距离的运算二者之间存在一定的差别,即求点到线段最短距离时需要考虑参考点在沿线段方向的投影点是否在线段上,若在线段上才可采用点到直线距离公式,如图1所示。+ 图1(a...
  • 该函数实现了 Vladimir J. LUMELSKY,“线段之间距离的快速... 用于计算两条线段之间的最短距离。 它也处理所有退化情况(当线平行时,一条线是一个点,两条线都是点)。 或者,该函数可以返回线段上最近的两个点。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 118,225
精华内容 47,290
关键字:

最短距离