コード例 #1
0
        public static Point3D Evaluate3DPolynomial(
            IList <Point3D> control,
            double parameter
            )
        {
            var solver = new DeCastlejauSolver(
                BezierCurveC0.FillBernsteinCoordinatesArray(
                    control,
                    control.Count - 1,
                    0
                    )
                );

            return(MathHelpers.MakePoint3D(solver.Evaluate(parameter)));
        }
コード例 #2
0
        private void SaveToFile(string filename)
        {
            var serializer = new GM1.Serialization.XMLSerializer();
            var scene      = new Scene();

            var ptCount = points.Count + hiddenPoints.Count;

            scene.Points = new GM1.Serialization.Point[ptCount];
            int i = 0;

            foreach (var catPoint in points)
            {
                scene.Points[i] = new GM1.Serialization.Point()
                {
                    Position = catPoint.Position.ToShitpoint(), Name = catPoint.Name
                };
                catPoint.SerializationId = i;
                i++;
            }
            List <BezierCurveC0> beziersc0 = new List <BezierCurveC0>();
            List <BezierCurveC2> beziersc2 = new List <BezierCurveC2>();
            List <InterpolationBezierCurveC2>     interpolators = new List <InterpolationBezierCurveC2>();
            List <BezierSurfaceC0>                surfacesc0    = new List <BezierSurfaceC0>();
            List <BezierSurfaceC2>                surfacesc2    = new List <BezierSurfaceC2>();
            List <GM1.Serialization.CuttingCurve> cuttingCurves = new List <GM1.Serialization.CuttingCurve>();

            foreach (var model in models)
            {
                var type = model.GetType();
                if (type == typeof(Bezier))
                {
                    var bezier      = model as Bezier;
                    var sceneBezier = new BezierCurveC0
                    {
                        Name                    = bezier.Name,
                        DisplayPolygon          = bezier.ShowPolygon,
                        DisplayPolygonSpecified = true,
                        Points                  = bezier.Points.Select(x => x.Point.SerializationId).ToArray()
                    };
                    beziersc0.Add(sceneBezier);
                }
                else if (type == typeof(GeometryModels.CuttingCurve))
                {
                    var cr  = model as GeometryModels.CuttingCurve;
                    var ccr = new GM1.Serialization.CuttingCurve
                    {
                        Name   = cr.Name,
                        S1     = "no data",
                        S2     = "no data",
                        Points = cr.Points.Select(x =>
                        {
                            var a = new GM1.Serialization.Vector4();
                            a.X   = (float)x.X;
                            a.Y   = (float)x.Y;
                            a.Z   = (float)x.Z;
                            a.W   = (float)x.W;
                            return(a);
                        }).ToArray()
                    };
                    cuttingCurves.Add(ccr);
                }
                else if (type == typeof(BezierC2))
                {
                    var bezier      = model as BezierC2;
                    var sceneBezier = new BezierCurveC2
                    {
                        Name                    = bezier.Name,
                        DisplayPolygon          = bezier.ShowPolygon,
                        DisplayPolygonSpecified = true,
                        Points                  = bezier.Points.Select(x => x.Point.SerializationId).ToArray()
                    };
                    beziersc2.Add(sceneBezier);
                }
                else if (type == typeof(BsplineInterpolator))
                {
                    var interpolationBezier = model as BsplineInterpolator;
                    var sceneBezier         = new InterpolationBezierCurveC2()
                    {
                        Name                    = interpolationBezier.Name,
                        DisplayPolygon          = interpolationBezier.ShowPolygon,
                        DisplayPolygonSpecified = true,
                        Points                  = interpolationBezier.Points.Select(x => x.Point.SerializationId).ToArray()
                    };
                    interpolators.Add(sceneBezier);
                }
                else if (type == typeof(Surface))
                {
                    var surface = model as Surface;

                    switch (surface.SurfaceType)
                    {
                    case SurfaceType.Bezier:
                        var bezierSurf = new BezierSurfaceC0();
                        bezierSurf.Name     = surface.Name;
                        bezierSurf.PatchesU = surface.PatchesU;
                        bezierSurf.PatchesV = surface.PatchesV;
                        var ptchs = new List <BezierSurfaceC0Patch>();
                        foreach (var patch in surface.GetPatches().Cast <BezierPatch>())
                        {
                            var scenePatch = new BezierSurfaceC0Patch()
                            {
                                Name = patch.Name,
                                SurfaceDivisionsU = patch.WidthDiv,
                                SurfaceDivisionsV = patch.HeightDiv,
                                PatchV            = patch.VPos,
                                PatchU            = patch.UPos,
                                Points            = new PointsU4V4()
                            };
                            int ind = 0;
                            foreach (var pt in patch.EnumerateCatPoints().Select(x => x.SerializationId))
                            {
                                scenePatch.Points[ind] = pt;
                                ind++;
                            }
                            ptchs.Add(scenePatch);
                        }
                        bezierSurf.Patches = ptchs.ToArray();
                        surfacesc0.Add(bezierSurf);

                        break;

                    case SurfaceType.BSpline:
                        var sceneSurf = new BezierSurfaceC2();
                        sceneSurf.Name     = surface.Name;
                        sceneSurf.PatchesU = surface.PatchesU;
                        sceneSurf.PatchesV = surface.PatchesV;
                        var ptch = new List <BezierSurfaceC2Patch>();
                        foreach (var patch in surface.GetPatches().Cast <BSplinePatch>())
                        {
                            var scenePatch = new BezierSurfaceC2Patch()
                            {
                                Name = patch.Name,
                                SurfaceDivisionsU = patch.WidthDiv,
                                SurfaceDivisionsV = patch.HeightDiv,
                                PatchU            = patch.UPos,
                                PatchV            = patch.VPos,
                                Points            = new PointsU4V4()
                            };
                            int ind = 0;
                            foreach (var pt in patch.EnumerateCatPoints().Select(x => x.SerializationId))
                            {
                                scenePatch.Points[ind] = pt;
                                ind++;
                            }
                            ptch.Add(scenePatch);
                        }
                        sceneSurf.Patches = ptch.ToArray();
                        surfacesc2.Add(sceneSurf);

                        break;

                    case SurfaceType.Nurbs:
                        break;

                    default:
                        break;
                    }
                }
            }

            scene.BezierSurfacesC0            = surfacesc0.ToArray();
            scene.BezierSurfacesC2            = surfacesc2.ToArray();
            scene.BezierCurvesC0              = beziersc0.ToArray();
            scene.BezierCurvesC2              = beziersc2.ToArray();
            scene.InterpolationBezierCurvesC2 = interpolators.ToArray();
            scene.CuttingCurves = cuttingCurves.ToArray();

            serializer.SerializeToFile(filename, scene);
        }