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