public Polyline MinimalBox(List <Point3d> x) { Grasshopper.Kernel.Geometry.Node2List list = new Grasshopper.Kernel.Geometry.Node2List(x); Polyline pl = Grasshopper.Kernel.Geometry.ConvexHull.Solver.ComputeHull(list); // List<Polyline> boxes = new List<Polyline>(); Polyline output = new Polyline(); double t = double.MaxValue; for (int i = 0; i < pl.Count - 1; i++) { Vector3d Xaxis = pl[i + 1] - pl[i]; Vector3d Yaxis = Vector3d.CrossProduct(Xaxis, Vector3d.ZAxis); Plane p = new Plane(pl[i], Xaxis, Yaxis); Polyline pl2 = new Polyline(pl); pl2.Transform(Transform.PlaneToPlane(p, Plane.WorldXY)); Rhino.Geometry.BoundingBox box = pl2.BoundingBox; Polyline pl3 = new Polyline(); pl3.Add(box.Corner(false, false, false)); pl3.Add(box.Corner(false, true, false)); pl3.Add(box.Corner(true, true, false)); pl3.Add(box.Corner(true, false, false)); pl3.Add(box.Corner(false, false, false)); double area = pl3[1].DistanceTo(pl3[0]) * pl3[1].DistanceTo(pl3[2]); if (area < t) { t = area; pl3.Transform(Transform.PlaneToPlane(Plane.WorldXY, p)); output = pl3; } // boxes.Add(pl3); } return(output); }