精华内容
下载资源
问答
  • GMA Round 1 最短距离

    2018-02-27 14:11:00
     在椭圆C:$\frac{x^2}{20^2}+\frac{y^2}{18^2}=1$上作两条相互垂直切线,切线交点为P,求P到椭圆C的最短距离。结果保留6位小数。  设椭圆方程:$\frac{x^2}{a^2}+\frac{y^2}{b^2}=1$,结论两垂直切线交点...

     传送门

     

    最短距离

      在椭圆C:$\frac{x^2}{20^2}+\frac{y^2}{18^2}=1$上作两条相互垂直的切线,切线交点为P,求P到椭圆C的最短距离。结果保留6位小数。

     

     

      设椭圆方程:$\frac{x^2}{a^2}+\frac{y^2}{b^2}=1$,结论是两垂直切线交点P的轨迹为$x^2+y^2=a^2+b^2$。当切线斜率不存在或为0时易验证。否则设P坐标为$(x_0,y_0)$,两条直线 $l_1:y=k(x-x_0)+y_0$,$l_2:y=-\frac{1}{k}(x-x_0)+y_0$为椭圆的两条切线。

      将$l_1$与$l_2$分别与椭圆联立,并另其判别式为0,可得下列两式:

      $$2kx_0y_0-k^2x_0^2+b^2-y_0^2+k^2a^2=0$$ $$-2kx_0y_0-x_0^2+k^2b^2-k^2y_0^2+a^2=0$$

      将两式相加得$(1+k^2)(a^2+b^2-x_0^2-y_0^2)=0$,即$x_0^2+y_0^2=a^2+b^2$

      这样一来P的轨迹是以$\sqrt{a^2+b^2}$为半径的圆,距离最短时P在x轴上,距离为$\sqrt{a^2+b^2}-a$

      定位:简单题

    转载于:https://www.cnblogs.com/Enceladus/p/8478601.html

    展开全文
  • Mindis题目链接:Mindis题意:内或者圆周上有两个点pp和qq,圆心为oo,并且op=oqop=oq,让你在上找一点dd...还有就是极端情况,做出反演点(什么反演点)如果直线p′q′p'q'与有交点,则答案为两点间距离 否则

    Mindis

    题目链接:Mindis

    题意:圆内或者圆周上有两个点pq,圆心为o,并且op=oq,让你在圆上找一点d,使得dp+dq最小

    官方题解:
    这里写图片描述

    为什么是中垂线上的点取得最小值?
    个人理解应该是类似于这种情况吧,不过任谁做这道题时首先想到的应该都是中垂线吧。。
    这里写图片描述

    还有就是极端情况,做出反演点(什么是反演点

    如果直线pq与圆有交点,则答案为两点间距离
    否则答案就在中垂线上取到

    看着题解写代码很简单,问题就是这些结论怎么证的(蒻蒻记住结论,求路过的大佬解惑)。。。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    const double eps=1e-8;
    
    struct point//点
    {
        double x,y;
        point() {}
        point(double X,double Y)
        {
            x=X,y=Y;
        }
    };
    
    double xmult(point p1,point p2,point p0)//叉积
    {
        return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
    }
    
    double dis(point p1,point p2)//两点间距离
    {
        return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
    }
    
    double disptoline(point p,point l1,point l2)//点到直线的距离
    {
        return fabs(xmult(p,l1,l2))/dis(l1,l2);
    }
    
    int intersect_line_circle(point c,double r,point l1,point l2)//判定直线是否与圆相交
    {
        return disptoline(c,l1,l2)<r+eps;
    }
    
    int main()
    {
        int T_T;
        double r,ans;
        point p,q,o(0,0);
        scanf("%d",&T_T);
        while(T_T--)
        {
            scanf("%lf%lf%lf%lf%lf",&r,&p.x,&p.y,&q.x,&q.y);
            double op=dis(p,o);
            if(p.x==q.x&&p.y==q.y)//特判两点在同一位置
                ans=2.0*(r-op);
            else
            {
                point p1(r*r/op/op*p.x,r*r/op/op*p.y),q1(r*r/op/op*q.x,r*r/op/op*q.y);//p'和q'
                if(intersect_line_circle(o,r,p1,q1))//判定直线是否与圆相交
                    ans=dis(p1,q1)*op/r;
                else
                {
                    point mid((q1.x+p1.x)/2,(q1.y+p1.y)/2);//两个反演点的中点
                    double k=r/dis(mid,o);//比例
                    point d(k*mid.x,k*mid.y);//得到中垂线上的点
                    ans=2*dis(d,q);//两点到中垂线的距离相等所以×2
                }
            }
            printf("%.7lf\n",ans);
        }
        return 0;
    }
    

    ps:解释一下代码中的ans=dis(p1,q1)*op/r
    反演点有一个定理:

                               dpdp=opop   (d为圆上任意一点)

    opop=r2

    dp=dpop2r2=dpopr
    同理可得dq=dqop2r2=dqoqr
    op=oq,因此ans=dis(p1,q1)*op/r

    展开全文
  • 针对从源站点到目的站点不同欧式距离, 算法分别在两类不同大小椭圆内搜索最短路径.理论计算和实验结果都表明, 当源站点和目的站点相距较远时, 与椭圆限制搜索区域算法相比, 该算法可以降低33%-47%时间复杂度,...
  • 多数球面距离最短证明漏洞

    千次阅读 2005-09-17 20:08:00
    本来想发在这里,但是在重写证明过程时突然发现了这些证明的一个通病:它们都拿大圆的弧和小圆的弧作比较。换句话说,这些证明都默认了球面上两点一定的距离最短。在还没有证明到的情况下,你必须假定球面上两...
    
    			

        今天在网上看到了几个两点间球面距离最短的证明,甚至有不用微积分的。本来想发在这里,但是在重写证明过程时突然发现了这些证明的一个通病:它们都是拿大圆的弧和小圆的弧作比较。换句话说,这些证明都默认了球面上两点一定是弧的距离最短。在还没有证明到的情况下,你必须假定球面上两点的最短距离有可能不是一条弧,而是另外的曲线。考虑到这个,我不认为这些证明有任何一个可以令我满意。

    展开全文
  • 分析:没什么好方法,凭感觉每个点对应最短距离,应该一个凸函数,用三分来解。不过应该分成两部分,用两次三分来解。具体原因不明,通过实验只能得出三分必须针对一个凸函数,很明显,从0~2*pi不是一...

    题意:已知起点、圆、矩形,要求计算从起点开始,经过圆(和圆上任一点接触即可),到达矩形的路径的最短距离。(可以穿过园)。

    分析:没什么好的方法,凭感觉圆上的每个点对应最短距离,应该是一个凸函数,用三分来解。不过应该是分成两部分,用两次三分来解。具体原因不明,通过实验只能得出三分必须是针对一个凸函数,很明显,从0~2*pi不是一个凸函数,但同理,0~pi,pi~2*pi也不一定是个凸函数。个人认为,网络上流传的[0,pi][pi,2*pi]这种分法,并不存在合理性。继续思考= =

        另外,直接暴力枚举也是能过的。

    错误:分析圆上的点与矩形的位置关系写挫了,虽然现在还是研究不明白到底出了什么问题,应该是边界吧。

     1 double rec(double x,double y)
     2 {
     3     check();
     4     if(x-xi<eps&&y-yj>eps)
     5         return len(x,y,xi,yj);
     6     else if(x-xi<eps&&y-yi<eps)
     7         return len(x,y,xi,yi);
     8     else if(x-xj>eps&&y-yj>eps)
     9         return len(x,y,xj,yj);
    10     else if(x-xj>eps&&y-yi<eps)
    11         return len(x,y,xj,yj);
    12 
    13     if(x-xi>eps&&x-xj<eps)
    14         if(y-yj>eps)
    15             return fabs(y-yj);
    16         else if(y-yi<eps)
    17             return fabs(yi-y);
    18     else if(y-yi>eps&&y-yj<eps)
    19         if(x-xi<eps)
    20             return fabs(xi-x);
    21         else if(x-xj>eps)
    22             return fabs(x-xj);
    23 }
    错误的写法
      1 #include<cstdio>
      2 #include<cstring>
      3 #include<cmath>
      4 #include<cstdlib>
      5 #include<algorithm>
      6 using namespace std;
      7 
      8 const double pi=acos(-1.0);
      9 const double eps=1e-10;
     10 
     11 double sx,sy;
     12 double rx,ry,r;
     13 double xi,yi,xj,yj;
     14 
     15 double degree()
     16 {
     17     return atan((ry-sy)/(rx-sx));
     18 }
     19 
     20 double len(double x,double y,double a,double b)
     21 {
     22     return sqrt((x-a)*(x-a)+(y-b)*(y-b));
     23 }
     24 
     25 void change(double& x,double &y)
     26 {
     27     double p;
     28     p=x;
     29     x=y;
     30     y=p;
     31 }
     32 
     33 void check()
     34 {
     35     if(xi>xj)
     36         change(xi,xj);
     37     if(yi>yj)
     38         change(yi,yj);
     39 }
     40 
     41 double rec(double x,double y)
     42 {
     43     double lenx=0,leny=0;
     44     check();
     45     if(x<xi)
     46         lenx=xi-x;
     47     else if(x>xj)
     48         lenx=x-xj;
     49     if(y<yi)
     50         leny=yi-y;
     51     else if(y>yj)
     52         leny=y-yj;
     53     return sqrt(lenx*lenx+leny*leny);
     54 }
     55 
     56 double f(double m)
     57 {
     58     double dx=rx+r*cos(m);
     59     double dy=ry+r*sin(m);
     60 
     61     double len1=len(dx,dy,sx,sy);
     62     double len2=rec(dx,dy);
     63 
     64     return len1+len2;
     65 }
     66 
     67 int main()
     68 {
     69     int n;
     70     while(~scanf("%lf%lf",&sx,&sy))
     71     {
     72         if(fabs(sx)<eps&&fabs(sy)<eps)
     73             return 0;
     74         scanf("%lf%lf%lf",&rx,&ry,&r);
     75         scanf("%lf%lf%lf%lf",&xi,&yi,&xj,&yj);
     76 
     77         double l=degree(),r=l+pi;
     78         while(fabs(r-l)>eps)
     79         {
     80             double m1=l+(r-l)/3;
     81             double m2=r-(r-l)/3;
     82             if(f(m1)<f(m2))
     83                 r=m2;
     84             else
     85                 l=m1;
     86         }
     87         double l1=l;
     88         l=degree()+pi;r=l+pi;
     89         while(fabs(r-l)>eps)
     90         {
     91             double m1=l+(r-l)/3;
     92             double m2=r-(r-l)/3;
     93             if(f(m1)<f(m2))
     94                 r=m2;
     95             else
     96                 l=m1;
     97         }
     98         double l2=l;
     99         printf("%.2f\n",min(f(l1),f(l2)));
    100     }
    101     return 0;
    102 }
    View Code

    暴力枚举,奇葩的精度。不过相比较而言,这个算法根据有可信度。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<cstdlib>
     5 #include<algorithm>
     6 using namespace std;
     7 
     8 const double INF=1e10;
     9 const double pi=acos(-1.0);
    10 const double eps=1e-10;
    11 
    12 double sx,sy;
    13 double rx,ry,r;
    14 double xi,yi,xj,yj;
    15 
    16 double len(double x,double y,double a,double b)
    17 {
    18     return sqrt((x-a)*(x-a)+(y-b)*(y-b));
    19 }
    20 
    21 void change(double& x,double &y)
    22 {
    23     double p;
    24     p=x;
    25     x=y;
    26     y=p;
    27 }
    28 
    29 void check()
    30 {
    31     if(xi>xj)
    32         change(xi,xj);
    33     if(yi>yj)
    34         change(yi,yj);
    35 }
    36 
    37 double rec(double x,double y)
    38 {
    39     double lenx=0,leny=0;
    40     check();
    41     if(x<xi)
    42         lenx=xi-x;
    43     else if(x>xj)
    44         lenx=x-xj;
    45     if(y<yi)
    46         leny=yi-y;
    47     else if(y>yj)
    48         leny=y-yj;
    49     return sqrt(lenx*lenx+leny*leny);
    50 }
    51 
    52 double f(double m)
    53 {
    54     double dx=rx+r*cos(m);
    55     double dy=ry+r*sin(m);
    56 
    57     double len1=len(dx,dy,sx,sy);
    58     double len2=rec(dx,dy);
    59 
    60     return len1+len2;
    61 }
    62 
    63 int main()
    64 {
    65     int n;
    66     while(~scanf("%lf%lf",&sx,&sy))
    67     {
    68         if(fabs(sx)<eps&&fabs(sy)<eps)
    69             return 0;
    70         scanf("%lf%lf%lf",&rx,&ry,&r);
    71         scanf("%lf%lf%lf%lf",&xi,&yi,&xj,&yj);
    72 
    73         double m=INF;
    74         for(double i=0;i<=360;i+=0.01)
    75         {
    76             m=min(m,f(i/180*pi));
    77         }
    78         printf("%.2f\n",m);
    79     }
    80     return 0;
    81 }
    View Code

     

    转载于:https://www.cnblogs.com/zstu-abc/p/3351828.html

    展开全文
  • 本文由Markdown语法编辑器编辑完成。...而在项目进行过程中,医生提出“想在曲面上测量两个点之间的最短距离需求。这个需求也临床骨科医生在他们日常使用Mimics软件时经常会使用到一个测量功能。因此,他们希
  • 在多边形内条件:圆心在多边形内,且圆心到个
  • 最短路 ...2.不相交就直接距离公式,相交就算两点和圆的切线的距离,再算圆弧 import math x1,y1,x2,y2=map(float,input().split()) x,y,r=map(float,input().split()) d12 = math.sqrt((x1 - x2) * (x
  • 获得实体的另一个端点到终点的距离 (defun dist-other (ent pt / pta ptb pta2 ptb2) (setq pta (vlax-curve-getStartpoint ent)) (setq pta2 (list (fix (* 10 (car pta)))(fix (* 10 (cadr pta))))) (setq ptb ...
  • C# 大航线 Great Circle

    2010-05-14 18:44:13
    平面上两点间的最短距离是直线距离,而球面上的两点最短距离是圆的劣弧(大圆就是以球心为圆心,球半径为半径的圆)。知道地球上的两个点的经纬度,要得到它们的最短距离就是大圆距离。这个是我一个winform窗口的...
  • 与胶囊型物体碰撞检测 ...​  要对这两种图形做碰撞检测,就要涉及到圆心到胶囊型物体的最短距离的计算。这时候就要用到点到线段的最短距离的计算方法。   计算出最小距离的平方D^2。然后根据D^2...
  • 题意:给你一个点A和一个距离d 再给你n个点 问你是否存在一个点 在满足到所有n个点距离小于等于d前提下 到A...查看题解 思路是首先判断n个是否相交 如果相交则一定存在一个最短距离 最短距离是多少呢 分两种情况
  • 我们知道所有相邻车站对之间的距离,其中distance[i]车站i与车站(i + 1)%n之间的距离。 公交车沿两个方向运行,即顺时针和逆时针。返回给定起点和终点之间的最短距离。 输入:distance = [1...
  • 注意:1+λ为0时,P点在圆心,最短距离自然半径。 求的极值点在圆的优弧或是劣弧的判断可以将直角坐标系转为极坐标,用角度判断。 还有就是最坑的精度,精度要达到0.0001 AC代码; #include #include
  • Leaflet插件可测量简单线和复杂多段线的距离。 以公制(米,公里),英制(英尺,陆地英里)或海里为单位进行测量。 线绘制为逼真的圆弧。 计算方位角和距离时要考虑,这地球上两点之间的最短路径。 箭头指示...
  • 给定经纬度计算距离

    2019-09-26 20:41:18
    这个距离等于A、B、O三点确定的大圆的AB弧的长度,这段弧就是最短距离。 Haversine一个函数:haversin(x)=sin(x)/2=1-cos(x) 半余弦公式计算大圆距离的一种方法。 问题变形: 给定两点经纬度,计算两点方位角...
  • 判断矩形和

    2020-12-01 14:04:35
    方法一:先判断矩形是否在内(矩形四个顶点是否在内),若是则不相交,否则再判断圆心到矩形四条边的最短距离(点到线段的最短距离)是否存在小于半径,若是则相交(认为矩形包括圆是不相交,已经先排除了)...
  • 方法一:先判断矩形是否在内(矩形四个顶点是否在内),若是则不相交,否则再判断圆心到矩形四条边的最短距离(点到线段的最短距离)是否存在小于半径,若是则相交(认为矩形包括圆是不相交,已经先排除了)。...
  • 球面距离

    2019-09-15 13:24:16
    可以证明球面距离是球面上两点之间的最短距离。 设地球半径为R,球面上两点A、B球面坐标为A(α1,β1),B(α2,β2),则AB间球面距离为: d = R arcos[cosβ1 cosβ2 cos(α1-α2)+s...
  • Haversine公式根据其经度和纬度给出球体上两个点之间圆距离。 在这种情况下,球体地球表面。 黄点线一个大圆弧。 它给出了两个黄色点之间的最短距离。 图片由USGS提供。 安装 去获取github....
  • 0)  题意:  题意很简单,给出一张...即求岛屿上距离岛屿各条边边中最短的距离是所有点中最长的那个点。即求岛屿中的内接圆的圆心点。输出这个点到岛屿的边的最短的距离。即该岛屿中那个内接圆的半径...  分析:
  • 霍夫直线和检测

    2017-04-25 13:06:08
    (2)利用函数HoughLinesP(源Mat对象,存放结果的向量,以像素为单位的距离精度,以弧度为单位的角度精度,阈值,最短距离,最大间断距离)//存放结果的向量一个n x 4的二维数组,每个单元有四个值,分别代表直
  • 航线跨洋航行时所采用的地理航程最短的航线,若将地球视作为一个圆球体,地面上两点间的距离,以连接两点的小于180°的大圆弧弧长为最短。 恒向线:假定船舶在行驶过程中始终按着恒定的航向航行,船舶航行的...
  • 时间机器

    2020-02-15 22:37:32
    1、爱因斯坦 1905年爱因斯坦提出狭义相对论...爱因斯坦出的曲线运动,在一个球上有俩个点a和b,那么a和b之间连线最短的距离,那么a和b距离最短绕圆心通过上的a和b的点最短。显然a平方+b平方 不等于 c的平方 ...
  • 根据经纬度计算两地距离

    千次阅读 2018-09-02 15:08:33
    最近工作需要,网上搜索了下根据经纬度计算两地距离的方法,发现要么几何法,画图、作一堆辅助线,然后证明推理,要么... 球体上两地的最短距离就是经过两点的大圆的劣弧长度。 思路如下: 弧长 ← 弦长(两点距离)...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 184
精华内容 73
关键字:

最短的距离是圆的