用点乘求点到线段的距离

  1. #include <cstdio>
  2. #include <cmath>
  3. struct POINT
  4. {
  5. double x,y;
  6. void Offset(POINT A) //相对A偏移
  7. {
  8.    x=x+A.x;
  9.    y=y+A.y;
  10. }
  11. POINT   operator - ( POINT &A )
  12. {
  13.    POINT X;
  14.    X.x = x-A.x;
  15.    X.y = y-A.y;
  16.    return X;
  17. }
  18. };
  19. double Dist(POINT A, POINT B,bool sqr=1)
  20. {
  21.      double x = A.x - B.x;
  22.      double y = A.y - B.y;
  23. if(sqr)
  24.    return sqrt(x*x+y*y);
  25. else
  26.    return x*x + y*y;
  27. }
  28. double Pnt2SegmentDist(POINT A, POINT B, POINT C)
  29. {
  30.      POINT AB = B - A; //向量AB
  31.      POINT AC = C - A;
  32.      double r = AB.x * AC.x + AB.y * AC.y;//AB与AC的点乘积
  33.      r /= Dist(A,B,0);//AC在AB上的投影比上AB。调用Dist(),不开方
  34.      //若C的投影在AB外
  35.      if(r < 0)
  36.          return Dist(A, C);//调用Dist(),开方
  37.      if(r > 1)
  38.          return Dist(B, C);
  39.      //若C的投影在AB之间
  40.      POINT D = AB;
  41.      D.x *= r;
  42.      D.y *= r;//因为AB是向量,所以可以这样做。得到AC在AB上的投影向量。
  43.      D.Offset(A);//点D的绝对坐标
  44.      return Dist(C, D);
  45. }
  46. int main()
  47. {
  48. // freopen("a.txt","r",stdin);
  49. POINT A,B,C;
  50. while(scanf("%lf%lf%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y)!=EOF)
  51. {
  52.    printf("%lf/n",Pnt2LineDist(A,B,C));
  53. }
  54. return 0;
  55. }
转载自: http://hi.baidu.com/dsa343/blog/item/9687a6bf9d4f920918d81fd5.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值