Exemplo n.º 1
0
        ///<summary>
        /// Находит ближайшие точки, принадлежащие разным особенностям
        /// </summary>
        public Tuple <Point, int, int, Point, int, int> ClosestFeaturesPoints(List <Point> points)
        {
            var listobl  = BelongingConvexHull(points);
            var features = featuresCount(listobl);

            List <Point> obol = new List <Point>();

            for (int i = 0; i < listobl.Count; i++)
            {
                if (listobl[i])
                {
                    obol.Add(points[i]);
                }
            }


            List <List <Point> > internalLists = new List <List <Point> >();

            for (int i = 0; i < features; i++)
            {
                internalLists.Add(new List <Point>());
            }
            if (!listobl[0] && !listobl[listobl.Count - 1])
            {
                internalLists.Add(new List <Point>());
            }
            //заполнение списков особенностей
            for (int i = 0, j = 0; i < listobl.Count; i++)
            {
                if (!listobl[i])
                {
                    if (i + 1 != listobl.Count)
                    {
                        if (listobl[i + 1])
                        {
                            internalLists[j].Add(points[i]);
                            j++;
                        }
                        else
                        {
                            internalLists[j].Add(points[i]);
                        }
                    }
                    else
                    {
                        if (listobl[0])
                        {
                            internalLists[j].Add(points[i]);
                        }
                        else
                        {
                            internalLists[0].Insert(0, points[i]);
                        }
                    }
                }
            }

            if (!listobl[0] && !listobl[listobl.Count - 1])
            {
                for (int i = internalLists.Last().Count - 1; i >= 0; i--)
                {
                    internalLists[0].Insert(0, (internalLists.Last())[i]);
                    internalLists.Last().RemoveAt(i);
                }
            }

            for (int i = 0; i < internalLists.Count; i++)
            {
                if (internalLists[i].Count == 0)
                {
                    internalLists.RemoveAt(i);
                    i--;
                }
            }

            var prevPoint     = new Point(0, 0); // Точка начала основания особенности
            var nexPoint      = new Point(0, 0); // Точка конца основания оссобенности
            var FeaturePoint  = new Point(0, 0); // Текущая рассматриваемая точка оссобенности
            var osnVector     = new Point(0, 0); // Вектор основания особенности
            var osnNormVector = new Point(0, 0); // Вектор нормали основания особенности

            var length = 999999999999.0;
            var fPoint = new Point(0, 0);
            var sPoint = new Point(0, 0);
            var reti = 0; var retNumi = 0;
            var retk = 0; var retNumk = 0;

            for (int i = 0; i < internalLists.Count; i++)
            {
                for (int j = 0; j < internalLists[i].Count; j++)
                {
                    for (int k = i + 1; k < internalLists.Count; k++)
                    {
                        for (int p = 0; p < internalLists[k].Count; p++)
                        {
                            var len = Point.Length(internalLists[i][j], internalLists[k][p]);

                            if (len < length)
                            {
                                length = len;
                                fPoint = internalLists[i][j]; reti = i; retNumi = j;
                                sPoint = internalLists[k][p]; retk = k; retNumk = p;
                            }
                        }
                    }
                }
            }

            return(new Tuple <Point, int, int, Point, int, int>(fPoint, reti, retNumi, sPoint, retk, retNumk));
        }
Exemplo n.º 2
0
        ///<summary>
        /// Поиск пересечения отрезков
        ///</summary>
        public static List <Point> GetIntersection(Segment first, Segment second)
        {
            Point vectorFirst  = new Point(first.End.X - first.Begin.X, first.End.Y - first.Begin.Y);
            Point vectorSecond = new Point(second.End.X - second.Begin.X, second.End.Y - second.Begin.Y);
            var   poList       = new List <Point>();

            if (vectorFirst.X / vectorSecond.X == vectorFirst.Y / vectorSecond.Y)
            {
                if (Point.Length(first.Begin, first.End) > Point.Length(second.Begin, second.End))
                {
                    if (IsIntersected(second.Begin, first))
                    {
                        poList.Add(second.Begin);
                    }
                    if (IsIntersected(second.End, first))
                    {
                        poList.Add(second.End);
                    }
                }
                else
                {
                    if (IsIntersected(first.Begin, second))
                    {
                        poList.Add(first.Begin);
                    }
                    if (IsIntersected(first.End, second))
                    {
                        poList.Add(first.End);
                    }
                }
            }
            double p = 0, t = 0;
            double a1 = 0, a2 = 0, b1 = 0, b2 = 0, d1 = 0, d2 = 0;

            //Point vectorFirst = new Point(first.End.X - first.Begin.X, first.End.Y - first.Begin.Y);
            //Point vectorSecond = new Point(second.End.X - second.Begin.X, second.End.Y - second.Begin.Y);
            //var poList = new List<Point>();
            d1 = second.Begin.X - first.Begin.X;
            d2 = second.Begin.Y - first.Begin.Y;
            a1 = vectorFirst.X;
            a2 = vectorFirst.Y;
            b1 = vectorSecond.X;
            b2 = vectorSecond.Y;
            if (a1 == 0)
            {
                p = d1 / b1;
                t = (d2 - p * b2) / a2;
            }
            else
            {
                p = d2 - (d1 / a1) * a2;
                p = p / (b2 - (b1 * a2) / a1);

                t = (d1 - b1 * p) / a1;
            }
            p = -p;
            if ((IsIntersected(new Point(first.Begin.X + vectorFirst.X * t, first.Begin.Y + vectorFirst.Y * t), first)) &&
                (IsIntersected(new Point(second.Begin.X + vectorSecond.X * p, second.Begin.Y + vectorSecond.Y * p), second)))
            {
                Point pointInter = new Point(first.Begin.X + vectorFirst.X * t, first.Begin.Y + vectorFirst.Y * t);
                poList.Add(pointInter);
            }
            //if ((p <= 1) && (p >= 0) && (t <= 1) && (t >= 0))

            return(poList);
        }