Esempio n. 1
0
        /// <summary>
        /// Сравнение двух линий в трёхмерном пространстве
        /// </summary>
        /// <param name="firstLine">Первая сравниваемая линия</param>
        /// <param name="secondLine">Вторая сравниваемая линия</param>
        /// <param name="precision">Шаг сетки</param>
        /// <param name="compliance">Ожидаемая степень соответствия, где 1 - полное соответствие</param>
        /// <returns>ИСТИНА - если линии совпали</returns>
        public bool LineCompare3D(List <Coordinate> firstLine, List <Coordinate> secondLine, double precision,
                                  double compliance)
        {
            if (!(compliance > 0 && compliance <= 1))
            {
                throw new Exception($"Степень соответствия должна принимать значение в диапазоне (0;1], актуальное значение {compliance}");
            }

            if (firstLine.Count == 0 && secondLine.Count == 0)
            {
                return(true);
            }
            if (firstLine.Count == 0 || secondLine.Count == 0)
            {
                return(false);
            }

            // Найти точку, которая станет началом координат
            var unated = firstLine.Concat(secondLine).ToList();
            var minX   = unated.Min(n => n.Lon) - precision * 0.5;
            var minY   = unated.Min(n => n.Lat) - precision * 0.5;
            var minZ   = unated.Min(n => n.H) - precision * 0.5;
            var origin = new Coordinate(minX, minY, minZ);

            var comparer = new LineSpatialIndexesService(precision, origin);

            return(Compare3D(comparer.GetLineSpatial3DIndexes(firstLine), comparer.GetLineSpatial3DIndexes(secondLine), compliance));
        }
Esempio n. 2
0
        /// <summary>
        /// Сравнение двух линий
        /// </summary>
        /// <param name="firstLine">Первая сравниваемая линия</param>
        /// <param name="secondLine">Вторая сравниваемая линия</param>
        /// <param name="precision">Шаг сетки</param>
        /// <param name="compliance">Ожидаемая степень соответствия, где 1 - полное соответствие</param>
        /// <param name="origin">Точка начала координат</param>
        /// <returns>ИСТИНА - если линии совпали</returns>
        public bool LineCompare2D(List <Coordinate> firstLine, List <Coordinate> secondLine, double precision,
                                  double compliance, Coordinate origin)
        {
            if (!(compliance > 0 && compliance <= 1))
            {
                throw new Exception($"Степень соответствия должна принимать значение в диапазоне (0;1], актуальное значение {compliance}");
            }

            if (firstLine.Count == 0 && secondLine.Count == 0)
            {
                return(true);
            }
            if (firstLine.Count == 0 || secondLine.Count == 0)
            {
                return(false);
            }

            var comparer = new LineSpatialIndexesService(precision, origin);

            return(Compare2D(comparer.GetLineSpatial2DIndexes(firstLine), comparer.GetLineSpatial2DIndexes(secondLine), compliance));
        }