示例#1
0
文件: DxfSpline.cs 项目: 15831944/WW
        internal static Pair <IList <double>, IList <WW.Math.Point3D> > smethod_3(
            KnotParameterization parameterization,
            IList <WW.Math.Point3D> points)
        {
            IList <double> uBar       = DxfSpline.smethod_8(parameterization, points);
            IList <double> doubleList = DxfSpline.smethod_7(uBar);
            BSplineD       bsplineD   = new BSplineD(3, doubleList);

            double[] result = new double[4];
            bsplineD.EvaluateBasisFunctions(4, doubleList[4], result);
            double   num1                  = uBar[1] - uBar[0];
            double   num2                  = uBar[2] - uBar[1];
            Vector3D point1                = (Vector3D)points[0];
            Vector3D point2                = (Vector3D)points[1];
            Vector3D point3                = (Vector3D)points[2];
            Vector3D vector3D1             = (point2 - point1 * (result[0] * (num1 + num2) / (2.0 * num1 + num2)) - point3 * (result[2] * (num1 + num2) / (num1 + 2.0 * num2))) / (result[0] * num1 / (2.0 * num1 + num2) + result[1] + result[2] * num2 / (num1 + 2.0 * num2));
            Vector3D vector3D2             = vector3D1 - point1;
            Vector3D vector3D3             = vector3D1 - point3;
            IList <WW.Math.Point3D> second = (IList <WW.Math.Point3D>) new List <WW.Math.Point3D>()
            {
                points[0], (WW.Math.Point3D)point1 + vector3D2 * (num1 / (2.0 * num1 + num2)), (WW.Math.Point3D)vector3D1, (WW.Math.Point3D)point3 + vector3D3 * (num2 / (num1 + 2.0 * num2)), points[2]
            };

            return(new Pair <IList <double>, IList <WW.Math.Point3D> >(doubleList, second));
        }
示例#2
0
文件: DxfSpline.cs 项目: 15831944/WW
        private static IList <double> smethod_8(
            KnotParameterization parameterization,
            IList <WW.Math.Point3D> points)
        {
            IList <double> doubleList;

            switch (parameterization)
            {
            case KnotParameterization.Chord:
                doubleList = DxfSpline.smethod_10(points);
                break;

            case KnotParameterization.SquareRoot:
                doubleList = DxfSpline.smethod_11(points);
                break;

            case KnotParameterization.Uniform:
                doubleList = DxfSpline.smethod_12(points.Count);
                break;

            default:
                throw new ArgumentException("Unsupported knot parametrization: " + (object)parameterization);
            }
            return(doubleList);
        }
示例#3
0
文件: DxfSpline.cs 项目: 15831944/WW
        internal static Pair <IList <double>, IList <WW.Math.Point3D> > smethod_2(
            KnotParameterization parameterization,
            IList <WW.Math.Point3D> points)
        {
            IList <double>          first    = DxfSpline.smethod_7(DxfSpline.smethod_8(parameterization, points));
            Vector3D                vector3D = (points[1] - points[0]) / 3.0;
            IList <WW.Math.Point3D> second   = (IList <WW.Math.Point3D>) new List <WW.Math.Point3D>()
            {
                points[0], points[0] + vector3D, points[1] - vector3D, points[1]
            };

            return(new Pair <IList <double>, IList <WW.Math.Point3D> >(first, second));
        }
示例#4
0
文件: DxfSpline.cs 项目: 15831944/WW
        internal static Pair <IList <double>, IList <WW.Math.Point3D> > smethod_5(
            KnotParameterization parameterization,
            IList <WW.Math.Point3D> points,
            Vector3D start,
            Vector3D end)
        {
            if (points.Count < 2)
            {
                throw new ArgumentException("Not enough fit points, need at least 2!");
            }
            IList <double> doubleList = DxfSpline.smethod_6(parameterization, points);

            return(new Pair <IList <double>, IList <WW.Math.Point3D> >(doubleList, DxfSpline.smethod_9(doubleList, points, start, end)));
        }
