示例#1
0
文件: Crossing.cs 项目: Shahabz/crm
    public static CrossResultRec GetCrossing(Vector2 p11, Vector2 p12,    // координаты первого отрезка
                                             Vector2 p21, Vector2 p22)    // координаты второго отрезка
    {
        CrossResultRec result = new CrossResultRec();

        // знаменатель
        float Z = (p12.y - p11.y) * (p21.x - p22.x) - (p21.y - p22.y) * (p12.x - p11.x);
        // числитель 1
        float Ca = (p12.y - p11.y) * (p21.x - p11.x) - (p21.y - p11.y) * (p12.x - p11.x);
        // числитель 2
        float Cb = (p21.y - p11.y) * (p21.x - p22.x) - (p21.y - p22.y) * (p21.x - p11.x);

        // если числители и знаменатель = 0, прямые совпадают
        if ((Z == 0) && (Ca == 0) && (Cb == 0))
        {
            result.type = enumCrossType.ctSameLine;
            return(result);
        }


        // если знаменатель = 0, прямые параллельны
        if (Z == 0)
        {
            result.type = enumCrossType.ctParallel;
            return(result);
        }


        float Ua = Ca / Z;
        float Ub = Cb / Z;

        result.pt.x = p11.x + (p12.x - p11.x) * Ub;
        result.pt.y = p11.y + (p12.y - p11.y) * Ub;

        // если 0<=Ua<=1 и 0<=Ub<=1, точка пересечения в пределах отрезков
        if ((0 <= Ua) && (Ua <= 1) && (0 <= Ub) && (Ub <= 1))
        {
            if ((Ua == 0) || (Ua == 1) || (Ub == 0) || (Ub == 1))
            {
                result.type = enumCrossType.ctOnBounds;
            }
            else
            {
                result.type = enumCrossType.ctInBounds;
            }
        }
        // иначе точка пересечения за пределами отрезков
        else
        {
            result.type = enumCrossType.ctOutBounds;
        }

        return(result);
    }
示例#2
0
文件: Vector2.cs 项目: tirinox/Rays
        //**************************************************************
        //  Crossing()
        //  проверка пересечения двух отрезков
        //**************************************************************
        public static CrossResultRec Crossing(
            Vector2 p11, Vector2 p12,  // координаты первого отрезка
            Vector2 p21, Vector2 p22)  // координаты второго отрезка
        {
            CrossResultRec result = new CrossResultRec();

            // знаменатель
            double Z = (p12.y - p11.y) * (p21.x - p22.x) - (p21.y - p22.y) * (p12.x - p11.x);
            // числитель 1
            double Ca = (p12.y - p11.y) * (p21.x - p11.x) - (p21.y - p11.y) * (p12.x - p11.x);
            // числитель 2
            double Cb = (p21.y - p11.y) * (p21.x - p22.x) - (p21.y - p22.y) * (p21.x - p11.x);

            // если числители и знаменатель = 0, прямые совпадают
            if ((Math.Abs(Z) < Tracer3D.GeometryEpsilon) && (Ca == 0) && (Cb == 0))
            {
                result.type = EnumCrossType.ctSameLine;
                return(result);
            }


            // если знаменатель = 0, прямые параллельны
            if (Math.Abs(Z) < Tracer3D.GeometryEpsilon)
            {
                if (ThreePointOnTheLine(p11, p12, p21))
                {
                    result.type = EnumCrossType.ctOnLine;
                }
                else
                {
                    result.type = EnumCrossType.ctParallel;
                }
                return(result);
            }


            double Ua = Ca / Z;
            double Ub = Cb / Z;

            result.pt = new Vector2();

            result.pt.x = p11.x + (p12.x - p11.x) * Ub;
            result.pt.y = p11.y + (p12.y - p11.y) * Ub;

            // если 0<=Ua<=1 и 0<=Ub<=1, точка пересечения в пределах отрезков
            if ((0 <= Ua) && (Ua <= 1) && (0 <= Ub) && (Ub <= 1))
            {
                if ((Ua == 0) || (Ua == 1) || (Ub == 0) || (Ub == 1))
                {
                    result.type = EnumCrossType.ctOnBounds;
                }
                else
                {
                    result.type = EnumCrossType.ctInBounds;
                }
            }
            // иначе точка пересечения за пределами отрезков
            else
            {
                result.type = EnumCrossType.ctOutBounds;
            }

            return(result);
        }
        // координаты второго отрезка
        //**************************************************************
        //  Crossing()
        //  проверка пересечения двух отрезков
        //**************************************************************
        public static CrossResultRec Crossing(
            Point3d p11, Point3d p12,   // координаты первого отрезка
            Point3d p21, Point3d p22)
        {
            CrossResultRec result = new CrossResultRec();

            // знаменатель
            float Z = (p12.Y - p11.Y) * (p21.X - p22.X) - (p21.X - p22.X) * (p12.X - p11.X);
            // числитель 1
            float Ca = (p12.Y - p11.Y) * (p21.X - p11.X) - (p21.Y - p11.Y) * (p12.X - p11.X);
            // числитель 2
            float Cb = (p21.Y - p11.Y) * (p21.X - p22.X) - (p21.Y - p22.Y) * (p21.X - p11.X);

            // если числители и знаменатель = 0, прямые совпадают
            if ((Z == 0) && (Ca == 0) && (Cb == 0))
            {
                result.type = enumCrossType.ctSameLine;
                return result;
            }

            // если знаменатель = 0, прямые параллельны
            if (Z == 0)
            {
                result.type = enumCrossType.ctParallel;
                return result;
            }

            float Ua = Ca / Z;
            float Ub = Cb / Z;

            result.pt = new Point3d();

            result.pt.X = (float)(p11.X + (p12.X - p11.X) * Ub);
            result.pt.Y = (float)(p11.Y + (p12.Y - p11.Y) * Ub);

            // если 0<=Ua<=1 и 0<=Ub<=1, точка пересечения в пределах отрезков
            if ((0 <= Ua) && (Ua <= 1) && (0 <= Ub) && (Ub <= 1))
            {
                result.type = ((Ua == 0) || (Ua == 1) || (Ub == 0) || (Ub == 1)) ?
                     enumCrossType.ctOnBounds :
                     enumCrossType.ctInBounds;
            }
            // иначе точка пересечения за пределами отрезков
            else
            {
                result.type = enumCrossType.ctOutBounds;
            }

            return result;
        }