点到线段的距离

点到线段的距离

这是点到线段的距离 不是点到直线的距离:

 public double PointLine_Disp(double xx, double yy, double x1, double y1, double x2, double y2)
        {
            double a, b, c, ang1, ang2, ang, m;
            double result = 0;
            //分别计算三条边的长度
            a = Math.Sqrt((x1 - xx) * (x1 - xx) + (y1 - yy) * (y1 - yy));
            if (a == 0)
                return -1;
            b = Math.Sqrt((x2 - xx) * (x2 - xx) + (y2 - yy) * (y2 - yy));
            if (b == 0)
                return -1;
            c = Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
            //如果线段是一个点则退出函数并返回距离
            if (c == 0)
            {
                result = a;
                return result;
            }
            //如果点(xx,yy到点x1,y1)这条边短
            if (a < b)
            {
                //如果直线段AB是水平线。得到直线段AB的弧度
                if (y1 == y2)
                {
                    if (x1 < x2)
                        ang1 = 0;
                    else
                        ang1 = Math.PI;
                }
                else
                {
                    m = (x2 - x1) / c;
                    if (m - 1 > 0.00001)
                        m = 1;
                    ang1 = Math.Acos(m);
                    if (y1 >y2)
                        ang1 = Math.PI*2  - ang1;//直线(x1,y1)-(x2,y2)与折X轴正向夹角的弧度
                }
                m = (xx - x1) / a;
                if (m - 1 > 0.00001)
                    m = 1;
                ang2 = Math.Acos(m);
                if (y1 > yy)
                    ang2 = Math.PI * 2 - ang2;//直线(x1,y1)-(xx,yy)与折X轴正向夹角的弧度
               
                ang = ang2 - ang1;
                if (ang < 0) ang = -ang;
               
                if (ang > Math.PI) ang = Math.PI * 2 - ang;
                //如果是钝角则直接返回距离
                if (ang > Math.PI / 2)
                    return a;
                else
                    return a * Math.Sin(ang);
            }
            else//如果(xx,yy)到点(x2,y2)这条边较短
            {
                //如果两个点的纵坐标相同,则直接得到直线斜率的弧度
                if (y1 == y2)
                    if (x1 < x2)
                        ang1 = Math.PI;
                    else
                        ang1 = 0;
                else
                {
                    m = (x1 - x2) / c;
                    if (m - 1 > 0.00001)
                        m = 1;
                    ang1 = Math.Acos(m);
                    if (y2 > y1)
                        ang1 = Math.PI * 2 - ang1;
                }
                m = (xx - x2) / b;
                if (m - 1 > 0.00001)
                    m = 1;
                ang2 = Math.Acos(m);//直线(x2-x1)-(xx,yy)斜率的弧度
                if (y2 > yy)
                    ang2 = Math.PI * 2 - ang2;
                ang = ang2 - ang1;
                if (ang < 0) ang = -ang;
                if (ang > Math.PI) ang = Math.PI * 2 - ang;//交角的大小
                //如果是对角则直接返回距离
                if (ang > Math.PI / 2)
                    return b;
                else
                    return b * Math.Sin(ang);//如果是锐角,返回计算得到的距离
            }
        }


javascript版本 :


<script type="text/javascript">
     function PointLine_Disp(xx, yy, x1, y1, x2, y2)
     {
        var a, b, c, ang1, ang2, ang, m;
            var result = 0;
            //分别计算三条边的长度
            a = Math.sqrt((x1 - xx) * (x1 - xx) + (y1 - yy) * (y1 - yy));
            if (a == 0)
                return -1;
            b = Math.sqrt((x2 - xx) * (x2 - xx) + (y2 - yy) * (y2 - yy));
            if (b == 0)
                return -1;
            c = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
            //如果线段是一个点则退出函数并返回距离
            if (c == 0)
            {
                result = a;
                return result;
            }
            //如果点(xx,yy到点x1,y1)这条边短
            if (a < b)
            {
                //如果直线段AB是水平线。得到直线段AB的弧度
                if (y1 == y2)
                {
                    if (x1 < x2)
                        ang1 = 0;
                    else
                        ang1 = Math.PI;
                }
                else
                {
                    m = (x2 - x1) / c;
                    if (m - 1 > 0.00001)
                        m = 1;
                    ang1 = Math.acos(m);
                    if (y1 >y2)
                        ang1 = Math.PI*2  - ang1;//直线(x1,y1)-(x2,y2)与折X轴正向夹角的弧度
                }
                m = (xx - x1) / a;
                if (m - 1 > 0.00001)
                    m = 1;
                ang2 = Math.acos(m);
                if (y1 > yy)
                    ang2 = Math.PI * 2 - ang2;//直线(x1,y1)-(xx,yy)与折X轴正向夹角的弧度
               
                ang = ang2 - ang1;
                if (ang < 0) ang = -ang;
               
                if (ang > Math.PI) ang = Math.PI * 2 - ang;
                //如果是钝角则直接返回距离
                if (ang > Math.PI / 2)
                    return a;
                else
                    return a * Math.sin(ang);
            }
            else//如果(xx,yy)到点(x2,y2)这条边较短
            {
                //如果两个点的纵坐标相同,则直接得到直线斜率的弧度
                if (y1 == y2)
                    if (x1 < x2)
                        ang1 = Math.PI;
                    else
                        ang1 = 0;
                else
                {
                    m = (x1 - x2) / c;
                    if (m - 1 > 0.00001)
                        m = 1;
                    ang1 = Math.acos(m);
                    if (y2 > y1)
                        ang1 = Math.PI * 2 - ang1;
                }
                m = (xx - x2) / b;
                if (m - 1 > 0.00001)
                    m = 1;
                ang2 = Math.acos(m);//直线(x2-x1)-(xx,yy)斜率的弧度
                if (y2 > yy)
                    ang2 = Math.PI * 2 - ang2;
                ang = ang2 - ang1;
                if (ang < 0) ang = -ang;
                if (ang > Math.PI) ang = Math.PI * 2 - ang;//交角的大小
                //如果是对角则直接返回距离
                if (ang > Math.PI / 2)
                    return b;
                else
                    return b * Math.sin(ang);//如果是锐角,返回计算得到的距离
            }
     }

</script>


转与:http://blog.sina.com.cn/s/blog_a401a1ea0101a1sj.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值