SuperMap.WindowsPhone.Core.GeoRegion.IntersectLineSect C# (CSharp) Method

IntersectLineSect() private method

private IntersectLineSect ( double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, Point2D &result ) : bool
x1 double
y1 double
x2 double
y2 double
x3 double
y3 double
x4 double
y4 double
result Point2D
return bool
        private bool IntersectLineSect(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, out Point2D result)
        {
            result = Point2D.Empty;
            bool flag = false;
            double de = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);

            if (Math.Abs(de) > SMALL_VALUE)
            {
                double ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / de;

                if ((ub > (-SMALL_VALUE)) && ub < (1 + SMALL_VALUE))
                {
                    flag = true;
                }
                else
                {
                    flag = false;
                }
            }
            else
            {
                flag = false;
            }

            if (flag)
            {
                if (Math.Abs(x1 - x2) < SMALL_VALUE)
                {
                    result.X = x1;
                    result.Y = ((y3 - y4) * x1 + x3 * y4 - x4 * y3) / (x3 - x4);
                }
                else if (Math.Abs(x3 - x4) < SMALL_VALUE)
                {
                    result.X = x3;
                    result.Y = ((x1 - y2) * x3 + x1 * y2 - x2 * y1) / (x1 - x2);
                }
                else if (Math.Abs(y1 - y2) < SMALL_VALUE)
                {
                    result.Y = y1;
                    result.X = ((x3 - x4) * y1 + y3 * x4 - y4 * x3) / (y3 - y4);
                }
                else if (Math.Abs(y3 - y4) < SMALL_VALUE)
                {
                    result.Y = y3;
                    result.X = ((x1 - x2) * y3 + y1 * x2 - y2 * x1) / (y1 - y2);
                }
                else
                {
                    double k1 = (y1 - y2) / (x1 - x2);
                    double k2 = (y3 - y4) / (x3 - x4);
                    double b1 = (x2 * y1 - y2 * x1) / (x2 - x1);
                    double b2 = (x4 * y3 - y4 * x3) / (x4 - x3);

                    result.X = (b2 - b1) / (k1 - k2);
                    result.Y = (b1 * k2 - b2 * k1) / (k2 - k1);
                }
            }

            return flag;
        }
        /// <summary>${core_GeoRegion_method_GetBounds_D}</summary>