///<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)); }
///<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); }