精华内容
下载资源
问答
  • 【寒江雪】直线最短距离

    千次阅读 2018-07-17 16:21:11
    ​ 根据直线的表示方式p = at + b,可以设一个点P(px,py),任意一点A(x0,y0)到点P的距离可以根据两点距离公式求出。 D^2 = (px-x0)^2+(py-y0)^2 = (axt+bx-x0)^2+(ayt+by-y0)^2 = (ax^2+ay^2)t^2 + 2{...

    点到直线的最短距离

    ​ 根据直线的表示方式p = at + b,可以设一个点P(px,py),任意一点A(x0,y0)到点P的距离可以根据两点间距离公式求出。

    D^2 = (px-x0)^2+(py-y0)^2

    = (axt+bx-x0)^2+(ayt+by-y0)^2

    = (ax^2+ay^2)t^2 + 2{ax(bx-x0)+ay(by-x0)}t+(x0^2+y0^2)

    ​ 然后根据对表达式求二阶导数,可以证明该函数存在最小值。

    ​ 令一阶导数等于零可以求得取最小值时,t的取值。将t带入可以计算出最短距离的平方。最后算得

    t = {ax(x0-bx)+ay(y0-by)}/(ax^2+ay^2)

    点到线段的最短距离

    ​ 根据点到直线的距离的计算方式,把线段看成是直线,最后计算出t,然后根据t的值将t缩小到[0,1]之间。

    if t < 0
    than t = 0
    if t > 1
    than t = 1

    ​ 这样就可以计算点到线段的最短距离了。

    展开全文
  • 天做开发的时候,有个小伙伴问我怎么计算直线最短距离,看样子困扰了他挺久,所以借这个机会吧这个问题记录下来,让更多小伙伴能涨一下姿势。 先看图:已知条件如下,p1、p2、target三个,求红色线段的...

    写在前面

    这两天做开发的时候,有个小伙伴问我怎么计算点到直线的最短距离,看样子困扰了他挺久,所以借这个机会吧这个问题记录下来,让更多小伙伴能涨一下姿势。

    先看图:已知条件如下,p1、p2、target三个点,求红色线段的距离。

    解题思路

    思路1:向量投影法

    这个方法核心问题是计算出target到p12向量上距离最短的点,然后通过Vector3.Distance方法计算得出最短距离。

    那么如何找到这个点呢?这里,我用了向量投影。

    1.先计算出target到p1的向量(蓝色线段)

    2.再计算出p2到p1的向量(绿色线段)

    3.通过Vector3.Project方法,计算出蓝色线段在绿色线段上的投影,这个投影就是p1F向量

    4.将计算出来的投影向量再加上p1点的坐标,即使F点的坐标。

    5.最后Vector3.Distance(target,F)即可计算出距离

    代码如下:

        /// <summary>
        /// 向量投影法
        /// </summary>
        public void ProjectFunc(Vector3 p1, Vector3 p2, Vector3 target)
        {
            //p1->p2的向量
            Vector3 p1_2 = p2 - p1;
            //p1->target向量
            Vector3 p1_target = target - p1;
            //计算投影p1->f
            Vector3 p1f = Vector3.Project(p1_target, p1_2);
            //加上p1坐标 然后计算距离
            float distance = Vector3.Distance(target, p1f + p1);
            Debug.Log("向量投影法:" + distance);
        }

    思路2:三角函数法

    这个方法,就是通过Sin(夹角)*斜边长度计算直角边的距离

    1.先计算出target到p1的向量(蓝色线段)

    2.再计算出p2到p1的向量(绿色线段)

    3.计算前面两个向量的夹角Vector3.Angle(p1_2, p1_target);

    4.获取斜边长度(蓝色线段)

    5.通过Sin函数*斜边长度计算出距离

    代码如下:

        /// <summary>
        /// 三角函数
        /// </summary>
        public void TriangleFunc(Vector3 p1, Vector3 p2, Vector3 target)
        {
            //p1->p2的向量
            Vector3 p1_2 = p2 - p1;
            //p1->target向量
            Vector3 p1_target = target - p1;
            //前面两个向量的夹角
            float angle = Vector3.Angle(p1_2, p1_target);
            //获取斜边的长度
            float distance_p1_target = p1_target.magnitude;
            //Sin函数计算距离
            float distance = Mathf.Sin(angle * Mathf.Deg2Rad) * distance_p1_target;
            Debug.Log("三角函数法:" + distance);
        }

    思路3:面积法

    这个方法主要是通过平行四边形面积公式来计算出该距离 底 * 高 = 面积

    现在我们知道了一条底边的长度(绿色线段),还差面积不知道

    这里通过向量叉乘,获取叉乘结果的模就可以(叉乘出来的结果是个向量,向量的长度即为两个叉乘向量所形成的平行四边形的面积)

    1.先计算出target到p1的向量(蓝色线段)

    2.再计算出p2到p1的向量(绿色线段)

    3.两个向量叉乘,获取的结果取长度,即为平行四边形的面积

    4.然后 高 = 面积 / 底 得出距离

    代码如下:

        /// <summary>
        /// 叉乘面积
        /// </summary>
        public void CrossAreaFunc(Vector3 p1, Vector3 p2, Vector3 target)
        {
            //p1->p2的向量
            Vector3 p1_2 = p2 - p1;
            //p1->target向量
            Vector3 p1_target = target - p1;
            //两个向量叉乘结果取长度 用做面积
            float area = Vector3.Cross(p1_2, p1_target).magnitude;
            //面积/底边计算出高度
            float distance = area / p1_2.magnitude;
            Debug.Log("叉乘面积法:" + distance);
        }

    最后

    这里展示了三种获取点到线的最短距离的方式方法,运行结果也都一致,这里做一个记录,希望能帮助到需要帮助的小伙伴。

     

    展开全文
  • 直线的信息可以以个端点的形式给出,也可以以一个直线上的直线的方向向量给出。本文中假设这直线不...求两直线最短距离直线l0我们可以用方程表示为:  (1) 直线段l1我们也可以用方程表示为:  

    直线的信息可以以两个端点的形式给出,也可以以一个直线上的点和直线的方向向量给出。本文中假设这两条直线不共线,即这两条直线既不重合也不相交。

    1.如果这两条直线是以两个端点的形式给出,那么假设直线l0的两端点为:P0、P1;直线l1的两端点为Q0、Q1,;求两直线的最短距离?

    直线l0我们可以用方程表示为:

            (1)

    直线段l1我们也可以用方程表示为:

                (2)

    式中,P、Q分别表示两直线段上的点。

    那么点P和点Q的距离为:

    (3)

    我们将(3)式等式两边平方得到:

                   (4)

    那么求解这两条空间直线段的最短距离就变成了一个求解最小二乘法的最小值问题了,即求解方程:

          (5)

    那么这个方程怎么求解呢?下面我们来求解(5)式:由式(1)和式(2)我们有:

    (6)

    将(6)式带入(5)式有:

                (7)

    那么就变为求解超静定方程:     (8)

    我们将(8)式变形得到求解超静定方程:

               (9)

    令A=(P0-P1,Q0-Q1),x=(a,-n)T,b=Q1-P1;则式(9)变为:

                     (10)

    两边同时乘以矩阵A的装置得到:

                    (11)

    则x可以求解得到:

                (12)

    求解得到a和n之后带入式(6)就可以求解得到点P和点Q了,然后代入式(3)就可以求解得到最小距离了。

    2.如果这两条直线是以直线上的点和该直线的方向向量给出,那么假设直线l0上有一点P0,它的方向向量为n;直线l1上有一点Q0,它的方向向量为m;那么直线l0上的点可以表示为:

    (13)

    直线l1上的点可以表示为:

     (14)

    点P和点Q的距离为:

     (15)

    将式(13)和式(14)带入式(15)得到:

    (16)

    两边平方得到:

    (17)

    那么求解两条直线的最短距离,就变为了求解式(17)的最小二乘方程组,即:

       (18)

    变形得到:

     (19)

    同理,令A=(n,m),x=(a,-b)T,b=Q0-P0,则(19)式变为:

    (20)

    同理求得x为:

        (21)

    求得a,b之后带入式(13)和式(14)就可以求得点P和点Q,根据式(15)就可以求得最短距离了。

    展开全文
  • 变分法证明两点之间线段最短

    万次阅读 2019-01-08 16:27:33
    在Part 2., 我们会以用这次介绍的内容和上述方程解决两点之间直线最短的问题为开头,继续介绍变分法。 ----------------------------------------------------------------------------------------------------...

    传送门https://zhuanlan.zhihu.com/yueaptx

    变分法简介Part 1.(Calculus of Variations)

    Dr.Stein

    Dr.Stein

    计算力学

    ​关注他

    283 人赞了该文章

    1. 泛函数 (Functionals)

     

    简而言之,泛函数是函数的函数,即它的输入是函数,输出是实数。而这个输出值取决于一个或多个函数(输入)在一整个路径上的积分而非像一般函数一样取决于离散的变量。这样说可能还是比较抽象,不过坚持看到下文的Example 1就可以更好理解了。

    通常在变分法中,泛函数是一个积分,记做I

    I(y)=\int_{x1}^{x2}Fdx

    其中我们想要通过选择被积函数F来最大化或最小化泛函数I的值。同时我们称F为拉格朗日函数(Lagrange function)。F可以是函数y(x)y(x)各阶导数的函数(以下y(x)均简写成y)。为了说明方便,我们先姑且设Fyy'的函数,所以我们可以进一步将泛函数I写成:

    I(y)=\int_{x1}^{x2}F(y,y';x)dx

    积分里面我用分号;将x和前面的y隔开代表yy'x的函数。一般Fy的函数关系是已知的,所以想要最大或最小化泛函数,实际上是通过选择适当的函数y(x)

    为了透彻理解这个概念,我们可以来看一个简单的例子。

    Example 1.

    一个最简单直观的例子是求两个固定点之间的最短路径。当然大家都知道两点之间直线最短,这里可以用变分法做出解释。

    如上图所示路径是一任意路径,我们取区中一小段微元ds,可以容易计算微元断的长度为:

    ds^2=dx^2+dy^2=[1+(y')^2]dx^2,即:

    ds=\sqrt{1+(y')^2}dx

    积分得到总的路径长度为:

    L=\int_{x1}^{x2}ds=\int_{x1}^{x2}\sqrt{1+(y')^2}dx

    这个例子中,L是泛函数,\sqrt{1+(y')^2}是拉格朗日函数F,我们想要找一个函数y(x)使得泛函数L的值最小。这次Part 1.的任务就是为解决这个问题做准备。Part 2.中我们会用变分法证明这个y(x)确实是直线的方程。

    2. 泛函数的极值

     

    这里重申下,泛函数I在区间[x_1,x_2]上的值取决于积分路径的选择,即取决于函数y(x)的选择。我们有理由假设存在一个这样的y(x),可以使得泛函数I取到极值。而在这个y(x)附近的任意路径我们记做\tilde{y}(x)。另外,我们假设y(x)两阶可微。通过引入一个微小量\epsilon\ll 1和一个任意可微函数\eta(x),我们可以用y(x)表示\tilde{y}(x):

    \tilde{y}(x)=y(x)+\epsilon\eta(x)

    这样做的好处是对于一个给定的\eta(x),我们可以通过改变\epsilon的值来得到无穷多的路径,同时对于任何\eta(x),当\epsilon=0的时候,\tilde{y}(x)y(x)重合。

    图像直观表示如下图:

    由于在边界条件的限制,\eta(x_1)=\eta(x_2)=0。这样就能保证\tilde{y}(x)可以通过两个固定端点。

    这时我们可以说,y(x)所对应的泛函数I的值是泛函数\tilde{I}=\int_{x_1}^{x_2}F(\tilde{y},\tilde{y}';x)dx的极值。我们可以进一步用\epsilon表示\tilde{I}

    \tilde{I}=\int_{x_1}^{x_2}F(\tilde{y},\tilde{y}';x)dx=\int_{x1}^{x_2}F(y+\epsilon\eta,y'+\epsilon\eta';x)dx

    虽然y(x)未知,但是根据之前的合理假设,y(x)是一个存在的确定函数。所以根据上式,如果给定一个特定的\eta(x)\tilde{I}的变化只取决于\epsilon的变化。所以我们现在可以把\tilde{I}看做是\epsilon的函数。用泰勒展开公式将\tilde{I}\epsilon=0处展开得到:

    \tilde{I}(\epsilon)=\tilde{I}|_{\epsilon=0}+(\frac{d\tilde{I}}{d\epsilon})\Big|_{\epsilon=0}\cdot\epsilon+ (\frac{d^2\tilde{I}}{d\epsilon^2})\Big|_{\epsilon=0}\cdot\frac{\epsilon^2}{2!} +\cdot \cdot \cdot =\tilde{I}_0+\tilde{I}_1\epsilon+\tilde{I}_2\epsilon^2+\cdot \cdot \cdot

    很明显,当\epsilon=0时,\tilde{I}|_{\epsilon=0}=I,带入上式可得到:

    \tilde{I}-I=\tilde{I}_1\epsilon+\tilde{I}_2\epsilon^2+\cdot \cdot \cdot

    这里我们记\delta I=\tilde{I}_1\epsilon=\frac{d\tilde{I}}{d\epsilon}\Big|_{\epsilon=0}\cdot\epsilon,并称之为一阶变分。同理二阶变分为\delta I^2=\tilde{I}_2\epsilon^2

    (这里插一句变分和微分的区别。变分在上图的直观解释是\tilde{y}y在竖直方向上的距离,称之为\delta y,所以这个差是在同一个x上计算的。而微分则是由于x的微小变动引起的y的变动。)

    然后我们可以类比求函数极值时的做法。求函数极值时,我们会令函数的一阶导数为零。这里同样,为了求泛函数\tilde{I}的极值,我们令一阶变分\delta I=0。现在我们计算化简\delta I:

    \delta I=(\int_{x_1}^{x_2}\frac{d\tilde{F}}{d\epsilon}\Big|_{\epsilon=0} dx)\cdot\epsilon
    \frac{d\tilde{F}}{d\epsilon}\Big|_{\epsilon=0} \cdot\epsilon=(\frac{\partial\tilde{F}}{\partial\tilde{y}}\cdot\frac{d\tilde{y}}{d\epsilon}+  \frac{\partial\tilde{F}}{\partial\tilde{y'}}\cdot\frac{d\tilde{y'}}{d\epsilon})\Big|_{\epsilon=0}\cdot\epsilon

    因为 \tilde{y}(x)=y(x)+\epsilon\eta(x), 不难得到:\frac{d\tilde{y}}{d\epsilon}=\eta,\frac{d\tilde{y'}}{d\epsilon}=\eta',另外我们有\delta y=\epsilon \eta,\delta y'=\epsilon\eta'

    又因为当\epsilon\rightarrow 0时,\tilde{F}\rightarrow 0, \tilde{y}\rightarrow y,\tilde{y}'\rightarrow y',将这些式子带入原式可以得到:

    \delta I=\int_{x_1}^{x_2}(\frac{\partial F}{\partial y}\delta y+\frac{\partial F}{\partial y'}\delta y')dx

    终于到最后一步啦,分部积分一下得到:

    \delta I=\int_{x_1}^{x_2}(\frac{\partial F}{\partial y}-\frac{d}{dx}(\frac{\partial F}{\partial y'} ))\delta ydx+\frac{\partial F}{\partial y'}\delta y\Big|_{x_1}^{x_2}

    \delta I=0就可以解得最小化泛函数的y啦。我们注意到\delta I有两个部分。对于第一个积分部分,由于\delta y是任意的,所以要想使这个部分等于零,需要保证^{[1]}

    \frac{\partial F}{\partial y}-\frac{d}{dx}(\frac{\partial F}{\partial y'} )=0 (x_1\leq x\leq x_2)

    这就是传说中的欧拉-拉格朗日方程(E-L equation)。

    而第二部分等于零则是边界条件。

    在Part 2., 我们会以用这次介绍的内容和上述方程解决两点之间直线最短的问题为开头,继续介绍变分法。

    ---------------------------------------------------------------------------------------------------------------------------

    注[1]:

    假设x_1x_2是给定的常数,\phi(x)是一个特定的在x_1\leq x\leq x_2上连续的函数,那么如果对于任意连续可微的函数\eta(x)都成立\int_{x_1}^{x_2}\phi(x)\eta(x)dx=0,则\phi(x)=0 (x_1\leq x\leq x_2)。

    (任意函数和一个非零的特定函数的乘积仍是任意函数,由于无法保证任意函数的积分是零,所以这个特定函数必须在这个区间上恒等于零使得乘积为零,这样可以保证积分为零。)

    展开全文
  • 记录下 java jts 求个空间几何图形间最短距离,及最短距离间的个坐标. 如:求一个到一条直线的垂直坐标
  • 两点之间直线最短”,两千多年前阿基米德给出的答案已经深入了我们脑海里。在一张平面纸上任意地方放上两个点,用你能想象到的任何直线、曲线或几何路径将这两个点连接起来。那么你会发现,只要这张纸保持平整,...
  • 直线距离: struct Node { int x,y; }; double D(Node a,Node b,Node c)//计算直线距离 { double d=(fabs((b.y-a.y)*c.x+(a.x-b.x)*c.y+((b.x*a.y)-(a.x*b.y))))/(sqrt(pow(b.y-a.y,2)+pow(a.x-b.x,2)))...
  • 在双目视觉立体空间重建中,会根据个相机中...根据物体图像坐标、相机内参、给定坐标系的相机外参,求取相机光轴线的方程,从而实现立体重建,本文主要是解决在已知三维空间直线求其最短距离、最近及算法实现。
  • 我们经常在考试当中看到求线段之和最小的问题,首先来看下这几个数学模型:模型1:两点之间线段最短要在l找点P,使得PA+PB最短,这模型最简单,两点之间线段最短。模型2:将军饮马问题在l上找一点P,使得PA+PB最短,...
  • 模板题:求空间中不平行的直线最短距离最短线段与两直线的交点 #include #include #include #include #include #include using namespace std; const double eps = 1e-8; double Sqr(double ...
  • %求空间中任意直线之间的最短距离,p1p2是直线段p的个端点坐标,q1q2是直线段q的个端点坐标 function [d]=distance(p1,p2,q1,q2) s1=p2-p1;%方向向量 s2=q2-q1; res1=((s1*s2')*((p1-q1)*s2')-(s2*s2')*((p1...
  • 直线最短距离及垂足

    千次阅读 2019-05-31 12:02:00
    一、根据两点直线方程 已知直线两点为:(x1,x2),(y1,y2); 设方程为:Ax+By+C=0; 1. 求斜率:k=(y2-y1)/(x2-x1); 2. 直线方程为: y-y1=k(x-x1); 换算得:kx-y+y1-kx1=0,即: A=k B=-1 C=y1-kx1=y1-...
  • 一、根据两点直线方程 已知直线两点为:(x1,x2),(y1,y2); 设方程为:Ax+By+C=0; 1. 求斜率:k=(y2-y1)/(x2-x1); 2. 直线方程为: y-y1=k(x-x1); 换算得:kx-y+y1-kx1=0,即: A=k B=-1 C=y1-kx1=y1-(y2-...
  • C++ 两点之间最短距离

    千次阅读 2020-10-05 14:27:39
    两点之间最短距离 这是我的一个测试,也是我学习html的起点,他们说一个合格的程序员必须学会html,我比他们起步晚了一些,可是我认为还来的及,以后我就用html来记录我的学习记录了。 问题的提出...
  • 实验三:C#实现求图的任意两点最短路径及距离 实验目的 定义Graph类、Node类,从文件中读取图结构;给定两个顶点,给出两个顶点的最短路径(如果没有连通,请给出)。把图进行可视化展示(一个适当大小的图),...
  • 三维空间直线距离计算
  • 到线段的最短距离

    2019-08-29 09:40:05
    到线段的最短距离有三种情况: 最短距离分别是AP,CP,BP.第一种情况和第三种情况基本相似。首先我们要判断在线段端点的两侧(1,3)还是在个端点之间(2)。假设p垂直于直线AB的交点为C,我们只需要计算出AC...
  • 本文利用解析方法,求出了空间线段的最短距离,文末附上了matlab程序。方法简单,可靠,程序复制粘贴后即可使用。...求空间线段的最短距离和求空间两直线最短距离不同,直线可以无限延伸,而线段不能。
  • NULL 博文链接:https://xiangjinqi.iteye.com/blog/1637843
  • 求解两点最短路径的算法

    千次阅读 2020-07-19 23:42:40
    最短路径算法1.Dijkstra算法2.Bellman-Ford算法3.SPFA算法4.Floyd算法几种最短路径算法的对比Dijkstra算法、Bellman-Ford算法和SPFA算法的对比Dijkstra算法和Floyd算法的...多源最短路算法:求任意两点之间的最短路径.
  • 设两个已知点(A、B点 )经纬度为(α1,β1),(α2,β2),其距离为D,地球半径为R, 行距为H,第三点的经纬度为(α3,β3...第三点:距离前述已知两点(A、B点)组成的直线段上A点的距离为H; C点存在左右两个点
  • 在从一个方格a的中心连接到另一个方格b的中心时,转弯处必须采用直角。如果已经有某条线路经过一个方格,则封锁该方格。要求:使用a和b之间的最短路径来作为布线的路径,以减少信号的延迟。 解: (从a找到b)...
  • 最短路径连线版

    2018-02-20 09:09:34
    平面上有n个点(n),每个点的坐标均在-10000~10000之间。... 若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离两点间的直线距离。现在的 任务是找出从一点到另一点之间的最短路径。
  • 代码实现 求到线段的最短距离

    千次阅读 2019-05-30 16:22:07
    到线段最短距离的运算与直线最短距离的运算二者之间存在一定的差别,即求到线段最短距离时需要考虑参考在沿线段方向的投影是否在线段上,若在线段上才可采用直线距离公式,如图1所示。 1、方法...
  • 与线段_线段与线段的最短距离,matlab代码。自编的function,便于嵌入使用
  • 问题的关键是求出这条任意直线之间的最短距离,以及在这个距离上的线最接近坐标,判断该是否在线段AB和线段CD上。 首先将直线方程化为对称式,得到其方向向量n1=(a1,b1,c1),n2=(a2,b2,c2). 再将...
  • JavaScript中点到一个直线最短距离

    千次阅读 2019-10-26 17:42:39
    天遇见个问题,平面上计算直线距离,原来数学白学了。不过还是搞出来了。记录一下伤员吗 /** * 到线的最短距离实际上就是到线的垂直距离。 * (x,y)为的坐标 * (x1,y1)为线段上的坐标 * (x2,y2...
  • 到线段最短距离的运算与直线最短距离的运算二者之间存在一定的差别,即求到线段最短距离时需要考虑参考在沿线段方向的投影是否在线段上,若在线段上才可采用直线距离公式,如图1所示。+ 图1(a...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,076
精华内容 4,030
关键字:

两点距离直线最短