예제 #1
0
        /// <summary>
        /// 在两条线之间生成指定数量的曲线
        /// </summary>
        /// <param name="curve1">第一条</param>
        /// <param name="curve2">第二条</param>
        /// <param name="number">数量</param>
        /// <param name="accuracy">精度,如是直线和忽略</param>
        /// <param name="contain">是否包含起始</param>
        /// <returns>生成的曲线</returns>
        public static List <Curve> ByBetweenTwoCurves(Curve curve1, Curve curve2, int number, int accuracy = 2, bool contain = false)
        {
            List <Curve> outCurves = new List <Curve>();
            int          n         = number;

            if (!contain)
            {
                n = number + 2;
            }
            double[] parameters = new double[n];
            for (int i = 0; i < n; i++)
            {
                if (i == n)
                {
                    parameters[i] = 1;
                }
                else
                {
                    parameters[i] = i * (1.0 / (n - 1));
                }
            }
            // 如果为Line
            if ((curve1 as Line) != null && (curve2 as Line) != null)
            {
                if (!DetermineDirection(curve1, curve2))
                {
                    curve2 = curve2.Reverse();
                }
                var          line1   = Line.ByStartPointEndPoint(curve1.StartPoint, curve2.StartPoint);
                var          line2   = Line.ByStartPointEndPoint(curve1.EndPoint, curve2.EndPoint);
                List <Point> ptList1 = new List <Point>();
                List <Point> ptList2 = new List <Point>();

                foreach (var i in parameters)
                {
                    ptList1.Add(line1.PointAtParameter(i));
                    ptList2.Add(line2.PointAtParameter(i));
                }

                for (int i = 0; i < n; i++)
                {
                    var crv = Line.ByStartPointEndPoint(ptList1[i], ptList2[i]);
                    outCurves.Add(crv);
                }
            }
            // 如果为PolyCurve
            else if ((curve1 as PolyCurve) != null || (curve2 as PolyCurve) != null)
            {
                throw new Exception("暂不支持PolyCurve!");
            }
            else
            {
                List <Curve> crossCurves = new List <Curve>()
                {
                    curve1, curve2
                };
                Surface surface = Surface.ByLoft(crossCurves);
                outCurves = ByAlongSurface(surface, number, accuracy, 0);
                surface.Dispose();
            }
            if (!contain)
            {
                outCurves.RemoveAt(0);
                outCurves.RemoveAt(outCurves.Count - 1);
            }
            return(outCurves);
        }