//MN - прямая, ABC - точка
        //принадлежность точки к отрезку прямой
        Point4D intersectionPointLine(Point4D M, Point4D N, Point4D A, double eps)
        {
            if (checkPointBelongLine(M, N, A, eps))
            {
                return(A);
            }
            else
            {
                if (A.Equals(M) || A.Equals(N))
                {
                    return(A);
                }
            }

            return(null);
        }
 //MN - точка, ABC - точка
 //Совпадение точек
 Point4D intersectionPoints(Point4D M, Point4D A)
 {
     if (M.Equals(A))
     {
         return(M);
     }
     return(null);
 }
        public Section4D pointsTIntersection(Point4D M, Point4D N, Point4D A, Point4D B, Point4D C, double eps)
        {
            if (checkDegenLine(M, N) == 0 && checkDegenFlat(A, B, C) == 0)
            {
                if (checkLineBelongFlat(M, N, A, B, C) == 1)
                {
                    statusMessage = "Прямая лежит на плоскости";
                    return(new Section4D(M, N));
                }
            }


            //if (checkDegenLine(M, N) == 0 && checkDegenFlat(A, B, C) == 1)
            //    if (checkSameLines(M, N, A, B, eps) == 1 || checkSameLines(M, N, A, C, eps) == 1 || checkSameLines(M, N, B, C, eps) == 1)
            //    {
            //        statusMessage = "Прямая лежит на прямой";
            //        return new Section4D(M, N);
            //    }

            if (checkDegenLine(M, N) == 0 && checkDegenFlat(A, B, C) == 1)
            {
                if (checkSameLines(M, N, A, B, eps) == 1 && !A.Equals(B))
                {
                    statusMessage = "Прямая лежит на прямой";
                    return(new Section4D(M, N));
                }
                if (checkSameLines(M, N, A, C, eps) == 1 && !A.Equals(C))
                {
                    statusMessage = "Прямая лежит на прямой";
                    return(new Section4D(M, N));
                }
                if (checkSameLines(M, N, B, C, eps) == 1 && !B.Equals(C))
                {
                    statusMessage = "Прямая лежит на прямой";
                    return(new Section4D(M, N));
                }
            }
            return(null);
        }
        bool checkPointBelongLine(Point4D M, Point4D N, Point4D A, double eps)
        {
            if (M.Equals(A) || N.Equals(A))
            {
                return(true);
            }
            double t = Math.Abs(calculateCosVectors(N.X - M.X,
                                                    N.Y - M.Y,
                                                    N.Z - M.Z,
                                                    N.W - M.W,
                                                    A.X - M.X,
                                                    A.Y - M.Y,
                                                    A.Z - M.Z,
                                                    A.W - M.W));

            return(1 - eps < t && t < 1 + eps);
        }
        //MN - прямая, ABC - прямая
        //пересечение двух прямых
        Point4D intersectionLines(Point4D M, Point4D N, Point4D A, Point4D B, double eps)
        {
            if (checkСrossLines(M, N, A, B) == 0 &&
                checkSameLines(M, N, A, B, eps) == 0 &&
                checkParallelLines(M, N, A, B, eps) == 0 && !A.Equals(B))
            {
                Point4D Vector = calculateCompositionVectors(B.X - A.X,
                                                             B.Y - A.Y,
                                                             B.Z - A.Z,
                                                             N.X - M.X,
                                                             N.Y - M.Y,
                                                             N.Z - M.Z);

                Point4D Z = new Point4D(Vector.X + A.X, Vector.Y + A.Y, Vector.Z + A.Z, 1);
                Point4D T = intersectionFlatLine(M, N, A, B, Z, eps);
                return(T);
            }
            return(null);
        }
 //вырожденность плоскости в точку (проверка)
 bool checkFlatAtPoint(Point4D A, Point4D B, Point4D C)
 {
     return(A.Equals(B) && B.Equals(C));
 }
        /////////////////////////////////////////////////////////////////////////////////////////////////////

        public Point4D pointTIntersection(Point4D M, Point4D N, Point4D A, Point4D B, Point4D C, double eps, ref Label mesABC, ref Label mesMN)
        {
            Point4D T = null;

            if (checkDegenLine(M, N) == 0 && checkDegenFlat(A, B, C) == 0)
            {
                mesABC.Text = "Плоскость ABC"; mesMN.Text = "Прямая MN";
                T           = intersectionFlatLine(M, N, A, B, C, eps);
                if (T != null)
                {
                    statusMessage = "Пересечение прямой с плоскостью";
                }
                else
                {
                    if (checkLineParallelFlat(M, N, A, B, C, eps) == 1)
                    {
                        statusMessage = "Прямая и плоскость параллельны";
                    }
                    else
                    {
                        statusMessage = "Прямая и плоскость не пересекаются";
                    }
                }

                return(T);
            }

            if (checkDegenLine(M, N) == 0 && checkDegenFlat(A, B, C) == 1)
            {
                if (A.Equals(B))
                {
                    mesABC.Text = "Прямая AC(BC)";
                }
                if (A.Equals(C))
                {
                    mesABC.Text = "Прямая AB(BC)";
                }
                if (B.Equals(C))
                {
                    mesABC.Text = "Прямая AB(AC)";
                }

                mesMN.Text = "Прямая MN";


                if (intersectionLines(M, N, A, B, eps) != null)
                {
                    statusMessage = "Прямые MN и AB пересекаютcя";
                    return(intersectionLines(M, N, A, B, eps));
                }
                else
                {
                    statusMessage = "Прямые MN и AB не пересекаются";
                }

                if (intersectionLines(M, N, B, C, eps) != null)
                {
                    statusMessage = "Прямые MN и BC пересекаютcя";
                    return(intersectionLines(M, N, B, C, eps));
                }
                else
                {
                    statusMessage = "Прямые MN и BC не пересекаются";
                }

                if (intersectionLines(M, N, A, C, eps) != null)
                {
                    statusMessage = "Прямые MN и AC пересекаютcя";
                    return(intersectionLines(M, N, A, C, eps));
                }
                else
                {
                    statusMessage = "Прямые MN и AC не пересекаются";
                }

                if (checkParallelLines(M, N, A, B, eps) == 1 && !A.Equals(B))
                {
                    statusMessage = "Прямые MN и AB параллельны";
                }
                if (checkParallelLines(M, N, A, C, eps) == 1 && !A.Equals(C))
                {
                    statusMessage = "Прямые MN и AC параллельны";
                }
                if (checkParallelLines(M, N, B, C, eps) == 1 && !B.Equals(C))
                {
                    statusMessage = "Прямые MN и BC параллельны";
                }

                if (checkСrossLines(M, N, A, B) == 1)
                {
                    statusMessage = "Прямые MN и AB скрещиваются";
                }
                if (checkСrossLines(M, N, A, C) == 1)
                {
                    statusMessage = "Прямые MN и AC скрещиваются";
                }
                if (checkСrossLines(M, N, B, C) == 1)
                {
                    statusMessage = "Прямые MN и BC скрещиваются";
                }
            }

            if (checkDegenLine(M, N) == 0 && checkDegenFlat(A, B, C) == 2)
            {
                mesABC.Text = "Точка A(B, C)"; mesMN.Text = "Прямая MN";
                T           = intersectionPointLine2(M, N, A, eps);
                if (T != null)
                {
                    statusMessage = "Пересечение прямой с точкой";
                }
                else
                {
                    statusMessage = "Прямая и точка не пересекаются";
                }
                return(T);
            }

            if (checkDegenLine(M, N) == 1 && checkDegenFlat(A, B, C) == 0)
            {
                mesABC.Text = "Плоскость ABC"; mesMN.Text = "Точка M(N)";

                T = intersectionPointFlat(M, A, B, C);
                if (T != null)
                {
                    statusMessage = "Пересечение точки с плоскостью";
                }
                else
                {
                    statusMessage = "Точка и плоскость не пересекаются";
                }
                return(T);
            }

            if (checkDegenLine(M, N) == 1 && checkDegenFlat(A, B, C) == 1)
            {
                if (A.Equals(B))
                {
                    mesABC.Text = "Прямая AC(BC)";
                }
                if (A.Equals(C))
                {
                    mesABC.Text = "Прямая AB(BC)";
                }
                if (B.Equals(C))
                {
                    mesABC.Text = "Прямая AB(AC)";
                }

                mesMN.Text = "Точка M(N)";

                if (intersectionPointLine(A, B, M, eps) != null)
                {
                    T = intersectionPointLine(A, B, M, eps);
                }
                if (intersectionPointLine(B, C, M, eps) != null)
                {
                    T = intersectionPointLine(B, C, M, eps);
                }
                if (intersectionPointLine(A, C, N, eps) != null)
                {
                    T = intersectionPointLine(A, C, N, eps);
                }

                if (T != null)
                {
                    statusMessage = "Пересечение прямой с точкой";
                }
                else
                {
                    statusMessage = "Прямая и точка не пересекаются";
                }
                return(T);
            }

            if (checkDegenLine(M, N) == 1 && checkDegenFlat(A, B, C) == 2)
            {
                mesABC.Text = "Точка A(B, C)"; mesMN.Text = "Точка M(N)";

                T = intersectionPoints(M, A);

                if (T != null)
                {
                    statusMessage = "Пересечение двух точек";
                }
                else
                {
                    statusMessage = "Две точки не пересекаются";
                }
                return(T);
            }
            //statusMessage = "";
            return(null);
        }