// Поиск пересечения отрезков //public static List<Point> GetIntersection(Segment first, Segment second) //{ // double a1, b1; // параметрические координаты первой прямой // double a2, b2; // параметрические координаты второй прямой // double x, y;// коодинаты пересечения двух прямых // if ((first.Begin.X != first.End.X) && (second.Begin.X != second.End.X)) // проверка на совпадение коээфицентов при X // { // a1 = (first.Begin.Y - first.End.Y) / (first.Begin.X - first.End.X); // b1 = first.Begin.Y - first.Begin.X * a1; // a2 = (second.Begin.Y - second.End.Y) / (second.Begin.X - second.End.X); // b2 = second.Begin.Y - second.Begin.X * a2; // if (a1 != a2) // { // x = (b2 - b1) / (a1 - a2); // y = a1 * x + b1; // Point inter = new Point(x, y); // if ((Intersect.IsIntersected(inter, first)) && (Intersect.IsIntersected(inter, second))) // { // return new List<Point> { inter }; // } // } // } // return new List<Point>(); //} //Поиск точки основания стрелочки public static Point GetArrowBase(Point begin, Point end) { Segment segment = new Segment(begin, end); Circle circle = new Circle(end, 1); var c = GetIntersection(segment, circle); return c[0]; }
/// <summary> /// Обрабатывает клик мыши по редактируемой карте /// </summary> private void canvasClick(object sender, MouseButtonEventArgs e) { System.Windows.Point pos = Mouse.GetPosition(sender as ContentControl); Geometry.Figures.Point point = UserInterface.Transformer.ConvertToModel(new Geometry.Figures.Point(pos.X, pos.Y)); if (flag) { addModel(point); } else { if (selectShapes.IsChecked == true && !(e.OriginalSource is Rectangle))// выбран режим выделения { int i = 0; for (i = 0; i < map.Lands.Count; i++) // находим индекс нашей фигуры в списке map.Lands { if (Geometry.Figures.Intersect.IsIntersected(point, map.Lands[i].Polygon)) { break; } } Shape shape = e.OriginalSource as Shape; if (Drawer.SelectedShapes.Contains(shape)) // если фигура уже выделена, то снимаем выделение { shape.StrokeThickness = 0; Drawer.SelectedShapes.Remove(shape); Drawer.SelectedLands.Remove(map.Lands[i]); } else // иначе выделяем её { Drawer.SelectedShapes.Add(shape); shape.Stroke = new SolidColorBrush(Colors.Red); shape.StrokeThickness = 3; Drawer.SelectedLands.Add(map.Lands[i]); //!! } } else { Drawer.ClickedPoints.Add(point); var radius = UserInterface.Transformer.ConvertToModelLength(6); Geometry.Figures.Circle circle = new Geometry.Figures.Circle(point, radius); UserInterface.Presenters.FigurePresenter FP = new UserInterface.Presenters.FigurePresenter(circle, null); UI.GamePresenter.Map.Figures.Add(FP); // после этих строк точки можно ставить не везде Geometry.Figures.Polyline polyline = new Geometry.Figures.Polyline(Drawer.ClickedPoints); Drawer.Line = new UserInterface.Presenters.FigurePresenter(polyline, null); UI.GamePresenter.Map.Figures.Add(Drawer.Line); reDrawMap(); } } }
// Пересечение круга и круга public static bool IsIntersected(Circle circlef, Circle circlel) { if (Point.Length(circlef.Center, circlel.Center) <= circlef.Radius + circlel.Radius) return true; else return false; }
// Пересечение точки и круга public static bool IsIntersected(Point point, Circle circle) { if (Point.Length(point, circle.Center) <= circle.Radius) return true; else return false; }
//public static List<Point> GetIntersection(ConvexPolygon polygon, Segment segment) //{ //} // Пересечение отрезка и круга public static List<Point> GetIntersection(Segment segment, Circle circle) { double a, b, t, diskr; Point vector = new Point(segment.End.X - segment.Begin.X, segment.End.Y - segment.Begin.Y); t = Math.Pow(circle.Radius, 2) - Math.Pow(circle.Center.X, 2) - Math.Pow(circle.Center.Y, 2); t = t - segment.Begin.X * segment.Begin.X - segment.Begin.Y * segment.Begin.Y + 2 * vector.X * circle.Center.X + 2 * vector.Y * circle.Center.Y; a = vector.X + vector.Y; b = segment.Begin.X * vector.X + segment.Begin.Y * vector.Y - vector.X * circle.Center.X - vector.Y * circle.Center.Y; diskr = b * b - 4 * a * t; if (diskr < 0) return new List<Point>(); else if (diskr == 0) { double k;// Коэффицент при векторе k = -(b / (2 * a)); if ((k > 0) || (k < 1)) return new List<Point> { new Point(segment.Begin.X + vector.X * k, segment.Begin.Y + vector.Y * k) }; else return new List<Point>(); } else { double k1, k2; k1 = (-b - diskr) / (2 * a); k2 = (diskr - b) / (2 * a); Point point1 = new Point(segment.Begin.X + k1 * vector.X, segment.Begin.Y + k1 * vector.Y); Point point2 = new Point(segment.Begin.X + k2 * vector.X, segment.Begin.Y + k2 * vector.Y); List<Point> spisk = new List<Point>(); if ((k1 > 0) || (k1 < 1)) spisk.Add(point1); if ((k2 > 0) || (k2 < 1)) spisk.Add(point2); return spisk; } }
// Пересечение отрезка и круга private static bool IsIntersected(Segment segment, Circle circle) { return GetIntersection(segment, circle).Count > 0; }
// Пересечение полигона и круга public static bool IsIntersected(ConvexPolygon polygon, Circle circle) { var segments = Polyline.PointsToSegments(polygon.Points); foreach (var segment in segments) { if (IsIntersected(segment, circle)) return true; } return false; }