matlab算点到线段的垂足,点至直线的距离和垂足点计算

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

//点到直线的垂足点

public static Coordinate getFootPoint(Coordinate point, Coordinate pnt1, Coordinate pnt2)

{

double A=pnt2.y-pnt1.y; //y2-y1

double B=pnt1.x-pnt2.x; //x1-x2;

double C=pnt2.x*pnt1.y-pnt1.x*pnt2.y; //x2*y1-x1*y2

if (A * A + B * B < 1e-13) {

return pnt1; //pnt1与pnt2重叠

}

else if (Math.abs(A * point.x + B * point.y + C) < 1e-13) {

return point; //point在直线上(pnt1_pnt2)

}

else {

double x = (B * B * point.x - A * B * point.y - A * C) / (A * A + B * B);

double y = (-A * B * point.x + A * A * point.y - B * C) / (A * A + B * B);

Coordinate fpoint = new Coordinate();

fpoint.x = x;

fpoint.y = y;

return fpoint;

}

}

public static double getDistancePoineToLine_planeCoord(Coordinate point, Coordinate pnt1, Coordinate pnt2)

{ //平面坐标中

double A=pnt2.y-pnt1.y; //y2-y1

double B=pnt1.x-pnt2.x; //x1-x2;

double C=pnt2.x*pnt1.y-pnt1.x*pnt2.y; //x2*y1-x1*y2

if (A * A + B * B < 1e-13) { //pnt1与pnt2重叠

double dx = point.x - pnt1.x;

double dy = point.y - pnt1.y;

return Math.sqrt(dx * dx + dy * dy);

}

else if (Math.abs(A * point.x + B * point.y + C) < 1e-13) {

return 0; //point在直线上(pnt1_pnt2)

}

else {

double distance = Math.abs(A * point.x + B * point.y + C) / Math.sqrt(A * A + B * B);

return distance;

}

}

public static double getDistance_wgs84(Coordinate p1, Coordinate p2)

{

return getDistance_wgs84(p1.x,p1.y,p2.x,p2.y);

}

//计算两经纬度点的距离,单位米

public static double getDistance_wgs84(double p1_x,double p1_y, double p2_x,double p2_y)

{

double lat1=p1_x;

double lon1=p1_y;

double lat2=p2_x;

double lon2=p2_y;

//

double earch_radius=6371008.8; // 地球半径 平均值 米

//用haversine公式计算球面两点间的距离。

//经纬度转换成弧度

double h_lat1=lat1*Math.PI/180.0;

double h_lon1=lon1*Math.PI/180.0;

double h_lat2=lat2*Math.PI/180.0;

double h_lon2=lon2*Math.PI/180.0;

//差值

double vlon=Math.abs(h_lon1-h_lon2);

double vlat=Math.abs(h_lat1-h_lat2);

//

double h=HaverSin(vlat)+Math.cos(h_lat1)*Math.cos(h_lat2)*HaverSin(vlon);

//

double d=2*earch_radius*Math.asin(Math.sqrt(h));

//

return d;

}

public static double HaverSin(double theta)

{

double v=Math.sin(theta/2);

return v*v;

};

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

//点到直线的距离

public static double getDistanceByPointToLine_笛卡尔坐标(Coordinate point, Coordinate pnt1, Coordinate pnt2)

{

double dis = 0;

if (pnt1.x == pnt2.x)

{

if (pnt1.y == pnt2.y)

{

double dx = point.x - pnt1.x;

double dy = point.y - pnt1.y;

dis = Math.sqrt(dx * dx + dy * dy);

}

else

dis = Math.abs(point.x - pnt1.x);

}

else

{

double lineK = (pnt2.y - pnt1.y) / (pnt2.x - pnt1.x);

double lineC = (pnt2.x * pnt1.y - pnt1.x * pnt2.y) / (pnt2.x - pnt1.x);

dis = Math.abs(lineK * point.x - point.y + lineC) / (Math.sqrt(lineK * lineK + 1));

}

//

return dis;

}

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

标签:直线,point,double,垂足,Coordinate,点至,pnt2,Math,pnt1

来源: https://www.cnblogs.com/ly570/p/11154059.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值