找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 214|回复: 0

点至直线的距离和垂足点计算

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-16 09:56:50 | 显示全部楼层 |阅读模式
  1.     //点到直线的垂足点
  2.     public static Coordinate getFootPoint(Coordinate point, Coordinate pnt1, Coordinate pnt2)
  3.     {
  4.         double A=pnt2.y-pnt1.y;     //y2-y1
  5.         double B=pnt1.x-pnt2.x;     //x1-x2;
  6.         double C=pnt2.x*pnt1.y-pnt1.x*pnt2.y;     //x2*y1-x1*y2
  7.         if (A * A + B * B < 1e-13) {
  8.             return pnt1;   //pnt1与pnt2重叠
  9.         }
  10.         else if (Math.abs(A * point.x + B * point.y + C) < 1e-13) {
  11.             return point;   //point在直线上(pnt1采用pnt2)
  12.         }
  13.         else {
  14.             double x = (B * B * point.x - A * B * point.y - A * C) / (A * A + B * B);
  15.             double y = (-A * B * point.x + A * A * point.y - B * C) / (A * A + B * B);
  16.             Coordinate fpoint = new Coordinate();
  17.             fpoint.x = x;
  18.             fpoint.y = y;
  19.             return fpoint;
  20.         }
  21.     }
  22.     public static double getDistancePoineToLine采用planeCoord(Coordinate point, Coordinate pnt1, Coordinate pnt2)
  23.     {   //平面坐标中
  24.         double A=pnt2.y-pnt1.y;     //y2-y1
  25.         double B=pnt1.x-pnt2.x;     //x1-x2;
  26.         double C=pnt2.x*pnt1.y-pnt1.x*pnt2.y;     //x2*y1-x1*y2
  27.         if (A * A + B * B < 1e-13) {   //pnt1与pnt2重叠
  28.             double dx = point.x - pnt1.x;
  29.             double dy = point.y - pnt1.y;
  30.             return Math.sqrt(dx * dx + dy * dy);
  31.         }
  32.         else if (Math.abs(A * point.x + B * point.y + C) < 1e-13) {
  33.             return 0;   //point在直线上(pnt1采用pnt2)
  34.         }
  35.         else {
  36.             double distance = Math.abs(A * point.x + B * point.y + C) / Math.sqrt(A * A + B * B);
  37.             return distance;
  38.         }
  39.     }
  40.     public static double getDistance采用wgs84(Coordinate p1, Coordinate p2)
  41.     {
  42.         return getDistance采用wgs84(p1.x,p1.y,p2.x,p2.y);
  43.     }
  44.     //计算两经纬度点的距离,单位米
  45.     public static double getDistance采用wgs84(double p1采用x,double p1采用y, double p2采用x,double p2采用y)
  46.     {
  47.         double lat1=p1采用x;
  48.         double lon1=p1采用y;
  49.         double lat2=p2采用x;
  50.         double lon2=p2采用y;
  51.         //
  52.         double earch采用radius=6371008.8;   // 地球半径 平均值  米
  53.         //用haversine公式计算球面两点间的距离。
  54.         //经纬度转换成弧度
  55.         double h采用lat1=lat1*Math.PI/180.0;
  56.         double h采用lon1=lon1*Math.PI/180.0;
  57.         double h采用lat2=lat2*Math.PI/180.0;
  58.         double h采用lon2=lon2*Math.PI/180.0;
  59.         //差值
  60.         double vlon=Math.abs(h采用lon1-h采用lon2);
  61.         double vlat=Math.abs(h采用lat1-h采用lat2);
  62.         //
  63.         double h=HaverSin(vlat)+Math.cos(h采用lat1)*Math.cos(h采用lat2)*HaverSin(vlon);
  64.         //
  65.         double d=2*earch采用radius*Math.asin(Math.sqrt(h));
  66.         //
  67.         return d;
  68.     }
  69.     public static double HaverSin(double theta)
  70.     {
  71.         double v=Math.sin(theta/2);
  72.         return v*v;
  73.     };
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-27 06:34 , Processed in 0.137255 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表