精华内容
下载资源
问答
  • 变分法证明两点之间线段最短

    万次阅读 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)。

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

    展开全文
  • 设有空间线段 $L_s$,其起点、终点坐标为$ s_0、s_1 $,方向向量$\vec u = s_1-s_0 $ $L_t$,其起点、终点坐标为$ t_0、t_1 $,方向向量$\vec v = t_1-t_0 $ 及线段对应的直线为$l_s、l_t$,采用向量表示法如下...

    设有两空间线段

    1. $L_s$,其起点、终点坐标为$ s_0、s_1 $,方向向量$\vec u = s_1-s_0 $
    2. $L_t$,其起点、终点坐标为$ t_0、t_1 $,方向向量$\vec v = t_1-t_0 $ 及两线段对应的直线为$l_s、l_t$,采用向量表示法如下: $l_s = s_0+c_s\cdot\vec u$ $l_t = t_0+c_t\cdot\vec v$ 当$0\le c_s、c_t\le1$时,上述两式表达 设最短距离两点分别为$s_j$、$t_j$,则有 $s_j = s_0+s_c\cdot\vec u$ $t_j = t_0+s_c\cdot\vec v$ 其中$s_c$、$t_c$为$s_j$、$t_j$两点所对应的标量。

    记向量$\vec w$=$s_c-t_c$,记向量$\vec w_0$=$s_0-t_0$,根据下图可以得出: 向量示意图 $\vec w=s_0+s_c\cdot\vec u-(t_0+t_c\cdot\vec v)$ 即: $\vec w=\vec w_0+s_c\cdot\vec u-t_c\cdot\vec v$ ——公式1 如果$s、t$两条直线不平行、重合,则存在唯一的两点$s_c、t_c$使线段$\overrightarrow {s_ct_c}$为$l_s、l_t$最近两点的连线。同时,线段$\overrightarrow {s_ct_c}$也是唯一与两条直线同时垂直的线段。转换为向量表达即为:

    1. $\vec u\cdot\vec w=0$
    2. $\vec v\cdot\vec w=0$ 将公式1代入上述两式可得
    3. $(\vec u\cdot\vec u)s_c-(\vec u\cdot\vec v)t_c=-\vec u\cdot\vec w_0$ ——公式2
    4. $(\vec v\cdot\vec u)s_c-(\vec v\cdot\vec v)t_c=-\vec v\cdot\vec w_0$ ——公式3 记$a=\vec u\cdot\vec u,b=\vec u\cdot\vec v,c=\vec v\cdot\vec v,d=\vec u\cdot\vec w_0,e=\vec v\cdot\vec w_0$,代入上述方程则可得:
    5. $s_c = \frac {be-cd}{ac-b^2}$ ——公式4
    6. $t_c = \frac {ae-bd}{ac-b^2}$ ——公式5 注意到上式中分母 $ac-b^2=\vec u\cdot\vec u\times\vec v\cdot\vec v-(\vec u\cdot\vec v)^2$ $\Rightarrow ac-b^2=\vert\vec u\vert^2\cdot\vert\vec v\vert^2-(\vert\vec u\vert\cdot\vert\vec v\vert\cdot cosq)^2=(\vert\vec u\vert\cdot\vert\vec v\vert\cdot sinq)^2\ge0$ 当$ac-b^2=0$时,公式2和公式3相互独立,则两直线平行,直线间的距离为一常数,我们可以在任意一条直线上指定一固定点,然后代入公式求距离。我们可以指定$s_c=0$然后可以求得$t_c=\frac {d}{b}=\frac{e}{c}$。 当求出$s_c、t_c$我们即可求得$s_j、t_j$两点,则亮点之间的距离可按下式求解: $d(l_s,l_t)=\vert s_j-t_j\vert=\vert s_0-t_0+\frac {(be-cd)\vec u- (ae-bd)\vec v}{ac-b^2}\vert$

    具体实现代码如下(C#实现):

    public bool IsEqual(double d1, double d2)
    {
        if (Math.Abs(d1 - d2) < 1e-7)
            return true;
        return false;
    }
            
    public double SqureDistanceSegmentToSegment(double x1, double y1, double z1,
                                                double x2, double y2, double z2,
                                                double x3, double y3, double z3,
                                                double x4, double y4, double z4)
    {
        // 解析几何通用解法,可以求出点的位置,判断点是否在线段上
        // 算法描述:设两条无限长度直线s、t,起点为s0、t0,方向向量为u、v
        // 最短直线两点:在s1上为s0+sc*u,在t上的为t0+tc*v
        // 记向量w为(s0+sc*u)-(t0+tc*v),记向量w0=s0-t0
        // 记a=u*u,b=u*v,c=v*v,d=u*w0,e=v*w0——(a);
        // 由于u*w=、v*w=0,将w=-tc*v+w0+sc*u带入前两式得:
        // 1)(u*u)*sc - (u*v)*tc = -u*w0
        // 2)(v*u)*sc - (v*v)*tc = -v*w0
        // 再将前式(a)带入可得sc=(be-cd)/(ac-b2)、tc=(ae-bd)/(ac-b2)——(b)
        // 注意到ac-b2=|u|2|v|2-(|u||v|cosq)2=(|u||v|sinq)2不小于0
        // 所以可以根据公式(b)判断sc、tc符号和sc、tc与1的关系即可分辨最近点是否在线段内
        // 当ac-b2=0时,1)2)式独立,表示两条直线平行。可令sc=0单独解出tc
        // 最终距离d(L1、L2)=|(P0-Q0)+[(be-cd)*u-(ae-bd)v]/(ac-b2)|
        double ux = x2 - x1;
        double uy = y2 - y1;
        double uz = z2 - z1;
    
        double vx = x4 - x3;
        double vy = y4 - y3;
        double vz = z4 - z3;
    
        double wx = x1 - x3;
        double wy = y1 - y3;
        double wz = z1 - z3;
    
        double a = (ux * ux + uy * uy + uz * uz); //u*u
        double b = (ux * vx + uy * vy + uz * vz); //u*v
        double c = (vx * vx + vy * vy + vz * vz); //v*v
        double d = (ux * wx + uy * wy + uz * wz); //u*w 
        double e = (vx * wx + vy * wy + vz * wz); //v*w
        double dt = a * c - b * b;
    
        double sd = dt;
        double td = dt;
    
        double sn = 0.0;//sn = be-cd
        double tn = 0.0;//tn = ae-bd
    
        if (IsEqual(dt, 0.0))
        {
            //两直线平行
            sn = 0.0;    //在s上指定取s0
            sd = 1.00;   //防止计算时除0错误
    
            tn = e;      //按公式2)求tc
            td = c;
        }
        else
        {
            sn = (b * e - c * d);
            tn = (a * e - b * d);
            if (sn < 0.0)
            {
                //最近点在s起点以外,同平行条件
                sn = 0.0;
                tn = e;
                td = c;
            }
            else if (sn > sd)
            {
                //最近点在s终点以外(即sc>1,则取sc=1)
                sn = sd;
                tn = e + b; //按公式2)计算
                td = c;
            }
        }
        if (tn < 0.0)
        {
            //最近点在t起点以外
            tn = 0.0;
            if (-d < 0.0) //按公式1)计算,如果等号右边小于0,则sc也小于零,取sc=0
                sn = 0.0;
            else if (-d > a) //按公式1)计算,如果sc大于1,取sc=1
                sn = sd;
            else
            {
                sn = -d;
                sd = a;
            }
        }
        else if (tn > td)
        {
            tn = td;
            if ((-d + b) < 0.0)
                sn = 0.0;
            else if ((-d + b) > a)
                sn = sd;
            else
            {
                sn = (-d + b);
                sd = a;
            }
        }
    
        double sc = 0.0;
        double tc = 0.0;
    
        if (IsEqual(sn, 0.0))
            sc = 0.0;
        else
            sc = sn / sd;
    
        if (IsEqual(tn, 0.0))
            tc = 0.0;
        else
            tc = tn / td;
    
        double dx = wx + (sc * ux) - (tc * vx);
        double dy = wy + (sc * uy) - (tc * vy);
        double dz = wz + (sc * uz) - (tc * vz);
        return dx * dx + dy * dy + dz * dz;
    }
    

    参考文献:http://geomalgorithms.com/a07-_distance.html

    转载于:https://my.oschina.net/u/1777658/blog/720069

    展开全文
  • /// <summary> /// 根据经纬度值计算出点与直线的距离 ...的x坐标</param> /// <param name="y">的y坐标</param> /// <param name="x1">线的第一个端点的x坐标&l...
    /// <summary> 
    /// 根据经纬度值计算出点与直线的距离 
    /// </summary> 
    /// <param name="x">点的x坐标</param> 
    /// <param name="y">点的y坐标</param> 
    /// <param name="x1">线的第一个端点的x坐标</param> 
    /// <param name="y1">线的第一个端点的y坐标</param> 
    /// <param name="x2">线的第二个端点的x坐标</param> 
    /// <param name="y2">线的第二个端点的y坐标</param>         
    /// <returns>返回点与直线的距离</returns> 
    public static double DistancePointToLine(double x, double y, double x1, double y1, double x2, double y2) 
    {
    	if (y1 == y2)//线段为平行于X轴 
    	{
    		if (Math.Min(x1, x2) < x && Math.Max(x1, x2) > x)//垂足在线段内 
    		{
    			return Math.Abs(ComputeD(y1, x, y, x));
    			//点与该线的距离为TempP与P的的距离
    		} else 
    		{
    			return Math.Min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));
    			//返回到某个端点的距离
    		}
    	}
    	if (x1 == x2)//线段为平行于Y轴 
    	{
    		if (Math.Min(y1, y2) < y && Math.Max(y1, y2) > y)//垂足在线段内 
    		{
    			return ComputeD(y, x1, y, x);
    			//点与该线的距离为TempP与P的的距离
    		} else 
    		{
    			return Math.Min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));
    			//返回到某个端点的距离
    		}
    	} else//该线段不平行于X轴也不平行于Y轴 
    	{
    		double k = (y2 - y1) / (x2 - x1);
    		//线段的斜率 double TempX, TempY; 
    		TempX = (Math.Pow(k, 2.0) * x1 + k * (y - y1) + x) / (Math.Pow(k, 2.0) + 1.0);
    		TempY = k * (TempX - x1) + y1;
    		if (TempX < -180 || TempX > 180 || TempY < -90 || TempY > 90) 
    		{
    			return Math.Min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));
    			//返回到某个端点的距离
    		}
    		double TempDis1=(ComputeD(TempY, TempX, y1, x1) + ComputeD(TempY, TempX, y2, x2));
    		double TempDis2=ComputeD(y1,x1,y2,x2);
    		if((TempDis1 - TempDis2)<0.001) //垂足在线内 
    		{
    			return (ComputeD(TempY, TempX, y, x));
    			//点与该线的距离为TempP与P的的距离
    		} else 
    		{
    			return Math.Min(ComputeD(y, x, y1, x1), ComputeD(y, x, y2, x2));
    			//返回到某个端点的距离
    		}
    	}
    }
     

    ComputeD函数参看http://blog.csdn.net/eqmaster/archive/2010/07/29/5773211.aspx

     

    此代码用于学习测试,计算结果适用范围有限。

    展开全文
  • 许多之间连线最短 python实现

    千次阅读 热门讨论 2019-01-15 22:02:10
    题目: 如下图所示,平面上有一些关键点集,现需要将所有点连接起来,使得任何要给点都可以和其他点连通(直接或者间接的连接),且连接线段的长度总和最短 第一次写的错误的代码: ... '''计算两点之间的距离''' ...

    题目:

        如下图所示,平面上有一些关键点集,现需要将所有点连接起来,使得任何要给点都可以和其他点连通(直接或者间接的连接),且连接线段的长度总和最短

     

    第一次写的错误的代码:

    def main(list1):
    	'''
    	desc:每新增一个点,计算该店到之前所有点的最近距离并连线,以此类推
    	'''
    
    	def juli(a,b):
    		'''计算两点之间的距离'''
    		return ((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2) ** 0.5
    
    	def juli_point_list(point,list1):
    		'''计算点和列表1中所有点最近距离 index向量'''
    		juli_list = []
    		for i in list1:
    			juli_list.append(juli(point,i))
    		start = juli_list.index(min(juli_list)) # 最小距离的索引
    		end = len(list1)
    		return [start,end]
    
    
    
    	res = []
    	for i in range(1,len(list1)):
    		mindistance = juli_point_list(list1[i],list1[:i])
    		res.append(mindistance)
    	return res
    
    point_list = [[82,53],[14,30],[38,12],[7,22],[75,87],[28,71],[31,60],[8,63]]
    print(main(point_list))
    # 返回结果:  [[0, 1], [1, 2], [1, 3], [0, 4], [1, 5], [5, 6], [5, 7]]

    第一次代码写错,hr给出反馈如下:

     

    经过修改后正确的代码如下:

    import copy
    def main(list_nodo):
    	'''
    		desc:思路  列表中有许多坐标,总体思想是分两份,一个为已处理(起始值为1)list_done,一份为未处理list_nodo(起始值为n-1),
    		递归的计算 list_nodo 和list2 各自列表内所有坐标的最小距离,即相当于笛卡尔成绩方法,然后记录两点在原始列表中的index组成的元组作为返回值res,
    		然后因为结束点总是在未处理列表中,所以把他从里面删除并添加到已处理列表中
    
    		或者换个递归思路理解:手里有a,b两个集合,a是已经连接线的,b都没有连接,是待处理点,那么要是a,b集合中每个点直接或间接相通,
    		就需要计算a中所有点和b中所有点的距离,找出最小值,对应的b中的那个点就是本轮递归的处理点,因此该点从b移除,添加到a(已处理集合)
    		知道b为空就表示所有点都能连接到,且路径和最短.
    
    		有同学说涉及到以下知识:
    			有权图,无权图,Dijkstra 算法和 Floyd 算法
    		我查了许久,发现关系不大,读者请自行扩展
    	'''
    	# 完整数据集 
    	list_all = copy.deepcopy(list_nodo)
    
    	# 已处理数据集
    	list_done = []
    	# 未处理数据集 会变少
    	list_nodo
    	# 返回步骤 res
    	res = []
    
    	def juli(a,b):
    		'''计算两点之间的距离'''
    		return ((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2) ** 0.5
    
    	
    	dict11 = {}  # 格式   {距离,(起点坐标,终点坐标)}
    	# 放入一个初始值
    	list_done.append(list_nodo[0])
    	list_nodo.remove(list_nodo[0])
    	while list_nodo:
    		for i in list_done:  # i 为起点的坐标
    			for j in list_nodo:  # j为终点坐标
    				length = juli(i,j)  # 起点终点距离
    				dict11[length] = [i,j]	
    		key1 = min(dict11.keys())
    		# 起点坐标
    		startpoint = dict11[key1][0]
    		# 终点坐标
    		endpoint = dict11[key1][1]
    		res.append((list_all.index(startpoint),list_all.index(endpoint)))
    
    		# 移动该移动的值
    		list_done.append(endpoint)
    		# print(list_nodo)
    		# print(endpoint)
    		list_nodo.remove(endpoint)
    		dict11 = {}
    	return res
    
    
    
    # point_list = [[0,0],[4,0],[6,-2],[7,4]]
    point_list =  [[82,53],[14,30],[38,12],[7,22],[75,87],[28,71],[31,60],[8,63]]
    print(main(point_list))
    # 输出结果:[(0, 4), (4, 5), (5, 6), (5, 7), (7, 1), (1, 3), (1, 2)]

    ----

    有人问那个折线的结果图怎么画出来的,我这里给大家一个思路,代码自己优化

    code snippet widget

    绘制图片如下:

     

    对应的大学公选课数据与应用:

    https://download.csdn.net/download/qq_35515661/11156638

     

    展开全文
  • 思路:要构成线段,即长度...//100个点,任意两点构成线段 //求在可以构成的所有线段中,长度最小的线段长度 #include<stdio.h> #include<math.h> #define n 3 int main(){ double a[n][2]={0},min,d; ...
  • Python 平面上的最短连线

    万次阅读 热门讨论 2018-09-02 16:09:15
    Python3.6.3 如下图所示,平面上有一些,需要将所有连起来,使任何一个都可以和其他连通(直接或间接),且...n)个,它们的最短连线集合是f(m),并且满足在f(n)中这m个连线也可以是f(m)。 计算剩余n-...
  • 需求:平面内有多个点,要用...5、然后将所有点循环定为起始点,将每一种点排序组合都加到数组A中,并将这种排序组合所有点连线计算出长度加到数组B中; 6、找出数组B中值最小的下标,到数组A中找对应的点排列组合,.
  • 我们之前做的dijkstra算法只能实现两点之间的1条最短路径的计算。dijkstra算法需要和yen算法结合,才能实现获取两点之间的k条最短路径。关于后面的数据准备有疑惑的,可以参考上篇博文WebGIS开发之最短路径分析入门 ...
  • 思路:判断任意线段的端点连线与其它线段是否有交点即可。最后用一个最短路径模板就可以了。 补充知识: ① 快速排斥实验:如果条边所在矩形不相交则一定不相交,即满足 设线段a为(x1,y1)--(x2,y2) ...
  • 河流 泵站 前面我们研究过一些关于两点的所有连线中线 段最短连接直线外一点与直线上各点的所有线段 中垂线段最短等的问题我们称它们为最短路径问 题现实生活中经常涉及到选择最短路径的问题本节
  • 容易理解的常规方法: 已知空间中线段,如果它们无限变粗,判断...问题的关键是求出这条任意直线之间的最短距离,以及在这个距离上的线最接近坐标,判断该是否在线段AB和线段CD上。 首先将直线
  • 这道题目说起来就是一道最短路的题,但是两点之间是否能够走,需要判断一下两点之间的连线是不是跟墙有交点,就是计算几何的判断线段相交问题。两类典型的题合在一起了。 由于数据范围小的可怜,无脑暴力+floyd都能
  • 线段的最短距离算法

    千次阅读 2018-11-09 11:23:13
    最近做了一个类似Visio的软件,需要对节点连线进行右键删除操作,但是如何确定是否鼠标右键点击到了连线是个难题。 参考了以下内容。留存备用。选用几何矢量算法,最方便的解决了问题,首先了解了向量内积的定义: ...
  • 小游戏 (最少线段连线问题)

    千次阅读 2012-12-05 20:06:34
    当下面的情况满足时,我们认为个游戏卡片之间有一条路径相连:   路径只包含水平或者竖直的直线段。路径不能穿过别的游戏卡片。但是允许路径临时离开矩形板。   下面是一个例子: 这里在(1, 3)和(4, 4)处...
  • 八年级 上册13.4 课题学习 最短路径问题引入新知 引言 前面我们研究过一些关于两点的所有连线中线 段最短连接直线外一点与直线上各点的所有线段中垂线段最短等的问题我们称它们为最短路径问 题现实生活中经常涉及到...
  • 弗洛伊德算法求的是每一对顶点之间(n->n)的最短路径,而迪杰斯特拉算法求得是某一点到其它顶点...然后B点经过A点得到最短路径,即将B点与其它点的连线与BA和A到其他点连线相比较, (eg:求AC之间最短路径,将A.
  • 计算时根据已知条件,从有关线段上一点开始,连结相关线段上的连线与表示所求量线段的交点即为答案。 无向图、有向图和网络能运用很多常用的图算法。这些算法包括:各种遍历算法(这些遍历类似于树的遍历),...
  • 接上篇文章“Cesium中点至直线的垂足和距离计算”,在计算出点到直线的垂足后,就可以将定位坐标确定到直线。但有一个问题是,由于路线是有一定宽度的,一部分是落在路线中线上,其他的是在中线和路线外边线...
  • 两点之间线段最短3.同角或等角的补角相等4.同角或等角的余角相等5.过一点有且只有一条直线和已知直线垂直6.直线外一点与直线上各点连接的所有线段中,垂线段最短7.平行公理经过直线外一点,有且只有一条直线与这条...
  • 此题就是给出一幅图,然后上面一些墙,让求起点到终点的最短路径,说到最短路径那就必须得有一个图,那么首要问题就变成了如何构图,这里就得用到计算几何里面的基础知识,判断线段是否相交,也就是两点之间的连线,...
  • 这些算法常被用以回答一些与图相关的问题,诸如图是否是连通的,图中个顶点间的最短路径是什么等等。在数据挖掘领域中,图算法可应用到多种场合,以解决特定问题,如管道优化、路由选择、快递服务、网...
  • 初看到这道题一般人的第一个想法基本上就是建图,找最短路。但一想到这个做法的无论代码长度还是算法... 证明不好证,但如果说明大体的思想其实挺简单的:思想有点像两点之间直线最短。不要去管纵横交错的小线段
  • 题目大意:有一个房间(左上...分析:很明显根据两点之间直线最短,所以所走的路线一定是点之间的连线,只需要判断一下这两点间知否有墙即可。 代码如下: ==================================================...
  • 算法笔记--最短路径之dijkstra算法

    千次阅读 2014-08-25 20:15:55
    最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中结点之间的最短路径。 算法具体的形式包括: (1)确定起点的最短路径问题:即已知起始结点,求最短路径的问题。 (2)确定...
  • Dijkstra算法和Floyd算法求最短路径 ** 第一次写博客同时记录自学数据结构Dijkstra算法和Floyd算法的过程。 Dijkstra算法是解决单元最短路径的比较有效一种方法, 先进行一些准备工作–定义 //采用邻接矩阵的方式...
  • 最短路径 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 总提交:49 测试通过:14 描述 在一些美国主要城市里,为企业传送文件和小物品的自行车快递长期以来就是流动运输服务的一部分。波士顿的...
  • 设有两空间线段 Ls,其起点、终点坐标为s0、s1,方向向量u⃗ =s1−s0 Lt,其起点、终点坐标为t0、t1,方向向量v⃗ =t1−t0 ...设最短距离两点分别为sj、tj,则有 sj=s0+sc⋅u⃗ tj=t0+sc⋅v⃗ 其...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 895
精华内容 358
关键字:

两点连线线段最短