博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
点到线段的距离
阅读量:2436 次
发布时间:2019-05-10

本文共 1617 字,大约阅读时间需要 5 分钟。

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

 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);//如果是锐角,返回计算得到的距离
            }

        }

你可能感兴趣的文章
一个过滤重复数据的sql语句(转)
查看>>
SQL语言快速入门(转)
查看>>
简单SQL语句小结(转)
查看>>
跟我学SQL(转)
查看>>
SQL语法参考手册(转)
查看>>
Oracle SQL性能优化系列讲座之三(转)
查看>>
全面接触SQL语法(转)
查看>>
Sql语句密码验证安全漏洞(转)
查看>>
数据库设计三大范式应用实例剖析(转)
查看>>
关系型数据库系统简介(转)
查看>>
数据挖掘技术简介(转)
查看>>
为数据库建立索引(转)
查看>>
合理选择数据挖掘工具(转)
查看>>
数据库设计范式深入浅出(转)
查看>>
数据库规范化三个范式应用实例(转)
查看>>
XML与面向Web的数据挖掘技术(转)
查看>>
创新性应用 数据建模经验谈(转)
查看>>
网络数据库的复制和同步(转)
查看>>
Word 2003 视频教程-Word 字体颜色设置(转)
查看>>
Word 2003 视频教程-Word 字体对齐方式(转)
查看>>