Exemple #1
0
 // Поиск пересечения отрезков
 //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();
                }
            }
        }
Exemple #3
0
 // Пересечение круга и круга
 public static bool IsIntersected(Circle circlef, Circle circlel)
 {
     if (Point.Length(circlef.Center, circlel.Center) <= circlef.Radius + circlel.Radius)
         return true;
     else return false;
 }
Exemple #4
0
 // Пересечение точки и круга
 public static bool IsIntersected(Point point, Circle circle)
 {
     if (Point.Length(point, circle.Center) <= circle.Radius) return true;
     else return false;
 }
Exemple #5
0
 //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;
     }
 }
Exemple #6
0
 // Пересечение отрезка и круга
 private static bool IsIntersected(Segment segment, Circle circle)
 {
     return GetIntersection(segment, circle).Count > 0;
 }
Exemple #7
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;
 }