/// <summary> /// Optimise the size of the spheres. /// </summary> private static void OptimiseFittedSphere(List<StructureSphere> spheres, DiabolicalModel aModel, MainForm form) { form.ShowStatus("Optimise Sphere Sizes..."); Triangle tri = new Triangle(); List<Vector3> points = new List<Vector3>(); for (int s = 0; s < spheres.Count; s++) { points.Clear(); for (int t = 0; t < spheres[s].IDs.Count; t++) { aModel.GetTriangle(ref t, ref tri); points.AddRange(tri.PointsInsideSphere(spheres[s].Sphere)); } if (points.Count > 0) { spheres[s].RePosition(SmallestToFit(points)); } } }
/// <summary> /// Used for filling and refilling spheres. /// The triangle ID is added to the list within each smaller sphere. /// </summary> private static void FillWithTriangles(List<StructureSphere> spheres, DiabolicalModel aModel, MainForm form) { int status = 0; Triangle tri = new Triangle(); bool result = false; BoundingSphere bound; int count = aModel.CountTriangles(); for (int t = 0; t < count; t++) { status++; if (status > 33) { status = 0; form.ShowStatus("Fill with triangle: " + t.ToString()); } aModel.GetTriangle(ref t, ref tri); for (int s = 0; s < spheres.Count; s++) { bound = spheres[s].Sphere; tri.Intersects(ref bound, out result); if (result) { spheres[s].IDs.Add(t); } } } }