示例#1
0
        public Data(FindIntersectionsCommand command)
        {
            Guid          = command.Guid;
            Curve1        = new CurveTable();
            Curve1.Name   = command.Curve1.Name;
            Curve1.Points = new List <PointTable>();
            foreach (var i in command.Curve1.Points)
            {
                Curve1.Points.Add(new PointTable()
                {
                    X = i.X, Y = i.Y
                });
            }

            Curve2        = new CurveTable();
            Curve2.Name   = command.Curve2.Name;
            Curve2.Points = new List <PointTable>();
            foreach (var i in command.Curve2.Points)
            {
                Curve2.Points.Add(new PointTable()
                {
                    X = i.X, Y = i.Y
                });
            }
        }
        //Функция ищет пересечения двух ломанных
        public static CurveIntersections FindItersections(FindIntersectionsCommand command)
        {
            //Точки кривых
            List <Point> pointCurve1 = command.Curve1.Points.ToList();
            List <Point> pointCurve2 = command.Curve2.Points.ToList();
            //Точки пересечений
            List <Point> pointIntersection = new List <Point>();

            //если одна из линий представляет собой 1 точку, то пересечений ЛИНИЙ не будет.
            //if (pointCurve1.Count < 2 || pointCurve2.Count < 2) { return null; }

            for (int i = 0; i < pointCurve1.Count - 1; i++)
            {
                var line1 = getLine(pointCurve1[i], pointCurve1[i + 1]);
                for (int j = 0; j < pointCurve2.Count - 1; j++)
                {
                    var line2      = getLine(pointCurve2[j], pointCurve2[j + 1]);
                    var pointInter = getIntersectionLine(line1, line2);
                    if (pointInter != null)
                    {
                        if (pointIntersection.Count == 0)
                        {
                            pointIntersection.Add(pointInter);
                        }
                        //чтоб не попали дубли точек
                        else if (!pointIntersection.Any(p => p.X == pointInter.X && p.Y == pointInter.Y))
                        {
                            pointIntersection.Add(pointInter);
                        }
                    }
                    ;
                }
            }

            return(new CurveIntersections()
            {
                Points = pointIntersection
            });
        }
        public async Task <ActionResult <CurveIntersections> > Post(FindIntersectionsCommand command)
        {
            //Получаем точки пересечения
            var intersactionPoint = FindItersections(command);

            var insertData = new Data(command);

            insertData.PointIntersaction = new List <PointTable>();
            foreach (var i in intersactionPoint.Points)
            {
                insertData.PointIntersaction.Add(new PointTable()
                {
                    X = i.X, Y = i.Y
                });
            }

            try
            {
                var existData = await db.DataTable.Include(c1 => c1.Curve1.Points).Include(c2 => c2.Curve2.Points)
                                .Include(p => p.PointIntersaction)
                                .FirstOrDefaultAsync(x => x.Guid == command.Guid);

                if (existData is null)
                {
                    db.DataTable.Add(insertData);
                }
                else
                {
                    //вычистим старые данные
                    foreach (var i in existData.PointIntersaction)
                    {
                        db.Points.Remove(db.Points.Where(x => x.Id == i.Id).SingleOrDefault());
                    }

                    foreach (var i in existData.Curve1.Points)
                    {
                        db.Points.Remove(db.Points.Where(x => x.Id == i.Id).SingleOrDefault());
                    }

                    foreach (var i in existData.Curve2.Points)
                    {
                        db.Points.Remove(db.Points.Where(x => x.Id == i.Id).SingleOrDefault());
                    }

                    db.Curves.Remove(db.Curves.Where(x => x.Id == existData.Curve1.Id).SingleOrDefault());
                    db.Curves.Remove(db.Curves.Where(x => x.Id == existData.Curve2.Id).SingleOrDefault());
                    db.DataTable.Remove(db.DataTable.Where(x => x.Guid == existData.Guid).SingleOrDefault());

                    //добавим новые
                    db.DataTable.Add(insertData);
                }

                await db.SaveChangesAsync();

                return(intersactionPoint);
            }
            catch
            {
                db.Dispose();
                return(BadRequest());
            }
        }