GIS中的基本算法之判断点是否在直线上

来源:互联网 发布:怪物世界源码 编辑:程序博客网 时间:2024/06/14 04:17

        注:算法的原理描述均来自《地理信息系统算法基础》一书;

        原理:设点为Q,线段为P1P2,判断点Q在线段上的依据是:(Q-P1)×(P2-P1)=0(注意这里的减法和乘法均是向量算法,有不懂向量运算原理的可以在网上搜一下)且Q在以P1P2为对角定点的矩形内。前者保证Q点在直线上,后者保证Q点不在线段的延长线或反向延长线上,这一步骤其实就是分别判断一下Q点的x、y坐标是否在P1、P2点的x、y坐标之间;

       实现:

    #region==判断点是否在直线上 ==    /// <summary>    /// Determines whether [is point on line] [the specified points].    /// </summary>    /// <param name="points">The point.</param>    /// <param name="lineStartPoint">The line start point.</param>    /// <param name="lineEndPoint">The line end point.</param>    /// <returns>    ///   <c>true</c> if [is point on line] [the specified points]; otherwise, <c>false</c>.    /// </returns>    public static bool isPointOnLine(Point point,Point lineStartPoint,Point lineEndPoint )    {        //(P-P1)*(P2-P1)=0 向量差乘是否为0;         double X21,Y21,X10,Y10;        X21 = lineEndPoint.X-lineStartPoint.X;        Y21 = lineEndPoint.Y-lineStartPoint.Y;        X10 = point.X-lineStartPoint.X;        Y10 = point.Y-lineStartPoint.Y;        //向量乘积为0则该点在线上        double vectorValue = X21*Y10-X10*Y21;        if (vectorValue != 0.0)        return  false;        else        {            double xMin = Math.Min(lineStartPoint.X,lineEndPoint.X);            double xMax = Math.Max(lineEndPoint.X,lineStartPoint.X);            double yMin = Math.Min(lineStartPoint.Y,lineEndPoint.Y);            double yMax = Math.Max(lineEndPoint.Y,lineStartPoint.Y);            //判断点是否是在该线的延长线上            if (xMin <= point.X && point.X <= xMax && yMin <= point.Y && point.Y <= yMax)                return true;            else                return false;        }       }    #endregion