private ParametrsEllipse SearchEllipse(Triangle triangle) { ParametrsEllipse param = new ParametrsEllipse(); PointF point1 = triangle.point1; PointF point2 = triangle.point2; PointF point3 = triangle.point3; if ((triangle.point1.X == triangle.point2.X && triangle.point2.X == triangle.point3.X || triangle.point1.Y == triangle.point2.Y && triangle.point2.Y == triangle.point3.Y) || (triangle.point1 == triangle.point2 || triangle.point1 == triangle.point3 || triangle.point3 == triangle.point2)) { param.center.X = 1e+6f; param.center.Y = 1e+6f; param.R = 1e+6f; } else { param.center.X = (float)(((point2.X * point2.X - point1.X * point1.X + point2.Y * point2.Y - point1.Y * point1.Y) * (point3.Y - point1.Y) - (point3.X * point3.X - point1.X * point1.X + point3.Y * point3.Y - point1.Y * point1.Y) * (point2.Y - point1.Y)) / (2 * ((point2.X - point1.X) * (point3.Y - point1.Y) - (point3.X - point1.X) * (point2.Y - point1.Y)))); param.center.Y = (float)(((point3.X * point3.X - point1.X * point1.X + point3.Y * point3.Y - point1.Y * point1.Y) * (point2.X - point1.X) - (point2.X * point2.X - point1.X * point1.X + point2.Y * point2.Y - point1.Y * point1.Y) * (point3.X - point1.X)) / (2 * ((point2.X - point1.X) * (point3.Y - point1.Y) - (point3.X - point1.X) * (point2.Y - point1.Y)))); param.R = Math.Sqrt((param.center.X - point1.X) * (param.center.X - point1.X) + (param.center.Y - point1.Y) * (param.center.Y - point1.Y)); } return(param); }
public List <Triangle> ReturnAllTriangles(List <PointF> p_points) { List <Triangle> list_trianglesBuf = new List <Triangle>(); int count = p_points.Count; for (int i = 0; i < count - 2; i++) { for (int j = i + 1; j < count - 1; j++) { for (int k = j + 1; k < count; k++) { Triangle triangle = new Triangle(); ParametrsEllipse param = new ParametrsEllipse(); triangle.point1 = p_points[i]; triangle.point2 = p_points[j]; triangle.point3 = p_points[k]; param = SearchEllipse(triangle); bool isOk = true; for (int n = 0; n < count; n++) { if ((n == i) || (n == j) || (n == k)) { continue; } float distance = (float)Math.Sqrt((p_points[n].X - param.center.X) * (p_points[n].X - param.center.X) + (p_points[n].Y - param.center.Y) * (p_points[n].Y - param.center.Y)); if (((distance <= param.R)) || (distance > 1e+6) || (param.R > 1e+6)) { isOk = false; break; } ; } if (isOk) { list_trianglesBuf.Add(triangle); } } } } return(list_trianglesBuf); }
public List <Triangle> AddPoint(PointF point) { if (!IsInMagnets(point)) { Potential pot = new Potential { point = point, value = 0 }; unknownPotential.Add(pot); List <PointF> newPoints = new List <PointF>(); newPoints.Add(point); int numDeleting = 0; while (numDeleting < list_triangle.Count) { bool detected = false; numDeleting = 0; int size_triangle = list_triangle.Count; for (int i = 0; i < size_triangle; i++) { Triangle triangle = list_triangle[i]; bool IsInMagnet = false; foreach (PointF bufPoint in FakePoints) { if ((triangle.point1 == bufPoint) || (triangle.point2 == bufPoint) || (triangle.point3 == bufPoint)) { IsInMagnet = true; break; } } if (!IsInMagnet) { ParametrsEllipse param = new ParametrsEllipse(); param = SearchEllipse(triangle); float distance = (float)Math.Sqrt((point.X - param.center.X) * (point.X - param.center.X) + (point.Y - param.center.Y) * (point.Y - param.center.Y)); if (distance < param.R && param.R < 1e+6) { bool new1 = true, new2 = true, new3 = true; foreach (PointF bufPoint in newPoints) { if (triangle.point1 == bufPoint) { new1 = false; } if (triangle.point2 == bufPoint) { new2 = false; } if (triangle.point3 == bufPoint) { new3 = false; } } if (new1) { newPoints.Add(triangle.point1); } if (new2) { newPoints.Add(triangle.point2); } if (new3) { newPoints.Add(triangle.point3); } detected = true; break; } } numDeleting++; } if (detected) { list_triangle.RemoveAt(numDeleting); } } List <Triangle> buffer_list2 = new List <Triangle>(); buffer_list2.AddRange(ReturnAllTriangles(newPoints)); numDeleting = 0; while (numDeleting < buffer_list2.Count) { bool detected = false; numDeleting = 0; foreach (Triangle triangle in buffer_list2) { if (!((triangle.point1 == point) || (triangle.point2 == point) || (triangle.point3 == point))) { detected = true; break; } numDeleting++; } if (detected) { buffer_list2.RemoveAt(numDeleting); } } return(UpdateListTriangle(buffer_list2)); } else { return(list_triangle); } }