public bool?DotAdd(Dot dot) { int dotsCount = dots.Count; if (dotsCount > 0) { if (PrimitivesMath.DotsEqual(dot, dots[0])) { throw new PolygonException(this, "Ошибка. Попытка создания точки полигона на месте уже созданной."); } Segment segNew = new Segment(dots[dotsCount - 1], dot); Segment seg = new Segment(); for (int i = 0; i < dotsCount - 1; i++) { seg.Set(dots[i], dots[i + 1]); if (PrimitivesMath.DotOnSegment(dot, seg)) { throw new PolygonException(this, "Ошибка. Попытка создания точки полигона на уже созданной границе."); } if (PrimitivesMath.SegmentsCrossing(seg, segNew)) { throw new PolygonException(this, "Ошибка. Попытка создания границы полигона образующей пересечения с уже созданными границами."); } } } dots.Add(dot); if (dots.Count >= 3) { isEnoughDots = true; } return(true); }/*
public bool?TestDotOnPolygon(Dot dot0) // Тестирование нахождения точки в полигоне. { if ((!IsEnoughDots) || (borders.Count < 3)) { return(null); } foreach (Segment seg in borders) { if (PrimitivesMath.DotOnSegment(dot0, seg)) { return(true); // Проверка нахождения точки на границах полигона. } } int i, dotsCount = dots.Count; double CrossProd, DotProd, ratioDotToPolygon = 0; // Вычисляемый коэффициент для определения нахождения точки на полигоне. Если ~|2Pi|, то точка на полигоне, если ~0, то точка вне. List <VectorDot1> vectorsTest = new List <VectorDot1>(dotsCount); // Список векторов для тестирования нахождения точки на полигоне. for (i = 0; i < dotsCount; ++i) { vectorsTest.Add(PrimitivesMath.MakeVectorDot1(dot0, dots[i])); } for (i = 0; i < dotsCount; ++i) { CrossProd = PrimitivesMath.CrossProduct(vectorsTest[i], vectorsTest[(i + 1) % dotsCount]); DotProd = PrimitivesMath.DotProduct(vectorsTest[i], vectorsTest[(i + 1) % dotsCount]); ratioDotToPolygon += Math.Atan2(CrossProd, DotProd); } //Console.WriteLine($"{ratioDotToPolygon}"); if ((int)ratioDotToPolygon == 0) { return(false); } return(true); }