Пример #1
0
        public static List <Curve> BestSplitterCurves(List <Brep> zones, List <Curve> circ, Curve core)
        {
            int numZones      = zones.Count;
            int numCircCurves = circ.Count;

            List <Curve> splitterCurves = new List <Curve>();

            for (int i = 0; i < numZones; i++)
            {
                int validCircCurves = 0;

                List <bool>   intersects           = new List <bool>();
                List <double> intersectionInterval = new List <double>();

                //RhinoApp.WriteLine("---");

                for (int j = 0; j < numCircCurves; j++)
                {
                    if (Confirm.CurveRegionIntersection(circ[j], zones[i]) && circ[j].Degree == 1)
                    {
                        //RhinoApp.WriteLine("Region intersection exists.");

                        validCircCurves++;
                        intersects.Add(true);

                        CurveIntersections csx = Intersection.CurveSurface(circ[j], zones[i].Surfaces[0], 0.1, 0.1);

                        //RhinoApp.WriteLine("--{0} csx event(s). (Overlap: {1})", csx.Count, csx[0].OverlapA.ToString());

                        intersectionInterval.Add(csx[0].OverlapA.T1 - csx[0].OverlapB.T0);
                    }
                    else
                    {
                        //RhinoApp.WriteLine("Region intersection does not exist.");

                        intersects.Add(false);

                        intersectionInterval.Add(0);
                    }
                }

                if (validCircCurves == 0)
                {
                    //RhinoApp.WriteLine("No circulation options.");

                    Curve newSplitCurve = Select.GenerateSplitCurve(zones[i], core);

                    splitterCurves.Add(newSplitCurve);
                }
                if (validCircCurves == 1)
                {
                    //RhinoApp.WriteLine("Only one option.");
                    splitterCurves.Add(circ[intersects.IndexOf(true)]);
                }
                else if (validCircCurves > 1)
                {
                    //RhinoApp.WriteLine(validCircCurves.ToString() + " options.");
                    splitterCurves.Add(circ[intersectionInterval.IndexOf(intersectionInterval.Max())]);
                }

                intersects.Clear();
                intersectionInterval.Clear();
            }

            return(splitterCurves);
        }