精华内容
下载资源
问答
  • //第一层(define_class.h):构造坐标类,颜色和宽度的结构体,线段类 //第二层(function.h):对上一层声明的函数进行定义 //第三层(distance.cpp):用类定义对象并初始化对象,对结果进行测试 define_...


    //本程序有三个层次

    //第一层(define_class.h):构造坐标点类,颜色和宽度的结构体,线段类

    //第二层(function.h):对上一层声明的函数进行定义

    //第三层(distance.cpp):用类定义对象并初始化对象,对结果进行测试

    define_class.h

    #if!defined(define_class_H)
    #define define_class_h
    #include <iostream>
    #include <cmath>
    using namespace std;
    //定义坐标点类
    class Point
    {
    private:
      double X,Y; //横坐标、纵坐标作为私有变量
    public:
      Point(double=0,double=0); //构造函数

      Point(Point &); //复制的构造函数

      void Display() //显示坐标点
      {
        cout<<X<<","<<Y<<endl;
      }

      double Distance(Point &); //两点间距离的函数,参数是点类的引用,也可以用友元函数

      int getX()
      {
        return X; //得到横坐标的值
      }

      int getY()
      {
        return Y; //得到纵坐标的值
      }
    };

    struct Cow //color和width,结构体,结构体内的变量是public的
    {
      int Color;
      int Width;
    };

    class Line //定义线段类
    {
      private:
      Point a,b; //线段类的私有数据成员是点类的对象
      Cow cw; //线段有颜色和宽度
      public:
      Line(Point &,Point &,Cow &); //线段的构造函数,由两个点、颜色和宽度构成
      void Display();
      Line(Line &); //复制的构造函数
      double Distance(); //两点间的距离
      double Area(); //线段的面积
    };

    #endif

    function.h

     

    #if!defined(function_H)
    #define function_H
    #include "define_class.h" //包含头函数
    Point::Point(double a,double b) //定义构造函数,前面的头函数中仅仅声明了函数
    {
      X=a;
      Y=b;
    }
    Point::Point(Point &a) //定义复制的构造函数
    {
      X=a.X;
      Y=a.Y;
    }
    double Point::Distance(Point &a) //求两点间的距离
    {
      double dis;
      dis=sqrt((X-a.X)*(X-a.X)+(Y-a.Y)*(Y-a.Y));
      return dis;
    }
    Line::Line(Point &a1,Point &a2,Cow &a3):a(a1),b(a2),cw(a3) //给Line的私有变量初始化
    { //对象间的初始化,因此需要复制的构造函数
    }
    Line::Line(Line &s) //定义复制的构造函数
    {
      a=s.a;
      b=s.b;
      cw=s.cw;
    }
    void Line::Display() //显示线段
    {
      a.Display();
      b.Display();
      cout<<"Color="<<cw.Color<<","<<"width="<<cw.Width<<endl;
    }
    double Line::Distance()
    {
      double x,y;
      x=a.getX()-b.getX();
      y=a.getY()-b.getY();
      return sqrt(x*x+y*y);
    }
    double Line::Area()
    {
      return cw.Width * Distance();
    }
    #endif

    distance.cpp

     

    #include <iostream>
    #include <cmath>
    #include "function.h"
    using namespace std;

     

    void main()
    {
      Point a;
      Point b(8.9,9.8),c(34.5,67.8);
      a=c;
      a.Display();
      b.Display();

     

      cout<<"两点之间的距离:"<<a.Distance(b)<<endl;

     

      Cow cw={3,5};

     

      Line s(a,b,cw);

     

      Line s1(s);

     

      s1.Display();

     

      cout<<"线段的长度:"<<s1.Distance()<<endl;
      cout<<"线段的面积:"<<s1.Area()<<endl;
    }

     

    转载于:https://www.cnblogs.com/duanqibo/p/11096455.html

    展开全文
  • 两点间距离 /***** 求两点间距离*****/ float getDistance(CvPoint pointO, CvPoint pointA) { float distance; distance = powf((pointO.x - pointA.x), 2) + powf((pointO.y - pointA.y), 2); distance = ...

    求两点间距离

    /***** 求两点间距离*****/
    float getDistance(CvPoint pointO, CvPoint pointA)
    {
        float distance;
        distance = powf((pointO.x - pointA.x), 2) + powf((pointO.y - pointA.y), 2);
        distance = sqrtf(distance);
        return distance;
    }
    
    
    

    点到直线的距离:P到AB的距离

    
    /***** 点到直线的距离:P到AB的距离*****/
    //P为线外一点,AB为线段两个端点
    float getDist_P2L(CvPoint pointP, CvPoint pointA, CvPoint pointB)
    {
        //求直线方程
        int A = 0, B = 0, C = 0;
        A = pointA.y - pointB.y;
        B = pointB.x - pointA.x;
        C = pointA.x*pointB.y - pointA.y*pointB.x;
        //代入点到直线距离公式
        float distance = 0;
        distance = ((float)abs(A*pointP.x + B*pointP.y + C)) / ((float)sqrtf(A*A + B*B));
        return distance;
    }
    
    展开全文
  • 两点间距离 /***** 求两点间距离*****/ float getDistance(CvPoint pointO, CvPoint pointA) { float distance; distance = powf((pointO.x - pointA.x), 2) + powf((pointO.y - pointA.y), 2); distance = ...

     

    求两点间距离

    #***** 求两点间距离*****
    def getDist_P2P(Point0,PointA):
        distance=math.pow((Point0[0]-PointA[0]),2) + math.pow((Point0[1]-PointA[1]),2)
        distance=math.sqrt(distance)
        return distance
    
    
    

    已知直线上两点求直线的一般式方程

    常用的直线方程有一般式 点斜式 截距式 斜截式 两点式等等。除了一般式方程,它们要么不能支持所有情况下的直线(比如跟坐标轴垂直或者平行),要么不能支持所有情况下的点(比如x坐标相等,或者y坐标相等)。所以一般式方程在用计算机处理二维图形数据时特别有用。

    已知直线上两点求直线的一般式方程

    已知直线上的两点P1(X1,Y1) P2(X2,Y2), P1 P2两点不重合。则直线的一般式方程AX+BY+C=0中,A B C分别等于:

    A = Y2 - Y1

    B = X1 - X2

    C = X2*Y1 - X1*Y2

     

    点到直线的距离:P到AB的距离

    
    #***** 点到直线的距离:P到AB的距离*****
    #P为线外一点,AB为线段两个端点
    def getDist_P2L(PointP,Pointa,Pointb):
        """计算点到直线的距离
            PointP:定点坐标
            Pointa:直线a点坐标
            Pointb:直线b点坐标
        """
        #求直线方程
        A=0
        B=0
        C=0
        A=Pointa[1]-Pointb[1]
        B=Pointb[0]-Pointa[0]
        C=Pointa[0]*Pointb[1]-Pointa[1]*Pointb[0]
        #代入点到直线距离公式
        distance=0
        distance=(A*PointP[0]+B*PointP[1]+C)/math.sqrt(A*A+B*B)
        
        return distance
    

     

    展开全文
  • 线段距离

    千次阅读 2019-10-11 09:18:23
    线段最短距离的运算与到直线的最短距离的运算二者之间存在一定的差别,即求线段最短距离时需要考虑参考在沿线段方向的投影是否在线段上,若在线段上才可采用到直线距离公式,如图1所示。 具体...

    之前编程上有个小错误,应该算点到线段的距离,结果算成了点到直线的距离,导致bug。今天就来记载一下,这两个的数学上的区别和代码上的差异。


    点到线段最短距离的运算与点到直线的最短距离的运算二者之间存在一定的差别,即求点到线段最短距离时需要考虑参考点在沿线段方向的投影点是否在线段上,若在线段上才可采用点到直线距离公式,如图1所示。

    具体算法主要有以下三种:

    1、方法——经典算法

    该算法直接用高中时所学习到的解析几何知识对点到线段的距离进行求解。其基本思想是先判断点在线段端点、点在线上等等的特殊情况,逐步的由特殊到一般,当忽略点在线段上的特殊情况时,判断点到线段方向的垂线是否落在线段上的方法是通过比较横纵坐标的方式来判断,最后把不同的判断情况用不同的几何方式来进行处理计算得出结果。

    由上面叙述的基本思路可以知道这种算法虽然很容易理解和接受,但从算法的实用性的角度分析还是有很大的缺点的,首先是算法复杂,计算量巨大,大量的比较判断、距离计算、角度计算等等,实际应用中往往是需要求由大量线段组成的折线到某点的最短距离,如此用这样的算法计算量是不能想象的。其次经典算法中使用的一些简化运算的函数不利于语言的重新包装,如果想换编程语言的话,就比较麻烦了。

    2、方法二——面积算法

    该方法主要是先判断投影点是否在线段上,投影点在线段延长线上时,最短距离长度为点到端点的线段长度;当投影点在线段上时,先使用海伦公式计算三角形面积,再计算出三角形的高,即为最短距离。

    运用面积算法求解点到线段最短距离思路很清晰,也很容易理解。从效率方面考虑,比如需要多次计算平方、根号,这对于大量数据进行运算是负担很重的。求面积就必须把三条边长全部求出,并且用到的海伦公式也需要进行开方运算,计算过程显得繁琐。

    3、方法三——矢量算法

    矢量算法过程清晰,如果具有一定的空间几何基础,则是解决此类问题时应优先考虑的方法。当需要计算的数据量很大时,这种方式优势明显。由于矢量具有方向性,故一些方向的判断直接根据其正负号就可以得知,使得其中的一些问题得以很简单的解决。用此方法考虑,我们只需要找到向量 方向上的投影,具体如下:

    上面的 方向上的单位向量,其意义是给所求向量确定方向。是的两个向量的内积,且   ,其中θ为向量AP与AB之间的夹角。是向量长度。那么即为上图中线段AC的长度值,不带有方向性。此数值与上述表征方向的 整体构成有大小、有方向的新向量,即为 方向上的投影向量,C为投影点。根据得到的,由向量的方向性可知:

    如果情况是上图(A)所示,那么0<r<1;

    (B)所示的情况,那么r ≥1;

    (C)所示的情况,那么得到r ≤0;

    特殊情况如点在线段上、点在端点、点在线段延长线上等等的情况全部适用于此公式,只是作为特殊情况出现,无需另作讨论。这也是矢量算法思想的优势所在。

    故根据r值的不同,最短距离                       

    double PointToSegDist(double x, double y, double x1, double y1, double x2, double y2)
    {
    double cross = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1); //|AB*AP|:矢量乘
    if (cross <= 0) return Math.Sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1)); //是|AP|:矢量的大小
      
    double d2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1); //|AB|^2:矢量AB的大小的平方
    if (cross >= d2) return Math.Sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2)); //是|BP|:矢量的大小
      
    double r = cross / d2;  //相似三角形原理求出c点的坐标
    double px = x1 + (x2 - x1) * r;
    double py = y1 + (y2 - y1) * r;
    return Math.Sqrt((x - px) * (x - px) + (py - y) * (py - y));
    }

    换一下变量名这样写:

    double pointToSegDistance2D(glm::vec2 p, glm::vec2 l1, glm::vec2 l2)
    {
    	glm::vec2 line_vec = l2 - l1; //AB
    	glm::vec2 point_vec = p - l1; //AP
    	double c = glm::dot(line_vec, point_vec); //|AB*AP|
    	if (c <= 0) return (glm::length(point_vec)); //|AP|
    
    	double d = pow(glm::length(line_vec), 2); //|AB|^2
    	if (c >= d) return (glm::length(p - l2)); //|BP|
    
    	double r = c / d; //相似三角形求出c点的坐标
    	double px = l1.x + (l2.x - l1.x)*r;
    	double py = l1.y + (l2.y - l1.y)*r;
    	glm::vec2 p_shadow = glm::vec2(px, py); //投影点c
    
    	return (glm::length(p - p_shadow)); //|CP|
    
    
    }

    如果是点到直线的距离,那就不用考虑那么多了:

    double pointToLineDistance2D(glm::vec2 p, glm::vec2 l1, glm::vec2 l2)
    {
    	assert(p != l1&&p != l2);
    	glm::vec2 line_vec = l2 - l1; //AB
    	glm::vec2 point_vec = p - l1; //AP
    	double d = glm::dot(line_vec, point_vec) / glm::length(line_vec); //投影的长度 |AC|
    	return (sqrt(pow(glm::length(point_vec), 2) - pow(d, 2))); //勾股定理:|CP| = sqrt(AP^2-AC^2)
    }

    试了一下程序,果然效果不错。我真是个小机灵鬼~


    本文参考博客:

    https://www.cnblogs.com/flyinggod/p/9359534.html

    https://blog.csdn.net/qq_41890797/article/details/82822519

    https://blog.csdn.net/love_phoebe/article/details/81112531

    展开全文
  • 线段距离 计算几何

    千次阅读 2018-07-19 21:27:16
    线段距离种可能,如果线段的垂直线与线段所在直线的交点在线段上,所求的距离就是点线段距离 如果是在射线上,就是点到射线一端的距离...
  • 以下代码是以Scorpio(天蝎座)的语法编写的,其中的“ array.add”...//两点之间距离 Tool.Distance = function (a, b) { var L = Vector3.Distance(a, b); print(L); return L; } //点到线段距离 Tool.Dist...
  • 线段间最短距离

    千次阅读 2014-05-23 10:14:01
    s1, s2上距离最近的两点之间的距离d(s1,s2),定义为。分为三种情况讨论。 a. 若两线段有交点,距离d为0 b. 计算两线段端点到对方线段所在直线l1, l2的距离。  d(p1a,l2), d(p1b,l2), d(p2a,l1),d(p2b,l1) ...
  • 两点坐标(X1,Y1),(X2,Y2),计算并输出两点间距离。 输入 输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。 输出 对于每组输入数据,输出一行,结果保留两位小数。 样例...
  • java怎么求线段距离

    千次阅读 2017-03-21 10:49:27
    线段距离,不是直线
  • (取自定位导航项目)哇!这不就是一道初中的数学题嘛!But... 已知三点 A(m,n),B(P,q),C(s,f),并且坐标都是已知的。通过直线方程 y=kx+b及A、B两点,可...则直线方程已知,通过两点间距离公式,可以求...
  • 地球上两点间最短距离及计算方法

    万次阅读 2014-01-18 14:11:09
    地球上两点间最短距离及走法 一、为什么说“地球表面两地... 如上左图所示:AB两点间最短距离线段AB,即图中较粗的黑线。从其他的①—⑤弧线可以看出二个特点:一是都长于线段AB,二是从①到⑤逐步变短。因此我们可
  • 如上图所示,我们已经知道A(Lng1,Lat1)和B(Lng2,Lat2)的经纬度,所以有 ∠AOE =Lat1, ∠BOF=Lat2, ∠EOF=Lng2-Lng1.现在我们要求B相对于A方位角,等价于求二面角C-OA-B. 首先我们先求∠AOB.由三面角余弦定理...
  • 使用类的组合(线段Line类中包含Point类成员): #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; //Point类的定义 class Point { public: Point(int xx = 0, int yy ...
  • 代码实现 求线段的最短距离

    千次阅读 2019-05-30 16:22:07
    线段最短距离的运算与到直线的最短距离的运算二者之间存在一定的差别,即求线段最短距离时需要考虑参考在沿线段方向的投影是否在线段上,若在线段上才可采用到直线距离公式,如图1所示。 1、方法...
  • 一种线段的最短距离的方法

    千次阅读 2019-08-20 11:37:25
    一种点到线段的最短距离的方法 ...直线方程由经过两点A (x1,y1) 和 C (x2,y2)确定: B = A + u (C - A) (1-9) 其中u为0到1之间的值,线段AC上的点B (x,y)是最靠近D的点,并且满足下面关系: (D - B) ...
  • 友元函数计算两点间距离

    千次阅读 2016-06-08 13:38:28
    /* ... *All rights reserved. *文件名称:text.cpp *作者:陈腾 *完成日期:2016年6月8日 ...问题描述:用友元函数计算两点间距离 */#include #include using namespace std; class Point { public:
  • 线段的最短距离算法

    千次阅读 2019-07-09 11:25:35
    线段最短距离的运算与到直线的最短距离的运算二者之间存在一定的差别,即求线段最短距离时需要考虑参考在沿线段方向的投影是否在线段上,若在线段上才可采用到直线距离公式,如图1所示。 图1(a...
  • c# 线段距离

    千次阅读 2018-01-12 17:00:15
    // 计算两点之间的距离 private double lineSpace(double x1, double y1,double x2, double y2) { double lineLength = 0; lineLength = Math.Sqrt((x1 - x2) * (x1
  • //输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间距离。 #include<math.h> int main() { float x1,y1,x2,y2,len; printf("请输入两个点\n"); while(scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&...
  • 提出一种在经纬坐标系中,计算线段距离的简单方法,这种方法比较实用,而且不存在二次误差,实用于广大求偏航、出区域等算法中
  • 当要运算两点距离时,我见不少人都是用最原始的运算方法,其实2.0开始就有了Point类,可以计算两点距离,除此之外,Point类还可用于计算矢量,某些看似复杂的计算,用上Point类就会变得简单。当然,要巧用Point类...
  • 线段距离计算方法

    千次阅读 2019-09-23 17:11:03
    C到线段AB的距离计算有以下几种计算方法 和到直线的距离计算方式不一样,直线是无限延伸的所以直接计算即可,但由于线段的位置不确定,所以我们不管使用何种办法都需要判断线段的位置关系,其存在以下...
  • 线段的最短距离

    千次阅读 2016-01-15 20:55:02
    线段最短距离的运算与到直线的最短距离的运算二者之间存在一定的差别,即求线段最短距离时需要考虑参考在沿线段方向的投影是否在线段上,若在线段上才可采用到直线距离公式,如图1所示。 图1 ...
  • 如何使用Origin绘制两点线段

    千次阅读 2020-10-26 15:02:44
    2、选中A(X)和B(Y)列,点击菜单栏的“绘图”选项,选择“点线图”下的“2点线段图”,如下所示 自动生成图表如下所示: 3、修改线条样式:双击图表,打开“绘图细节”对话框,左侧边栏选中当前数据,...
  • //计算线段距离 public double pointToLine(Vector2 point,LineBase line) { //距离 double distance =0; //线段的起点与终点 Vector2 start = new Vector2(line.startpoint.x,line.startpoint.z); ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,830
精华内容 12,332
关键字:

两点间距离就是两点间线段