Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        private Pair <IList <double>, IList <WW.Math.Point3D> > method_14()
        {
            Pair <IList <double>, IList <WW.Math.Point3D> > pair;

            if (!(this.vector3D_1 == Vector3D.Zero) && !(this.vector3D_2 == Vector3D.Zero))
            {
                pair = DxfSpline.smethod_5(this.knotParameterization_0, (IList <WW.Math.Point3D>) this.list_3, this.vector3D_1, this.vector3D_2);
            }
            else
            {
                switch (this.list_3.Count)
                {
                case 2:
                    pair = DxfSpline.smethod_2(this.knotParameterization_0, (IList <WW.Math.Point3D>) this.list_3);
                    break;

                case 3:
                    pair = DxfSpline.smethod_3(this.knotParameterization_0, (IList <WW.Math.Point3D>) this.list_3);
                    break;

                default:
                    pair = DxfSpline.smethod_4(this.knotParameterization_0, (IList <WW.Math.Point3D>) this.list_3);
                    break;
                }
            }
            return(pair);
        }
Exemplo n.º 4
0
        public override IGraphCloneable Clone(CloneContext cloneContext)
        {
            DxfSpline dxfSpline = (DxfSpline)cloneContext.GetExistingClone((IGraphCloneable)this);

            if (dxfSpline == null)
            {
                dxfSpline = new DxfSpline();
                cloneContext.RegisterClone((IGraphCloneable)this, (IGraphCloneable)dxfSpline);
                dxfSpline.CopyFrom((DxfHandledObject)this, cloneContext);
            }
            return((IGraphCloneable)dxfSpline);
        }
Exemplo n.º 5
0
        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));
        }
Exemplo n.º 6
0
        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)));
        }
Exemplo n.º 7
0
        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));
        }
Exemplo n.º 8
0
        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;
        }
Exemplo n.º 9
0
        internal static Polyline3D smethod_3(
            DrawContext context,
            ILeader leader,
            IList <WW.Math.Point3D> vertices)
        {
            Vector3D startDerivative;
            Vector3D endDerivative;
            IList <WW.Math.Point3D> points = DxfLeader.smethod_2(vertices, leader, out startDerivative, out endDerivative);

            if (points == null)
            {
                return((Polyline3D)null);
            }
            int        num        = leader.HasHookLine ? 1 : 0;
            Polyline3D polyline3D = (Polyline3D)null;

            if (leader.IsSpline && points.Count >= 2)
            {
                DxfSpline dxfSpline = new DxfSpline();
                dxfSpline.Degree       = 3;
                dxfSpline.StartTangent = startDerivative;
                dxfSpline.EndTangent   = endDerivative;
                dxfSpline.FitPoints.AddRange((IEnumerable <WW.Math.Point3D>)points);
                if (dxfSpline.UpdateSplineFromFitPoints())
                {
                    polyline3D = dxfSpline.method_15((int)context.Config.NoOfSplineLineSegments);
                }
            }
            if (polyline3D == null)
            {
                polyline3D = new Polyline3D(points.Count + num);
                polyline3D.AddRange((IEnumerable <WW.Math.Point3D>)points);
            }
            if (leader.HasHookLine)
            {
                leader.imethod_0(context, points, (IList <WW.Math.Point3D>)polyline3D);
            }
            return(polyline3D);
        }
Exemplo n.º 10
0
 public virtual void Visit(DxfSpline spline)
 {
 }
Exemplo n.º 11
0
 public virtual void Visit(DxfSpline spline)
 {
     this.VisitEntity((DxfEntity)spline);
 }
Exemplo n.º 12
0
 private static IList <double> smethod_6(
     KnotParameterization parameterization,
     IList <WW.Math.Point3D> points)
 {
     return(DxfSpline.smethod_7(DxfSpline.smethod_8(parameterization, points)));
 }