示例#5
0
文件: DxfSpline.cs 项目: 15831944/WW
        internal static Pair <IList <double>, IList <WW.Math.Point3D> > smethod_4(
            KnotParameterization parameterization,
            IList <WW.Math.Point3D> points)
        {
            if (points.Count < 4)
            {
                throw new ArgumentException("Not enough fit points, need at least 4!");
            }
            IList <double>          uBar       = DxfSpline.smethod_8(parameterization, points);
            int                     index      = uBar.Count - 1;
            IList <double>          doubleList = DxfSpline.smethod_7(uBar);
            double                  num1       = 3.0 / (uBar[1] - uBar[0]);
            Vector3D                start      = num1 * (1.0 * (points[1] - points[0]) - 0.5 * (points[2] - points[1]));
            double                  num2       = 3.0 / (uBar[index] - uBar[index - 1]);
            Vector3D                end        = num2 * (1.0 * (points[index] - points[index - 1]) - 0.5 * (points[index - 1] - points[index - 2]));
            double                  num3       = 1.0 / start.GetLengthSquared();
            double                  num4       = 1.0 / end.GetLengthSquared();
            double                  num5       = (uBar[1] + uBar[2] - 2.0 * uBar[0]) / (uBar[1] - uBar[0]);
            double                  num6       = (2.0 * uBar[index] - uBar[index - 1] - uBar[index - 2]) / (uBar[index] - uBar[index - 1]);
            double                  num7       = 8.98846567431158E+307;
            double                  num8       = 8.98846567431158E+307;
            int                     num9       = 1024;
            IList <WW.Math.Point3D> second     = (IList <WW.Math.Point3D>)null;

            while (num7 + num8 > 1E-19)
            {
                Vector3D vector3D1 = start;
                Vector3D vector3D2 = end;
                second = DxfSpline.smethod_9(doubleList, points, start, end);
                WW.Math.Point3D point3D1 = second[0];
                WW.Math.Point3D point3D2 = second[1];
                WW.Math.Point3D point3D3 = second[2];
                start = 0.5 * (point3D2 - point3D1 + (point3D3 - point3D1) / num5) * num1;
                num7  = num3 * (start - vector3D1).GetLengthSquared();
                WW.Math.Point3D point3D4 = second[second.Count - 1];
                WW.Math.Point3D point3D5 = second[second.Count - 2];
                WW.Math.Point3D point3D6 = second[second.Count - 3];
                end  = 0.5 * (point3D4 - point3D5 + (point3D4 - point3D6) / num6) * num2;
                num8 = num4 * (end - vector3D2).GetLengthSquared();
                if (--num9 <= 0)
                {
                    throw new Exception("Cannot determine spline interpolation!");
                }
            }
            return(new Pair <IList <double>, IList <WW.Math.Point3D> >(doubleList, second));
        }
示例#6
0
文件: DxfSpline.cs 项目: 15831944/WW
        public override void CopyFrom(DxfHandledObject from, CloneContext cloneContext)
        {
            base.CopyFrom(from, cloneContext);
            DxfSpline dxfSpline = (DxfSpline)from;

            this.splineFlags_0 = dxfSpline.splineFlags_0;
            this.vector3D_0    = dxfSpline.vector3D_0;
            this.int_0         = dxfSpline.int_0;
            this.double_1      = dxfSpline.double_1;
            this.double_2      = dxfSpline.double_2;
            this.double_3      = dxfSpline.double_3;
            this.vector3D_1    = dxfSpline.vector3D_1;
            this.vector3D_2    = dxfSpline.vector3D_2;
            this.list_0.AddRange((IEnumerable <double>)dxfSpline.list_0);
            this.list_1.AddRange((IEnumerable <double>)dxfSpline.list_1);
            this.list_2.AddRange((IEnumerable <WW.Math.Point3D>)dxfSpline.list_2);
            this.list_3.AddRange((IEnumerable <WW.Math.Point3D>)dxfSpline.list_3);
            this.splineFlags1_0         = dxfSpline.splineFlags1_0;
            this.knotParameterization_0 = dxfSpline.knotParameterization_0;
        }
示例#7
0
文件: DxfSpline.cs 项目: 15831944/WW
 private static IList <double> smethod_6(
     KnotParameterization parameterization,
     IList <WW.Math.Point3D> points)
 {
     return(DxfSpline.smethod_7(DxfSpline.smethod_8(parameterization, points)));
 }