예제 #1
0
        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);
        }